While writing a thesis or working on a large project, the number of files in the main project directory can be overwhelming. A number of metafiles are generated by LaTeX itself, for glossaries, or for bibliographies. Often, the author doesn’t touch these files. In this article, I discuss a neat way to hide these files in a separate folder, in order to reduce clutter in the main project folder.
Basic idea
The idea is to create a folder for metafiles in the main project directory and place all meta-/output-files in that folder. As a consequence, the final PDF will also be generated in that folder, even though we would want it in the project directory. I’ll show how to typeset a document while keeping all metafiles in a separate folder. Moreover, I’ll provide a solution for how to have the final PDF in the main project folder.
Project directory/
|__ main.tex
|__ main.bib
|__ main.pdf
|__ chapter1.tex
|__ chapter2.tex
|__ …
|__ metafiles/
| |__ main.aux
| |__ main.bcf
| |__ main.blg
| |__ main.glo
| |__ main.ist
| |__ main.log
| |__ main.toc
| |__ …
|__ figures/
|__ figure1.pdf
|__ …
LaTeX
Let’s first focus on LaTeX. To generate the PDF from a raw TeX/LaTeX file I use pdflatex
. The command takes an optional argument: output-directory=<directory>. Through this parameter, I can write all meta-/output-files to a specific directory. I call the directory metafiles
. First, I create the directory and then I typeset the LaTeX source file: main.tex
from the main project directory:
mkdir metafiles pdflatex -output-directory=metafiles main
Biber/Biblatex
I use biber
to generate the bibliography using the biblatex package. Similar to pdflatex
, biber
takes an output-directory parameter. In addition, I want to specify the input-directory parameter, which tells biber
where to look for the bibliography files generated by pdflatex
. Note the double dash (- -) for biber parameters:
biber --input-directory=metafiles --output-directory=metafiles main
makeglossaries/makeindex
One way to generate a glossary or list of acronyms is to use the glossaries package. The package also installs a perl script makeglossaries
that simplifies the glossary generation through makeindex
. See the glossaries package documentation for more details. Similar to pdflatex
and biber
, a parameter can be specified to tell makeglossaries
where input files are located.
makeglossaries -d metafiles main
It seems makeindex
doesn’t support a directory parameter. Therefore, either I have to manually change directory (cd
) or provide the exact path to all input and output files. For example, to generate a glossary the commands would either be:
cd metafiles makeindex -s main.ist -t main.glg -o main.gls main.glo cd ..
or
makeindex -s metafiles/main.ist -t metafiles/main.glg -o metafiles/main.gls metafiles/main.glo
Output PDF in project directory
Finally, I want to have the output PDF file in my project directory, rather than in the metafiles
folder. There are two possible ways. Either I simply move (mv
) the file out of metafiles
or I create a soft-link in the project directory, pointing to the actual file.
mv metafiles/main.pdf ./main.pdf ln -s metafiles/main.pdf
Complete bash script
#!/bin/bash # Create directory if it doesn't exist if [ ! -d "metafiles" ]; then mkdir metafiles fi # Run pdflatex and biber with metafiles as in-/output directories pdflatex -output-directory=metafiles main biber --input-directory=metafiles --output-directory=metafiles main pdflatex -output-directory=metafiles main pdflatex -output-directory=metafiles main makeglossaries -d metafiles main pdflatex -output-directory=metafiles main # Create a softlink to the output PDF ln -s metafiles/main.pdf
Limitations/Extensions
The scripts are written in bash
and are likely to work on Linux/UNIX-based systems, including Mac OS X. There are other ways to do the same thing, for example using latexmk or Snakemake. Also, since I’m not working with Windows, I wasn’t able to provide a command-line script for Windows users. Feel free to post your script below for others to use.
Source: The idea for this post and some of the code was taken from here.
P.
On Windows you can use
pdflatex -aux-directory=...
that removes the necessity for moving the output pdf.tom
Thanks, I wasn’t aware of that option. It seems this is only available in MiKTeX.
Cheers, Tom.
Joe
Nice idea, Tom.
Here’s a bash script which you can add to your path. The script requires a single argument: the name of the latex source file. I haven’t included any of the bibtex etc. as I don’t need that at the moment.
Thanks for the interesting site.
tom
Hi Joe,
Thanks for your feedback and the script. I appreciate it. Tom.
algui91
Hi!, great blog, I would like to translate this and some other post into spanish. Could I get your permission? Of course, I will cite your base blog url and a link to the post.
Best regards
tom
Hi there,
Sure, feel free to use the information on my blog. Thanks for asking!
Tom
Oliver Kopp
Although this still works, meanwhile the build tool ltx2any was developed. It does all of that automatically.
tom
Interesting, thanks for the heads-up. Best wishes, Tom