I have books split between my parents’ house and my house and sometimes I would like to check whether I have a certain book, in order that I can lend it to someone or read up on something specific. To make this process of finding books easier I decided to create a digital personal library catalogue. I decided to use BibTeX to construct the catalogue, because it’s a system I know pretty well from writing LaTeX research papers and keeping my bibliography of academic papers.
Other options I explored briefly before returning to BibTeX were:
- Calibre - primarily an e-book manager software, but which allows you to create records with no e-book attached which can be used for physical books.
- An SQL database.
- Libib - A web-app for managing a personal library, with paid options and options to export .csv.
- Goodreads - A free website to manage books read, similar to Libib from what I can tell, but very popular.
Apart from it being the option I was most confident in using, I also know that BibTeX .bib files are just plain text, so I know they will always be parse-able in the future. There is also a good amount of associated software for BibTeX files that has grown up around document formatting, LaTeX and Pandoc.
One issue with BibTeX is that it is not robustly specified. There are many optional fields and different ways of formatting the contents of each field, and this can cause things to break with certain bibliography styles and with different bibliography managers, which almost always format things incorrectly. I recently came across this article which I think sums up many issues with BibTeX and attempts to impose some order.
I learnt that the ISBN (International Standard Book Number) was introduced in 1970 originally as a 10 digit code, which was later expanded to a 13 digit code gradually between 2005 and 2007. This means that for most books in my library, I can easily check their bibliographic information by running the ISBN through an online service such as this tool by Robert Eisele which generates a BibTeX entry from an ISBN.
I decided on a consistent BibTeX entry to use with my personal library:
@book{Willock1974,
editor = {},
author = {Willock, C. and Plage, G. D.},
title = {Africa's Rift Valley},
year = 1974,
publisher = {Time Life UK},
address = {London, UK},
isbn = {0705400964},
lc = {QH195.R53 W54}
}
ost of this is self-explanatory. There are optional fields for the book entry:
- volume or number
- series
- edition
- month
- note
But I found that I really didn’t need most of these identifiers, with most books in my collection not having any of them. note
I may choose to use later to add searchable terms to certain books.
I would like to present my personal library on my website, my gopherhole and as a nicely formatted .pdf
. I could probably use pandoc for all of these tasks, but adding a shell script and a few templates isn’t hard either. This is the shell script:
#!/bin/bash
latexmk -pdf books.tex
pandoc --filter pandoc-citeproc --csl /Users/johngodlee/.texmf/apa.csl --standalone books.md -o books.html
pandoc -f html -t plain --columns=68 -o books.txt books.html
This first creates books.pdf
using latexmk
. I used a latex template called books.tex
:
\documentclass{article}
\usepackage{mynotes}
\renewcommand\refname{}
\title{Bibliography}
\date{}
\begin{document}
\maketitle{}
\nocite{*}
\bibliography{books}
\end{document}
The magic command is \nocite{*}
which includes a bibliographic entry for every item in books.bib
, regardless of whether it is cited in the text.
The shell script then uses pandoc
and pandoc-cireproc
to create books.html
, using a custom .csl
file which formats the references in generic APA style. I downloaded apa.csl
from this Github repo
. I had to use a markdown template (books.md
) to get the references to display properly:
---
bibliography: books.bib
nocite: "@*"
title: "Library"
...
Pandoc is then used to re-format the html as plain text for use on my gopherhole. I couldn’t go straight from markdown to plain text and get the references to display. I guess the nocite: "@*"
is ignored in that case.
The references in the plain text look like this:
Allen, M. F. S. (2003). Portuguese in 3 months. London, UK: Dorling
Kindersley.
Auden, W. H. (1968). Selected poems. London, UK: Faber; Faber.
Bates, L., & Sheers, O. (2018). Letters to the future: On equality
and gender. Hay-on-Wye, UK: Hay Festival Press.
Beaujean, A. A. (2014). Latent variable modeling using r. New York
NY, USA: Routledge.
And in .html
they look like this:
<div id="ref-Allen2003">
<p>Allen, M. F. S. (2003). <em>Portuguese in 3 months</em>. London, UK: Dorling Kindersley.</p>
</div>
<div id="ref-Auden1968">
<p>Auden, W. H. (1968). <em>Selected poems</em>. London, UK: Faber; Faber.</p>
</div>
<div id="ref-Bates2018">
<p>Bates, L., & Sheers, O. (2018). <em>Letters to the future: On equality and gender</em>. Hay-on-Wye, UK: Hay Festival Press.</p>
</div>
<div id="ref-Beaujean2014">
<p>Beaujean, A. A. (2014). <em>Latent variable modeling using r</em>. New York NY, USA: Routledge.</p>
</div>
y personal library can now be found here, on my website .