Auto-build latex documents

A short description about latexmk and arara.

I have a tex file (input.tex) which I need to apply with 6 commands to get the proper pdf output that I need. Here are those commands:

pdflatex -shell-escape input.tex
bibtex input.aux
pdflatex --shell-escape input.tex
pdflatex --shell-escape input.tex
makeglossaries input
pdflatex -shell-escape input.tex

That's a lot of commands to run. Could write a shell script for that. But then you got to manage a shell script for each tex file. That sounds like some extra work.

Found two tools that help avoid the extra work: latexmk and arara.

(Came across both for the first time while reading Dr. Nicola L. C. Talbot's Using LaTeX to Write a PhD Thesis which I found quite helpful.)

In my case,


latexmk means complete automation. We needn't do anything. Needn't even give any hints to let the tool know which all commands need be run. latexmk will figure out the dependencies and act accordingly by making use of information available in log files.

We can use configure files to change the default behaviour of latexmk by making a latexmkrc or .latexmkrc file whose contents essentially seem to be Perl. This is because latexmk is written in Perl (and hence needs a system with Perl installed to run).

In my case, default configuration would suffice. All that needs to be done is

latexmk -shell-escape input.tex

That's it. Down to a single command from 6 different ones!

latexmk, like make, can also figure out when the build is upto date so that it won't run the commands if the source files haven't changed after the last build.

latexmk might run more commands than needed sometimes, as mentioned by the creator of latexmk himself in this post. But that doesn't affect the output. And that's probably a small price to pay for the kind of automation latexmk offers.


Unlike latexmk, arara doesn't do 'full' automation. It does as the user tells it to do.

In my case, I need to put the following 'magic comments' at the beginning of the input tex file (even before the preamble):

% arara: pdflatex: { shell: yes}
% arara: bibtex
% arara: pdflatex: { shell: yes}
% arara: pdflatex: { shell: yes}
% arara: makeglossaries
% arara: pdflatex: { shell: yes}

% Now the 'real' source

and then we can use

arara input.tex

and we get a description of what happened as output:

  __ _ _ __ __ _ _ __ __ _
 / _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
 \__,_|_|  \__,_|_|  \__,_|

Processing 'input.tex' (size: 45.2 kB, last modified:
12/23/2021 21:58:14), please wait.

(PDFLaTeX) PDFLaTeX engine .............................. SUCCESS
(BibTeX) The BibTeX reference management software ....... SUCCESS
(PDFLaTeX) PDFLaTeX engine .............................. SUCCESS
(PDFLaTeX) PDFLaTeX engine .............................. SUCCESS
(MakeGlossaries) The MakeGlossaries software ............ SUCCESS
(PDFLaTeX) PDFLaTeX engine .............................. SUCCESS

We inform arara about the commands that need be run by means of comments placed within the source tex file and arara does that. Nothing more, nothing less. User has complete control over the commands being done. arara does no guesswork.

In this example, I only needed rules which are available in arara by default (stuff like pdflatex, makeglossaries in the 'magic comments' are the rule names for arara). We can also make our own rules as needed. See here for an example.

arara uses JVM (Java Virtual Machine) and needs Java runtime environment installed to run.