Example 1

Nous souhaitons dessiner l’image suivante en utilisant le package tikz :

On commence par créer un fichier standalone avec le contenu suivant :

\documentclass{standalone}
\begin{document}
...
\end{document}

A l’intérieur du document, on charge le package tikz et on crée une figure en utilisant l’environnement tikzpicture :

\documentclass{standalone}

% Chargement du package tikz
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
% Dessin ici
\end{tikzpicture}
\end{document}

1 Version simple

On commence par dessiner un axe horizontal avec une flèche à son extrémité droite :

\draw[->, thick] (-0.5,0) -- (10.5,0);

Cette commande dessine une ligne épaisse avec une flèche allant du point (-0.5,0) au point (10.5,0). Le choix des coordonnées permet de laisser un peu d’espace avant le début de l’axe et après la fin de l’axe. La flèche est placée en utilisant l’option ->. L’option thick rend la ligne plus épaisse. Le résultat est le suivant :

Ensuite on peut ajouter des étiquettes sur l’axe en utilisant des segments verticaux et des nœuds pour les numéros. Par exemple, pour ajouter une étiquette sur le point 0, on peut utiliser la commande suivante :

\draw[-] (0, 0.2) -- (0, -0.2) node[below] {0};

La commande \draw[-] dessine une ligne allant du point (0, 0.2) au point (0, -0.2). L’option node[below] {0} ajoute un nœud contenant le texte 0 en dessous de la ligne. Le résultat est le suivant :

On peut répéter cette commande pour ajouter des étiquettes de 0 à 10 sur l’axe :

\draw[-] (0, 0.2) -- (0, -0.2) node[below] {0};
\draw[-] (1, 0.2) -- (1, -0.2) node[below] {1};
\draw[-] (2, 0.2) -- (2, -0.2) node[below] {2};
\draw[-] (3, 0.2) -- (3, -0.2) node[below] {3};
\draw[-] (4, 0.2) -- (4, -0.2) node[below] {4};
\draw[-] (5, 0.2) -- (5, -0.2) node[below] {5};
\draw[-] (6, 0.2) -- (6, -0.2) node[below] {6};
\draw[-] (7, 0.2) -- (7, -0.2) node[below] {7};
\draw[-] (8, 0.2) -- (8, -0.2) node[below] {8};
\draw[-] (9, 0.2) -- (9, -0.2) node[below] {9};
\draw[-] (10, 0.2) -- (10, -0.2) node[below] {10};

Voici le résultat final avec l’axe et les étiquettes :

On peut ensuite ajouter le rectangle bleu au-dessus de l’axe qui contient le text “Il était une fois” :

\node[
    rectangle,
    draw,
    fill=blue!20,
    rounded corners,
    minimum height=0.8cm,
    text width=3cm,
    align=center
] (fois) at (0.5, 2.5) {Il était une fois};
  • La commande \node[...] (fois) at (0.5, 2.5) {Il était une fois}; crée un nœud nommé fois à la position (0.5, 2.5) avec le texte “Il était une fois”.
  • L’option rectangle indique que le nœud doit être dessiné sous forme de rectangle.
  • L’option draw indique que le contour du rectangle doit être dessiné.
  • L’option fill=blue!20 remplit le rectangle avec une couleur bleue claire.
  • L’option rounded corners arrondit les coins du rectangle.
  • L’option minimum height=0.8cm définit la hauteur minimale du rectangle.
  • L’option text width=3cm définit la largeur du texte à l’intérieur du rectangle.
  • L’option align=center centre le texte à l’intérieur du rectangle.

Le résultat doit ressembler à ceci :

On peut ajouter les autres rectangles de la même manière :

\node[
    rectangle,
    draw,
    fill=blue!20,
    rounded corners,
    minimum height=0.8cm,
    text width=3cm,
    align=center
] (reine) at (2.25, -2) {une reine};

\node[
    rectangle,
    draw,
    fill=blue!20,
    rounded corners,
    minimum height=0.8cm,
    text width=3cm,
    align=center
] (roi) at (5.5, 2.5) {un roi};

\node[
    rectangle,
    draw,
    fill=red!20,
    rounded corners,
    minimum height=0.8cm,
    text width=3cm,
    align=center
] (fin) at (8.25, -2) {happy end};

Une fois ajoutés, le dessin ressemble à ceci :

Enfin, on peut ajouter les flèches entre qui relient les rectangles avec l’axe :

\draw[->, thick] (fois.south) -- (1, 0.2);
\draw[->, thick] (roi.south) -- (6, 0.2);
\draw[->, thick] (reine.north) -- (3, -0.2);
\draw[->, thick] (fin.north) -- (9, -0.2);
  • La commande \draw[->, thick] (fois.south) -- (1, 0.2); dessine une flèche épaisse allant du bas du nœud fois (indiqué par fois.south) au point (1, 0.2) sur l’axe, c’est-à-dire juste au-dessus de la graduation 1.
  • De même, les autres commandes dessinent des flèches reliant les autres nœuds aux points correspondants sur l’axe.

Le résultat final est le suivant :

Voici le code complet pour obtenir l’image souhaitée :

