Script to automate externalizing TikZ graphics

The TikZ 2.10 library, external, addresses this issue. Externalizing all TikZ graphics in a LaTeX document is as easy as:

\usetikzlibrary{external}
\tikzexternalize

If your document is named report.tex, this will dump out a series of images: report-figure0.pdf, report-figure1.pdf, etc, etc. To get a more manageable output, you can specify a directory for in which the files are to be placed and names that are more descriptive than report-figure0.pdf:

\usetikzlibrary{external}
\tikzexternalize[prefix=figures/]

% Rest of preamble
% Begin document, write stuff

% Set a filename for the next tikzpicture.
\tikzsetnextfilename{importantFigure}
\begin{tikzpicture}  % This will be output to figures/importantFigure.pdf
  % Picture code
\end{tikzpicture}

To compile the document, you will need to ensure the figures directory exists and run pdflatex with shell execution enabled:

mkdir figures
pdflatex -shell-escape <tex file>

A whole pile of options is available to customize the way the figures are output. See section 52.4 (this numbering is subject to change!) of the development version documentation for complete info and options. The manual also covers how to obtain EPS output- but this option looks less polished than PDF output.


When I was writing my MSc thesis, I had created all of my figures and diagrams with tikz and pgfplots (using matplotlib2tikz). Keeping all of them within the source was not acceptable, since the compilation was getting really slow, so I was searching for something that would allow me to automatically compile all those figures to pdf files that I could include in my text.

For various reasons, I was not entirely satisfied with any of the other solutions so I wrote a Python script that suited my purpose.

The things you must keep in mind are:

  1. You put the script on the same level as your main.tex file
  2. You write your tikz code. You place each figure within a file with extension *.tikz. Each file contains only \begin{tikzpicture} ... \end{tikzpicture}.
  3. You write the preamble that you want to use with the *.tikz files. This doesn't necessarily contains the same packages as the preamble of your main.tex file. The reason you keep a common preamble for all the figures is to make it easy to make changes in things like fonts etc.
  4. You run the script!

The script searches recursively within a folder structure for *.tikz files and compiles them using the specified preamble. Each time the scripts runs, it stores the modification time of each *.tikz file and on subsequent runs it compiles only the newly created files of the files that have been modified since the last run. If you make changes in your preamble, you just pass a command-line argument and it compiles all the *.tikz files.

On linux it works great. I haven't tested it on windows, but I don't see why it shouldn't run. Anyway, even if there is any problem, the fix is going to be really trivial


Here's my alternative; Konrad's answer is probably just as good, and certainly better documented.

for job in `grep -o beginpgfgraphicnamed\{[0-9A-Za-z-]*\} < $1 | sed -e 's/beginpgfgraphicnamed{//' | sed -e 's/}//'`; do
    pdflatex --jobname $job $1;
    rm $job.log;
    rm $job.out;
    rm $job.aux;
done