40

I have a long document containing plenty of TikZ figures and it is painfully slow to compile it.

Is there any specific TikZ tips / good practices you could recommend me so that I can write figures that does not take too much time to be compiled?

I am aware of the TikZ external library but it triggers dependency/recompilation problems that are difficult (IMHO) to solve. Also, the bigger the document is, the easier it is to overlook that one figure did not get recompiled as expected.

Is there, for instance, parts of the TikZ API which are notoriously slow?

9
  • What kind of dependency problems are you thinking of in conjunction with the external library?
    – Jake
    Commented Sep 10, 2012 at 18:24
  • 6
    As far as I know, the only way to reduce typesetting of tikz pictures is to use image externalization. Here, you have the choice between the external lib and the standalone package. Note that the external lib now detects changes inside of the tikzpicture environment using MD5 checksums (using the CVS unstable). Commented Sep 10, 2012 at 18:27
  • 5
    Using standalone makes things much faster, because you can include the TikZ pictures as images. There is an auto-recompile feature. But, if you mind external you might mind standalone as well. Commented Sep 10, 2012 at 18:28
  • 1
    Putting each diagram in a separate input file using standalone document class will give us many advantages: (1) make the preamble of the main cleaner because macro definitions that are specific to a certain diagram will only be placed in the preamble of the input file of the corresponding diagram, (2) which in turn, etc. Commented Sep 10, 2012 at 18:40
  • 6
    related: draft-mode-for-pgfplots
    – cmhughes
    Commented Sep 10, 2012 at 20:31

3 Answers 3

18

I share similar feelings with the OP, and find the externalization solution good, but for sure not perfect. For example, in addition to the con the the OP pointed, I would like to add two issues:

  1. If one inserts a new figure, somewhere in the middle of the document, then tikz will re-build all the following ones, although they were not changed.
  2. Editing the image is somehow annoying. You don't want to edit your tikz image as part of a huge document.

I'm not familiar enough with the standalone package, so I cannot really judge, but if I understand correctly, it won't avoid compiling all the image when the main document is compiled.

Following is an outline of an idea that I tried to implement. So far it is not working, but it might be an idea for others...

Setting

Assume the you have the following structure:

- project
|- main.tex
|- tikz-images
   |- tikz1.tex
   |- tikz2.tex

and you build using latexmk.

Idea

Turn the tikz images into standalone documents, build their corresponding pdf's using make and include the pdf(!) in the document. This way, whenever a new tikz image is created, all you need to do is add a target to the makefile in tikz-images.

Problems will come regarding the compilation using latexmk who will not(!) be aware of changes to tikz1.tex.

Implementation

First, the files in tikz-images should have the extension .tikz, reserving the .tex extension for a common preamble to be included in all figure source codes. This will help you to keep the same font & Co. settings of the main document. Then, in project create the following makefile:

TIKZDIR = tikz-figures
TIKZ_FILES = $(wildcard $(TIKZDIR)/*.tikz)
PDFTIKZ_FILES = $(patsubst %.tikz,%.pdf,$(TIKZ_FILES))

$(TIKZDIR)/%.pdf: $(TIKZDIR)/%.tikz $(TIKZDIR)/common-preamble.tex
    cd $(TIKZDIR); \
    pdflatex $$(basename $<)

.PHONY : FORCE_MAKE
all : main.pdf
main.pdf : main.tex FORCE_MAKE ${PDFTIKZ_FILES}
    latexmk main.tex

This way, calling make main.pdf in project will first build the tikz images (incase they were changed, or they are missing) and then latexmk will take care of the rest.

This approach, once fully implemented, could have two main advantages:

  1. Developing the pictures can be quicker and be carried out regardless of the main document. Thus, faster.
  2. Building of the document can be quicker as well since it will merely include ready PDFs.

Problems:

  1. As I mentioned, completing the implementation of the makefile in `project.
  2. One of the most important benefits of externalization library of tikz is that you get the same setting for the images (fonts for example). To have this also in the proposed approach, something has to be done.
  3. Improve the makefile of the tikz images.
5
  • 1
    Since a few months I've been using a similar approach based on Makefiles. I name TikZ source file with a .tikz extension, reserving the .tex extension for a common preamble to be included in all figures (actually I create a format file from it to further speed up compilation). Then I define variables TIKZDIR = tikz-images, TIKZ_FILES = $(wildcard $(TIKZDIR)/*.tikz), PDFTIKZ_FILES = $(patsubst %.tikz,%.pdf,$(TIKZ_FILES)). Then, PDFTIKZ_FILES is a prerequisite to main.pdf and the rule to build all figures is [continues in the following comment...]
    – giordano
    Commented Nov 6, 2013 at 8:56
  • $(TIKZDIR)/%.pdf: $(TIKZDIR)/%.tikz $(TIKZDIR)/preamble.tex^J^Icd $(TIKZDIR); pdflatex $$(basename $<)
    – giordano
    Commented Nov 6, 2013 at 8:59
  • @giordano I turned this answer into a community wiki. Would you like to insert your comments into the answer? Correct me if I'm wrong, you don't have a makefile in tikz-images, right?
    – Dror
    Commented Nov 6, 2013 at 9:11
  • it's correct. If I need to generate a format file from the common preamble file then a Makefile inside tikz-images is useful, instead with suggestions I sketched above it isn't strictly needed.
    – giordano
    Commented Nov 6, 2013 at 9:17
  • @Dror, as for your first point, the recompilation of all subsequent images will only happen if you do not have specific picture names. Else, I can recommend this method: tex.stackexchange.com/questions/40516/…
    – nickpapior
    Commented Jun 19, 2014 at 9:15
1

On this page you can find a suitable solution which uses externalization of images as mentioned in one of the comments above and describes the advantages of this approach like faster compilation as well as easier reuse and version control.

0

I just have two documents open. I look if the tikzpicture is ok on an seperate document, once it is ok, I use it in the final document.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .