Bases de TikZ

TikZ est le système standard pour dessiner des graphiques vectoriels directement dans LaTeX, en code. Vous écrivez coordonnées, lignes, cercles, flèches et nœuds dans le même source que votre prose, et la figure est composée avec les mêmes polices et la même qualité que le texte environnant. Pas d’allers-retours vers un logiciel de dessin séparé : vos figures deviennent une partie reproductible du document, et c’est le sujet de cette page.

PGF et TikZ

Commençons par les noms. À la base se trouve PGF (Portable Graphics Format), un moteur graphique de bas niveau qui trace réellement les lignes tout en masquant les différences de pilotes (PDF contre DVI). Écrire du PGF brut est laborieux. TikZ est donc le frontal convivial (une couche de macros) posé sur PGF pour rendre le dessin agréable. Les deux ont été créés par Till Tantau.

Le nom TikZ est un acronyme récursif, dans le style GNU, de l’allemand « TikZ ist kein Zeichenprogramm » (« TikZ n’est pas un programme de dessin »). Sa prononciation n’est pas officiellement fixée : on entend /tiks/, /tikts/ ou /tik-zee/. En pratique, on parle de « PGF/TikZ » comme d’un tout, et ce que nous écrivons est presque toujours le côté TikZ.

Pour commencer, c’est simple : mettez \usepackage{tikz} dans le préambule, et PGF est chargé avec lui. Cela fonctionne tel quel avec pdfLaTeX, LuaLaTeX et XeLaTeX. Ce n’est que lorsque vous passez par DVI, comme avec pLaTeX ou upLaTeX, qu’il faut aussi préciser un pilote, généralement dvipdfmx, comme option de classe.

document.tex
\documentclass{article}   % pLaTeX なら \documentclass[dvipdfmx]{jsarticle}
\usepackage{tikz}
\begin{document}
We are working on
\begin{tikzpicture}
  \draw (-1.5,0) -- (1.5,0);
  \draw (0,-1.5) -- (0,1.5);
\end{tikzpicture}.
\end{document}

Cela compose le texte « We are working on », puis trace dans la même ligne une petite croix, une ligne horizontale et une ligne verticale passant par l’origine, avant de finir par un point. Cette fusion d’une figure dans la ligne de texte donne le ton de TikZ.

L’environnement tikzpicture

Toute figure est dessinée dans l’environnement tikzpicture (\begin{tikzpicture}\end{tikzpicture}). C’est la « toile » qui contient une image ; vous y listez les commandes de dessin. Dans les crochets après le nom de l’environnement, vous pouvez placer des options qui s’appliquent à toute l’image, par exemple [scale=2] pour doubler la taille ou [thick] pour épaissir l’ensemble.

Pour une minuscule figure sur une ligne, il n’est pas nécessaire d’ouvrir l’environnement : il existe les formes en ligne \tikz{...} et, pour une seule commande, \tikz \draw ...;. Quelle que soit la forme utilisée, une règle est indispensable : chaque commande de dessin se termine par un point-virgule ;. Le point-virgule signifie « ce chemin s’arrête ici » ; l’oublier est une erreur, le faux pas le plus courant des débutants.

latex
% 行内(インライン)
\tikz \draw (0,0) -- (1.5,0);

% 環境(複数のコマンド)
\begin{tikzpicture}
  \draw (-1.5,0) -- (1.5,0) -- (0,-1.5) -- (0,1.5);
\end{tikzpicture}

Le modèle de chemin — coordonnées et opérations

Le dessin dans TikZ tourne autour du chemin (path), c’est-à-dire une route indiquant comment aller de point en point. Le nom de la commande choisit comment cette route est montrée. \draw trace le chemin comme une ligne, \fill remplit l’intérieur d’un chemin fermé, \filldraw remplit puis trace le contour, et \path ne fait que définir le chemin sans rien dessiner, utile pour placer des coordonnées ou des nœuds à référencer plus tard.

Il y a trois façons d’indiquer un point. En cartésien, (x,y) utilise par défaut les centimètres : (1,2) signifie 1 cm à droite et 2 cm vers le haut ; les unités peuvent être explicites, comme (1cm,2pt). En polaire, (angle:radius) se lit « dans cette direction, à cette distance », par exemple (30:1cm). Si vous nommez un point, une coordonnée nommée, vous pouvez le rappeler plus tard par son nom. Les déplacements relatifs existent aussi : ++(1,0) avance de 1 cm à droite *et* met à jour le point courant, tandis que +(1,0) est relatif au point de départ sans le mettre à jour.

Les opérations de chemin décident de la progression. -- trace une ligne droite du point précédent au suivant, en les chaînant comme (a) -- (b). rectangle crée un rectangle à partir de deux coins opposés, circle un cercle autour d’un centre, ellipse une ellipse, arc un arc de cercle, et grid une grille de lignes. Les courbes viennent de .. controls .. (courbe de Bézier) ou, comme on le verra, de to[bend]. Pour fermer une forme, terminez par -- cycle afin de revenir au départ.

La façon moderne de passer les arguments d’une forme est d’utiliser des paires clé-valeur dans [...]. Un cercle est circle [radius=10pt], une ellipse ellipse [x radius=20pt, y radius=10pt], un arc arc [start angle=0, end angle=30, radius=3mm] (de 0° à 30°, rayon 3 mm). Pour grid, [step=.5cm] fixe l’espacement. L’exemple suivant trace une grille légère, puis un cercle de rayon 1 cm à l’origine et une ligne droite de l’origine à (1,1).

latex
\begin{tikzpicture}
  \draw[step=.5cm, gray, very thin] (-1.4,-1.4) grid (1.4,1.4);
  \draw (0,0) circle [radius=1cm];
  \draw (0,0) -- (1,1);
  \fill[blue!20] (0,0) rectangle (0.5,0.5);
\end{tikzpicture}

L’image pose une grille gris pâle par pas de 0,5 cm de (-1.4,-1.4) à (1.4,1.4), puis par-dessus un cercle centré à l’origine, une diagonale de l’origine vers (1,1), et un petit carré de 0,5 cm à l’origine rempli en bleu pâle. blue!20 signifie « 20 % de bleu » : du bleu mélangé avec du blanc.

Nœuds — placer du texte et des formes

Un nœud (node) place du texte ou une forme à une coordonnée donnée ; c’est l’outil central pour étiqueter les figures. La forme de base est \node[options] (name) at (coordinate) {contents};. Les options incluent draw pour tracer une bordure, circle ou rectangle pour la forme, fill=blue!20 pour le remplissage, etc. Le name entre parenthèses devient la poignée du nœud, que vous pourrez référencer ensuite comme (name) ou (name.north).

Un motif que vous utiliserez constamment consiste à placer d’abord des nœuds nommés, puis à relier les noms par des lignes. Comme vous reliez par nom de nœud plutôt que par coordonnées brutes, les lignes suivent automatiquement quand vous déplacez les éléments.

latex
\begin{tikzpicture}
  \node (a) at (0,0)   [draw, circle, fill=blue!20] {A};
  \node (b) at (2.5,0) [draw, circle, fill=blue!20] {B};
  \draw[->] (a) -- (b);
\end{tikzpicture}

Cela dessine deux nœuds circulaires bleu pâle étiquetés « A » et « B », espacés de 2,5 cm, puis une ligne fléchée de A vers B. La ligne s’arrête proprement au bord de chaque nœud au lieu de pénétrer dans les cercles.

Les nœuds peuvent aussi se placer le long d’un chemin. Écrire \draw (a) -- (b) node[midway] {label}; met une étiquette au milieu (midway) de la ligne de a à b ; ajoutez above ou below pour la décaler hors de la ligne. C’est la manière standard d’annoter une connexion.

Options et styles

L’apparence d’une ligne se règle finement avec des options entre crochets. Les plus courantes sont les épaisseurs thin / thick / very thick, les couleurs comme red ou blue!50, dashed ou dotted, rounded corners, et les flèches. Les flèches sont -> (pointe à la fin), <- (au début), <-> (aux deux bouts). TikZ adopte même une règle pragmatique : toute option inconnue contenant un - est interprétée comme une spécification de flèche.

OptionSens
thick / very thickTraits plus épais (jusqu’à ultra thick)
red, fill=blue!50Couleur de trait ou de remplissage (!n règle l’intensité)
dashed / dottedLignes tiretées ou pointillées
rounded cornersArrondir les coins d’un chemin
->, <-, <->Pointe de flèche à la fin, au début ou aux deux bouts
scale=2Mettre cette image ou ce chemin à l’échelle 2

Si vous répétez la même décoration, l’usage est de la nommer comme style et de la réutiliser. Définissez-la dans le préambule avec \tikzset{name/.style={...}}, ou sur place dans les options de tikzpicture. Par exemple, l’extrait suivant définit un style help lines et l’applique à une grille.

latex
\tikzset{help lines/.style={color=blue!50, very thin}}

\begin{tikzpicture}
  \draw[help lines] (0,0) grid (3,2);
  \draw[thick, red, ->, rounded corners] (0,0) -- (1,2) -- (3,2);
\end{tikzpicture}

Cela trace une grille bleu pâle de (0,0) à (3,2), puis une ligne rouge épaisse qui part de l’origine vers (1,2) puis (3,2), avec coins arrondis et pointe de flèche à la fin. Comme la grille utilise un style, remplacer very thin par thin modifie toute la grille en un seul endroit.

Bibliothèques — charger les fonctions nécessaires

Le cœur de TikZ est volontairement réduit ; les fonctions spécialisées sont séparées en bibliothèques que vous chargez avec \usetikzlibrary{...} dans le préambule, en les séparant par des virgules s’il y en a plusieurs. Les plus utiles :

  • arrows.meta — un riche ensemble de pointes de flèche réglables (-{Stealth}, -{Latex}, …). L’ancienne bibliothèque arrows est obsolète ; utilisez celle-ci.
  • positioning — placement relatif des nœuds, avec right=of a ou below=1cm of b.
  • calc — calcul de coordonnées : ($(a)+(1,0)$) signifie « 1 cm à droite de a », et ($(a)!0.5!(b)$) « le milieu de a et b ».
  • shapes — nombreuses formes de nœuds au-delà du cercle et du rectangle (losanges, étoiles, bulles). Subdivisée, par exemple shapes.geometric.
  • decorations — décorer un chemin en vague, zigzag, accolade, etc. (par exemple decorations.pathmorphing).
  • patterns — remplir avec un motif comme des hachures, lignes ou points.
  • fit — construire automatiquement une boîte entourant plusieurs nœuds.
  • backgrounds — dessiner un cadre ou un fond sur un calque arrière-plan derrière l’image.
  • matrix — aligner des nœuds en grille (matrice) ; graphdrawing fait la mise en page automatique (LuaTeX requis).

L’exemple suivant est un petit organigramme combinant arrows.meta et positioning. Seul le premier nœud reçoit une coordonnée ; les autres sont placés relativement (« à droite », « en dessous ») et reliés par des pointes de flèche de style Stealth.

document.tex
\usepackage{tikz}
\usetikzlibrary{arrows.meta, positioning}

\begin{tikzpicture}[node distance=1cm, every node/.style={draw, rounded corners}]
  \node (start)            {Start};
  \node (proc)  [right=of start] {Process};
  \node (end)   [right=of proc]  {End};
  \draw[-{Stealth}] (start) -- (proc);
  \draw[-{Stealth}] (proc)  -- (end);
\end{tikzpicture}

Cela produit un organigramme de gauche à droite : trois boîtes à coins arrondis nommées « Start », « Process » et « End », espacées de 1 cm et reliées dans l’ordre par des pointes Stealth nettes. L’astuce est every node/.style, qui donne d’un coup le même aspect à tous les nœuds.

Coût de compilation et externalize

Comme LaTeX calcule et dessine les figures TikZ élément par élément, des images complexes ou nombreuses rendent la compilation nettement lente. Les tracés et les grilles denses sont particulièrement lourds.

Le remède classique est la bibliothèque externalize. Chargez \usetikzlibrary{external} et déclarez \tikzexternalize : chaque tikzpicture est alors compilé une seule fois dans son propre PDF et mis en cache. Aux exécutions suivantes, si le contenu de la figure n’a pas changé, TikZ saute le calcul et inclut simplement le PDF déjà produit. Le premier passage est lent, mais les cycles d’édition suivants deviennent beaucoup plus rapides ; les figures se régénèrent automatiquement quand vous les modifiez. Vous pouvez aussi extraire une grande figure dans son propre fichier et la compiler seule avec la classe standalone.