Tutorial for pandoc citations: markdown to latex

Posted on 31 August 2014 in pandoc

I am trying to move all of my writing over to markdown, and then using pandoc to produce the true target format. Often that is latex, and often there are citations involved. This post will be an example (or two) of dealing with citations in markdown so that pandoc can handle things appropriately.

I use mendeley to organize my academic papers and it happily produces .bib files for different collections. So, my assumption is that you already have your references specified in a .bib file. You should also have pandoc and a latex installation. You should also install pandoc-citeproc which is separate from pandoc. If you have pandoc through RStudio, it probably also came with pandoc-citeproc. Otherwise, you should be able to install it the same way that you installed pandoc (perhaps cabal install --global pandoc-citeproc). As you'll see in this post, pandoc-citeproc is not strictly necessary.

I'll talk about two scenarios for generating latex output. The first is you go straight from markdown to a pdf with no intermediate steps. The pandoc latex default template (or your own latex pandoc template) is good enough. The second scenario will be that we want to generate a .tex file from our markdown and then possibly tweak the .tex file and finally compile it to pdf.

For the first scenario, we want to take input.md convert it to output.pdf while linking in ref.bib. Here's the pandoc call to do that

pandoc input.md -t latex --filter pandoc-citeproc --bibliography=ref.bib -o output.pdf

The --bibliography flag is not necessary, we could specify this in the YAML at the top of the markdown file:

title: My Title
author: ME!
bibliography: ref.bib

You might also add in some flags like -S to make sure quotes and such are handled intelligently. To cite a reference in ref.bib that has a reference key of RefKey, just type [@RefKey] in your markdown source. If you don't want parentheses around the citation, drop the square brackets @RefKey, if you don't want to say something like "Heinz and Huntz say blah (Heinz and Huntz, 1992)" and would rather get "Heinz and Huntz say blah (1992)" do this: [-@RefKey].

If you have cls file, you can give pandoc the flag --csl=FILE. I don't know much about this, I'm used to .bst files for natbib.

You might be thinking that if you wanted to go .tex instead .pdf, you would just change the output to -o output.tex. However, this is probably not what you want. The pandoc-citeproc is going through and evaluating all of your citations, so you won't see, in your .tex file, things like "\citep{HeinzHuntz1992}". Instead, the citation will be expanded to it's actual text. To get the "raw" latex source, you should not use pandoc-citeproc. Instead, we'll let latex use natbib/bibtex to actually expand the citations. To generate the .tex, run a line like this:

pandoc input.md -t latex -s -S --natbib --bibliography=ref.bib -o output.tex

I have found that I must specify the --bibliography flag even if it is stated in the YAML of the markdown source. Now, you can go into the .tex file, tweak things, set the bibliography style to your .bst, etc. Citation is done the same way as above (using the @ sign) which is translated to the latex \cite family as appropriate.

Do you have any additional tricks for dealing with pandoc, markdown, latex and citations?