\documentclass{standalone}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
    \draw[->, thick] (-0.5, 0) -- (10.5, 0);
    \draw[-] (0, 0.2) -- (0, -0.2) node[below] {0};
    \draw[-] (1, 0.2) -- (1, -0.2) node[below] {1};
    \draw[-] (2, 0.2) -- (2, -0.2) node[below] {2};
    \draw[-] (3, 0.2) -- (3, -0.2) node[below] {3};
    \draw[-] (4, 0.2) -- (4, -0.2) node[below] {4};
    \draw[-] (5, 0.2) -- (5, -0.2) node[below] {5};
    \draw[-] (6, 0.2) -- (6, -0.2) node[below] {6};
    \draw[-] (7, 0.2) -- (7, -0.2) node[below] {7};
    \draw[-] (8, 0.2) -- (8, -0.2) node[below] {8};
    \draw[-] (9, 0.2) -- (9, -0.2) node[below] {9};
    \draw[-] (10, 0.2) -- (10, -0.2) node[below] {10};


    \node[
        rectangle,
        draw,
        fill=blue!20,
        rounded corners,
        minimum height=0.8cm,
        text width=3cm,
        align=center
    ] (fois) at (0.5, 2.5) {Il était une fois};

    \node[
        rectangle,
        draw,
        fill=blue!20,
        rounded corners,
        minimum height=0.8cm,
        text width=3cm,
        align=center
    ] (reine) at (2.25, -2) {une reine};

    \node[
        rectangle,
        draw,
        fill=blue!20,
        rounded corners,
        minimum height=0.8cm,
        text width=3cm,
        align=center
    ] (roi) at (5.5, 2.5) {un roi};

    \node[
        rectangle,
        draw,
        fill=red!20,
        rounded corners,
        minimum height=0.8cm,
        text width=3cm,
        align=center
    ] (fin) at (8.25, -2) {happy end};

    \draw[->, thick] (fois.south) -- (1, 0.2);
    \draw[->, thick] (roi.south) -- (6, 0.2);
    \draw[->, thick] (reine.north) -- (3, -0.2);
    \draw[->, thick] (fin.north) -- (9, -0.2);

\end{tikzpicture}
\end{document}

2 Version avancée

Le code précédent fonctionne bien, mais il peut être amélioré en utilisant des boucles pour dessiner les étiquettes de l’axe et en définissant des styles pour les nœuds afin de rendre le code plus lisible et plus facile à modifier.

  1. Utilisation d’une boucle pour les étiquettes de l’axe :
\foreach \x in {0,1,...,10} {
    \draw[-] (\x, 0.2) -- (\x, -0.2) node[below] {\x};
}
  1. Définition de styles pour les nœuds. En effet, pour éviter de répéter les mêmes options pour chaque nœud, on peut définir des styles personnalisés. La commande \tikzset{} permet de définir des styles réutilisables. Ci-dessous, nous définissons deux styles : genericbox pour les propriétés communes des boîtes, bluebox pour les boîtes bleues et redbox pour la boîte rouge.
\tikzset{
    genericbox/.style={
        rectangle,
        draw,
        rounded corners,
        minimum height=0.8cm,
        text width=3cm,
        align=center
    },
    bluebox/.style={
        genericbox,
        fill=blue!20
    },
    redbox/.style={
        genericbox,
        fill=red!20
    }
}
  1. Amélioration du positionnement des flèches. On peut observer que les flèches qui relient les boîtes à l’axe ne sont pas parfaitement alignées avec les graduations de l’axe. Pour améliorer cela, on peut définir des nœuds invisibles sur l’axe aux positions correspondantes et utiliser ces nœuds comme points de connexion pour les flèches. Voici comment définir ces nœuds invisibles :
\node[inner sep=0.2cm] (foisinstant) at (1, 0) {};
\node[inner sep=0.6cm] (reineinstant) at (3, 0) {};
\node[inner sep=0.2cm] (roinstant) at (6, 0) {};
\node[inner sep=0.6cm] (fininstant) at (9, 0) {};

Et voici comment modifier les commandes de dessin des flèches pour utiliser ces nœuds invisibles :

\draw[->, thick] (fois.south) -- (foisinstant.north);
\draw[->, thick] (roi.south) -- (roinstant.north);
\draw[->, thick] (reine.north) -- (reineinstant.south);
\draw[->, thick] (fin.north) -- (fininstant.south);

Voici le code complet amélioré :

\documentclass{standalone}
\usepackage{tikz}

\tikzset{
    box/.style={
        rectangle,
        draw,
        fill=gray!20,
        rounded corners,
        minimum height=0.8cm,
        text width=3cm,
        align=center
    },
    bluebox/.style={
        box,
        fill=blue!20
    },
    redbox/.style={
        box,
        fill=red!20
    }
}

\begin{document}
\begin{tikzpicture}
    \draw[->, thick] (-0.5, 0) -- (10.5, 0);
    \foreach \x in {0,1,...,10} {
        \draw[-] (\x, 0.2) -- (\x, -0.2) node[below] {\x};
    }

    \node[bluebox] (fois) at (0.5, 2.5) {Il était une fois};
    \node[bluebox] (reine) at (2.25, -2) {une reine};
    \node[bluebox] (roi) at (5.5, 2.5) {un roi};
    \node[redbox] (fin) at (8.25, -2) {happy end};

    \node[inner sep=0.2cm] (foisinstant) at (1, 0) {};
    \node[inner sep=0.6cm] (reineinstant) at (3, 0) {};
    \node[inner sep=0.2cm] (roinstant) at (6, 0) {};
    \node[inner sep=0.6cm] (fininstant) at (9, 0) {};

    \draw[->, thick] (fois.south) -- (foisinstant.north);
    \draw[->, thick] (roi.south) -- (roinstant.north);
    \draw[->, thick] (reine.north) -- (reineinstant.south);
    \draw[->, thick] (fin.north) -- (fininstant.south);

\end{tikzpicture}
\end{document}

Le résultat final est: