TikZ : de magnifiques figures directement sous LaTeX

Dans la série « on peut tout faire sous $latex \LaTeX$ » : tracer des figures vectorielles directement dans la source. Plus précisément, c’est le package TikZ qui va nous permettre cette prouesse.

 

Pourquoi cette lubie ?

Ce genre de pratique (qui deviendra même un réflexe, vous verrez) présente deux grands intérêts : le premier est d’assurer une cohérence graphique complète entre le corps de texte et la figure (mêmes polices, tailles de caractères etc.) et ce quelle que soit la classe ou la fonte choisie. Le deuxième intérêt est de pouvoir modifier ou corriger très rapidement une figure, sans avoir à ouvrir un éditeur graphique externe.

Quelles solutions ?

Les deux grandes méthodes pour faire ces dessins sont TikZ et pstrick. C’est cette première qui sera développée ici.
TikZ est en fait une surcouche de PGF, fournissant ainsi tout en ensemble de commandes simplifiées.

La structure

Bien entendu, on commence par charger TikZ avec \usepackage{tikz} dans le préambule.
Toutes les commandes doivent être placées dans l’environnement tikzpicture. Comme vous le verrez par la suite, le nombre de commandes par figure peut vite devenir important, je vous invite donc à utiliser la commande \input{} et décrire chaque figure dans un fichier propre. En plus d’alléger substantiellement le fichier maître, ça vous facilitera la réutilisation des figures, par exemple si vous voulez faire un rapport ET un beamer.

On a donc, dans le fichier maître (celui à compiler) :

blabla
\begin{figure}
  \input{mafigure.tex}
\end{figure}
re-blabla

Et dans mafigure.tex :

\begin{tikzpicture}
  % toutes vos commandes TikZ
\end{tikzpicture}

Les commandes de base

La plus élémentaire est de tracer un trait entre deux points :

\draw (0,0) -- (0,1) ;

Qui tracera évidemment un trait entre les points de coordonnées (0,0) et (0,1). Par défaut, les coordonnées sont en centimètres. Il est possible de travailler en coordonnées polaires en remplaçant la virgule par deux points : (angle :rayon). Ne pas oublier le point virgule à la fin de chaque commande (le compilateur répond sinon le classique « Did you forget a semicolon ? »).

Pour tracer une ligne brisée, appelée path (chemin, pour les réticents à la langue de Justin Bieber), on peut utiliser la commande suivante :

\draw (0,0) -- (0,1) -- (1,1) ;

Qui tracera une ligne entre les points de coordonnées (0,0) et (0,1) et une autre entre (0,1) et (1,1).

Les points consécutifs peuvent être placés de façon relative. La commande suivante est équivalente à la précédente :

\draw (0,0) -- ++ (0,1) -- ++ (1,0) ;

Un cercle est défini par son centre et son rayon :

\draw (0,0) circle (2) ;

donnera un cercle centré sur l’origine et de rayon 2cm.

On peut ainsi tracer tout un tas de courbes : arcs de cercles, ellipses, courbes de Bézier etc. Vous vous doutez bien qu’il est possible de faire des figures bien plus complexes que des rectangles et des cercles (en allant jusqu’aux animations !), vous trouverez ici un large éventail d’exemples, avec leurs sources associées, prouvant la puissance de TikZ.

Styles de lignes

Bien entendu, il est possible de choisir le style et la couleur des lignes tracées :

\draw[blue] % trace en bleu
\draw[->]   % Une flèche vers le deuxième point
\draw[<->]  % Fleche double

Pour gagner du temps

On peut tracer directement un rectangle en donnant deux coins opposés :

draw (0,0) rectangle (1,1);

Un chemin peut être fermé en le finissant par cycle. Exemple pour tracer une espèce de sablier :

\draw (0,0) -- (1,1) -- (0,1) -- (1,0) -- cycle;

Remplir un chemin

Si \draw permet de tracer un chemin, c’est \fill qui permet de faire un remplissage, même si vous n’avez pas fermé le chemin (il le sera automatiquement) :

\fill (0,0) -- (1,1) -- (0,1) -- (1,0);

La couleur de remplissage est passée en argument, par exemple pour remplir le sablier en bleu :

\fill[blue] (0,0) -- (1,1) -- (0,1) -- (1,0);

On peut même faire des dégradés de couleur :

\shade[left color=blue , right color=red] (0,0) -- (1,1) -- (0,1) -- (1,0); % De gauche à droite
\shade[top color=blue , bottom color=red] (0,0) -- (1,1) -- (0,1) -- (1,0); % De haut en bas
\shade[inner color=blue , outer color=red] (0,0) -- (1,1) -- (0,1) -- (1,0); % Radial
\shade[ball color=blue] (0,0) -- (1,1) -- (0,1) -- (1,0); % Effet de balle

Ajout de texte

Heureusement, il possible (et même facile), d’ajouter du texte où bon nous semble sur notre figure. Ce texte est contenu dans une boite, elle-même positionnée par un nœud (node) :

\node at (0,1) {blabla dans ma figure};

Par défaut, le texte est centré (dans les deux directions) sur le nœud. On peut modifier cet alignement :

\node[above] at (2,0) {Texte au dessus};
\node[right] at (2,0) {A droite};
\node[below left] at (2,0) {En bas à gauche};

 

Bien entendu, il est possible de personnaliser le style de boite :

\node[fill=red,draw=black,text=blue] at (0,0) {Texte en bleu dans une boite noire sur fond rouge};

Il est très commode de donner des petits noms aux nœuds, ce qui permet par la suite de les utiliser pour tracer les chemins :

\node (noeud1) at (0,0) {Texte A};
\node (noeud2) at (1,1) {Texte B};
\node (noeud3) at (2,0) {Texte C};
\draw[->] (noeud1) -- (noeud2) -- (noeud3);

 

 

Précautions avec la langue française

Il existe a priori une incompatibilité entre babel en français et TikZ, qui est due à l’espace insérée avant chaque double ponctuation ( : ; ? !), alors que ces mêmes ponctuations servent de séparateurs pour les commandes TikZ. Pour éviter ça, le mieux est de désactiver localement cette espace automatique avec la commande shorthandoff dans chaque environnement tikzpicture :

\shorthandoff{:;!?}
\begin{tikzpicture}
  % Une jolie figure en français
\end{tikzpicture}
\shorthandon{:;!?}

Vous pouvez rendre l’exécution de la commande précédent automatique pour toutes les figure TikZ du document en plaçant dans son préambule :

\tikzset{every picture/.style={execute at begin picture={
   \shorthandoff{:;!?};}
}}

 

LaTeX vous retourne l’erreur « ! No room for a new \dimen « 

Ce message signifie que $latex \LaTeX$ n’a pas assez de place pour définir les nouvelles variables, ce qui arrive facilement avec pgfplots/TikZ. La solution la plus simple est d’étendre cette capacité en ajoutant dans le préambule, juste après la définition de la classe :

\usepackage{etex}

 

Pour aller plus loin

En attendant d’autres billets à ce propos (on pourrait en écrire des milliers), encore une fois, je ne peux que vous conseiller de consulter la littérature très épaisse à propos de TikZ. On retiendra :

  • L’ouvrage de référence francophone : TikZ pour l’impatient. Il est parfait pour débuter sous TikZ et ne fait « que » 187 pages.
  • Pour aller (vraiment) beaucoup plus loin : le manuel officiel de TikZ/PGF, qui lui pèse la bagatelle de 726 pages (en anglais).

Bonne compilation !