TikZ : Externalisez vos figures pour gagner en temps de compilation

J’avais déjà donné dans un précédent billet une méthode pour sortir les figures TikZ dans des fichiers distincts, pour d’éventuelles utilisation standalone. On va voir dans ce billet une autre façon d’externaliser les figures avec en plus la chance d’utiliser ces sorties pour éviter de reconstruire toutes les figures à chaque compilation, d’où un gain de temps non négligeable lors de la compilation.

Quiconque fait du TikZ sait que le temps de compilation des figures est parfois loin d’être négligeable (c’est d’ailleurs un des reproches fait à TikZ par rapport à pstrick…). Et bien sûr cette tendance se fait grandement sentir sur les gros documents. Mais si on y réfléchis, c’est un peu con de recalculer toutes figures et autres graphs à chaque compilation, juste parce qu’on a changé une virgule en un point virgule dans la conclusion.

On va donc voir comment dire à $latex \LaTeX$ de sortir ces fameuses figures, pour les réutiliser au lieu de les recalculer.

Fichier source

Voici un exemple minimal, illustrant la syntaxe à utiliser :

\documentclass[12pt]{article}
\usepackage{tikz}
\usetikzlibrary{external}
  \tikzexternalize
\usepackage{pgfplots}
 
\begin{document}
\begin{figure}
	\centering
	\tikzsetnextfilename{figureexternalisee} % Nom du fichier de sortie de la figure
	\input{figuretikz.tex} % Source TikZ dans un fichier annexe, pour la lisibilité
\end{figure}
\end{document}

À la première compilation, on va donc créer plusieurs pdf (je parle ici de la compilation avec pdflatex, adapter au besoin) : le document maître, comme d’habitude, et autant d’autres pdf que de figures TikZ, portant chacun les noms que vous aurez pris le soin de choisir avec la commande \tikzsetnextfilename.

On voit donc déjà un avantage de cette méthode par rapport à celle que j’avais développé dans l’ancien billet : en une compilation, on sort toutes les figures. Aux compilations suivantes, TikZ va voir qu’il existe déjà des fichiers de sortie dans le dossier de travail, et va donc se contenter d’inclure ces figures dans le document. Si on veut modifier une figure (donc la recompiler), il suffit de supprimer le pdf correspondant. [EDIT] Encore plus pratique, il suffit d’ajouter la commande :

\tikzset{external/remake next}

juste avant « \tikzsetnextfilename » pour indiquer à TikZ de refaire la figure. Il faut alors penser à commenter cette ligne pour ne pas recompiler la figure. [/EDIT]

Compilation

C’est là que réside la feinte : si on tente brutalement un pdflatex source.tex alors, pdflatex va s’arrêter parce qu’il se trompe de jobname (dû à une commande pour l’externalisation). La commande à utiliser est donc la suivante :

pdflatex -shell-escape source.tex

L’option shell-escape autorise $latex \LaTeX$ à lancer des commandes externes. En vrai, cette commande n’est nécessaire qu’à la première compilation. Si tous les fichiers de sortie sont présents, on peut se contenter de pdflatex.

Temps de compilation

Le but est je l’ai dit de gagner en temps de compilation, on va donc faire le test pour voir si c’est efficace : avec le fichier source présenté plus haut et une grosse figure bien lourde, telle que présentée ici, le temps nécessaire à la première compilation (sur mon Athlon X4 640) est de 2,02s. À la deuxième compilation, il passe à… 0,31s ! CQFD.

Erreur « I can’t find file `tikzlibraryexternal.code.tex’  »

Si le compilateur vous sort ce genre d’erreur, c’est que votre version de pgf n’est pas à jour. Vous trouverez ici la dernière version et ici comme l’installer.

Cadeau aux linuxiens

Pour déterminer le temps d’exécution d’une tache, comme réalisé juste au dessus :

/usr/bin/time commande

 

Bonnes compilations !