TITLE: Creating a personal library catalogue
DATE: 2019-11-25
AUTHOR: John L. Godlee
====================================================================


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.

  [Calibre]: https://calibre-ebook.com/
  [Libib]: https://www.libib.com/
  [Goodreads]: https://www.goodreads.com/

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.

  [this article]: https://serialmentor.com/blog/2015/10/2/Bibtex

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.

  [this tool by Robert Eisele]: https://www.xarg.org/tools/isbn-to-bibtex/

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:

  [this Github repo]: https://github.com/citation-style-language/styles

    ---
    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., &amp; 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].

  [here, on my website]: https://johngodlee.github.io/library/