Le manuel de forest s'ouvre sur un aveu de son auteur : pendant des années, il avait été un utilisateur reconnaissant de qtree et de synttree, mais tous les outils disponibles souffraient du même défaut — les arbres sortaient parfois beaucoup trop larges. De cette seule contrariété est né ce qui constitue aujourd'hui le premier choix pour dessiner des arbres en LaTeX : arbres syntaxiques, arborescences de fichiers, arbres de décision, arbres de probabilité. Les vétérans qtree et tikz-qtree restent toutefois bien vivants, et leurs notations à crochets se ressemblent énormément tout en différant sur un point décisif. Migrer sans le savoir donne, sans la moindre erreur, un nœud littéralement nommé .S. Cette page va de cette différence jusqu'au choix de l'outil.
Notation à crochets : un arbre sans la moindre coordonnée
Tous les outils de dessin d'arbres prennent des crochets imbriqués en entrée, parce qu'un arbre est lui-même une structure récursive. Il y a une racine, des enfants en dessous, puis des petits-enfants — reproduisez cette imbrication avec des [ ] imbriqués et tout le calcul de coordonnées devient l'affaire de l'outil. Dans forest, on écrit [S [NP] [VP]] ; dans qtree, \Tree [.S [.NP ] [.VP ] ]. Ce que l'on saisit n'est pas une mise en page mais une structure.
Il y a en pratique trois options. forest (Sašo Živanović ; v2.1.5 dans TeX Live 2024), bâti sur TikZ et pgfkeys, est le plus souple et se charge de la mise en page. Les classiques pour tracer un arbre syntaxique linguistique en un minimum de frappes sont qtree (v3.1b) et tikz-qtree (David Chiang, v1.2), qui réimplémente la même notation sur TikZ. Et pour un arbre de quelques niveaux auquel on ne veut pas ajouter de paquet, la bibliothèque trees de TikZ elle-même — child et node — suffit. Ci-dessous, on règle d'abord la différence entre les deux notations à crochets, puis on examine chaque outil.
La différence entre [.S [.NP ]] et [S [NP]] : le point de qtree ne dit rien à forest
En bref : dans qtree, un point initial signale « ceci est un nœud ramifié », alors que dans forest un point n'est qu'un caractère. Dans qtree, [.S ... ] signifie « un nœud non terminal nommé S », et un mot nu sans point est une feuille. forest ne connaît pas cette convention : tout ce qui va du [ jusqu'au [ ou ] suivant constitue l'étiquette. Donner à forest un [.S [.NP Kim ]] produit donc — sans la moindre erreur — deux nœuds étiquetés .S et .NP Kim. Kim ne devient pas une feuille : il se retrouve dans la même boîte que .NP.
% qtree / tikz-qtree: a leading dot marks a branching node,
% and a closing ] must be preceded by whitespace
\Tree [.S [.NP Kim ] [.VP [.V saw ] [.NP Lee ] ] ]
% forest: no dots, and every word is a node of its own
\begin{forest}
[S
[NP [Kim]]
[VP [V [saw]] [NP [Lee]]]
]
\end{forest}L'erreur dans l'autre sens échoue de façon bien plus bruyante. qtree exige une espace avant un ] fermant ; écrire [.NP Kim] serré donne ! LaTeX Error: \begin{tabular} on input line 5 ended by \end{document}. — une erreur qui invoque tabular dans un document sans le moindre tableau. La même chose avec tikz-qtree donne ! Emergency stop. et pas de PDF du tout. Une main habituée à forest bute d'abord là dès qu'elle touche une source qtree. Bref, aucune des deux notations n'accepte l'autre en silence : en déplaçant un fichier de l'une à l'autre, vérifiez le paquet et la notation ensemble.
La mise en page automatique de forest, et le resserrement manuel
La fonction centrale de forest est la réponse à la plainte du début de page, celle des arbres trop larges : le compactage automatique. Chaque nœud est placé selon la largeur réelle du sous-arbre qu'il domine, et les frères se rapprochent autant que possible sans se chevaucher ; même un arbre chargé sort donc à peu près présentable. Pour intervenir, on applique for tree={...} à l'arbre entier ou à un sous-arbre. Les trois clés les plus utilisées sont s sep (écart horizontal entre frères), l (distance verticale entre niveaux) et inner sep (marge autour du contenu d'un nœud).
\usepackage[linguistics]{forest}
\begin{forest}
for tree={s sep=10mm, inner sep=0, l=0}
[CP
[C]
[IP, for tree={s sep=20mm}
[I, name=src]
[VP
[V]
[DP, roof, name=tgt [the woman]]
]
]
]
\draw[->] (src) to[out=south west, in=south] (tgt);
\end{forest}Ce court exemple concentre l'essentiel des idiomes de forest. Le for tree={...} initial devient le réglage par défaut de tout l'arbre, et une virgule après une étiquette de nœud — comme dans [IP, for tree={s sep=20mm} — ne remplace le réglage que pour ce sous-arbre. Donnez à un nœud un name= et, une fois l'arbre refermé, vous pouvez tracer une flèche de mouvement par \draw[->] (src) to[...] (tgt);, car les commandes TikZ fonctionnent directement dans un environnement forest. Pour placer une virgule dans une étiquette, entourez-la d'accolades comme {NP, PP}, afin qu'elle ne soit pas lue comme une instruction de mise en page. Et si vous ne voulez pas réécrire le même aspect à chaque fois, définissez un défaut dans le préambule avec \forestset{default preamble={for tree={...}}}.
Et voici l'écueil le plus fréquent : une ligne vide dans une source forest fait échouer l'analyse. Pour TeX, une ligne vide est une fin de paragraphe : l'analyse s'interrompt donc en plein arbre et l'on obtient ! Paragraph ended before \forestOappto was complete., une erreur qui semble sans rapport avec les arbres. L'envie d'aérer un arbre long se comprend, mais les retours à la ligne et l'indentation sont permis, les lignes vides non. La profondeur d'indentation, elle, est totalement libre : servez-vous-en pour montrer la hiérarchie.
Les bibliothèques linguistics et edges : sans elles, ni roof ni folder n'existent
Une partie des fonctions de forest réside dans des bibliothèques qu'il faut charger en option, par exemple \usepackage[linguistics]{forest}. Celle sur laquelle on bute le plus est roof, qui coiffe un syntagme d'un « toit » triangulaire. Elle n'est pas définie dans le cœur de forest mais dans la bibliothèque linguistics : écrire [DP, roof [the woman]] sous un simple \usepackage{forest} s'arrête sur ! Package pgfkeys Error: I do not know the key '/tikz/roof'. De même, folder, le style que tout le monde reconnaît dans les arborescences de fichiers, appartient à la bibliothèque edges.
Il est également utile de savoir ce que fait réellement la bibliothèque linguistics. D'abord sn edges : par défaut, forest relie parent et enfant de bord à bord ; cette clé fait passer l'arête du bas (south) du parent au haut (north) de l'enfant — la forme familière des arbres syntaxiques en linguistique. Ensuite, elle aligne la ligne de base sur la racine, ce qui explique que l'arbre se cale sur le numéro d'exemple ou la glose voisine. Enfin, elle définit des parcours de nœuds liés au c-commande, si bien que c-commanded et c-commanders désignent d'un coup tout cet ensemble de nœuds. La bibliothèque edges, elle, fournit folder ainsi que forked edge / forked edges, qui plient les branches à angle droit.
qtree et tikz-qtree : un arbre syntaxique sur une ligne
Pour tracer vite fait un arbre syntaxique, la notation \Tree reste le chemin le plus court. Chargez \usepackage{qtree} et une seule ligne — \Tree [.S [.NP Kim ] [.VP [.V saw ] [.NP Lee ] ] ] — produit l'arbre. À l'intérieur, deux travaux confluent : les macros de tracé sont le QobiTree de Jeffrey Mark Siskind, et le frontal et les extensions qui les rendent commodes depuis LaTeX sont d'Alexis Dimitriadis. Depuis la version 3.0b (2005), les traits sont tracés avec pict2e, si bien que la voie DVI/PostScript et la sortie PDF directe donnent le même résultat.
qtree embarque un jeu de commodités pensées pour les arbres syntaxiques. Dans un arbre, NP_i et N^0 deviennent automatiquement indice et exposant en mode mathématique, et X\1 abrège X$'$ (X′). Pour coiffer un syntagme d'un triangle, on écrit \qroof{out of style}.PP — le même office que le roof de forest, orthographié autrement. Les arbres sont centrés par défaut ; chargez \usepackage[nocenter]{qtree} pour les aligner à gauche.
tikz-qtree (David Chiang) reconstruit la même notation \Tree sur TikZ. Chargez \usepackage{tikz} et \usepackage{tikz-qtree} ensemble et la même source passe telle quelle. Son auteur cite trois gains : il place les nœuds sans collision, contrairement aux arbres standard de TikZ ; il ajoute à qtree les fonctions de TikZ — étiquettes d'arêtes, flèches entre nœuds ; et, à la différence de pst-qtree, il fonctionne avec pdfTeX et XeTeX. Le sens de croissance est également réglable : donnez à la tikzpicture un [grow'=right] et l'arbre pousse de gauche à droite. La compatibilité est forte sans être totale : compilez et regardez avant de confier un arbre compliqué au déménagement.
\usepackage{tikz}
\usepackage{tikz-qtree}
% sideways tree: grow to the right instead of downwards
\begin{tikzpicture}[grow'=right]
\Tree [.S [.NP Kim ] [.VP [.V saw ] [.NP Lee ] ] ]
\end{tikzpicture}Des arbres qui ne sont pas syntaxiques : répertoires, décisions, probabilités
forest n'est pas un outil réservé à la linguistique. Pour une arborescence de fichiers, la combinaison classique associe folder, de la bibliothèque edges, à grow'=east : l'arbre se déploie de gauche à droite avec les branches à angle droit qui évoquent des dossiers. Pour un arbre de décision ou de probabilité, on veut des nombres sur les branches elles-mêmes — et comme une branche de forest est un chemin TikZ, y accrocher un nœud par edge label={node[midway,above]{0.3}} inscrit la probabilité ou la condition directement sur l'arête. Le manuel livré avec forest contient un exemple d'arbre de décision entièrement traité.
\usepackage[edges]{forest}
% a file hierarchy: right-angled branches, growing to the right
\begin{forest}
for tree={grow'=east, folder, s sep=1mm}
[project
[src [main.tex] [chapters]]
[figures [plot.pdf]]
]
\end{forest}
% a probability tree: labels ride on the edges
\begin{forest}
for tree={grow'=east, l sep=18mm, s sep=6mm, anchor=west}
[start
[rain, edge label={node[midway,above,font=\scriptsize]{0.3}}]
[dry, edge label={node[midway,below,font=\scriptsize]{0.7}}]
]
\end{forest}Pour un arbre de quelques niveaux auquel on ne veut ajouter aucun paquet, la bibliothèque trees de TikZ suffit. Placez un nœud, faites-le suivre de child {...} : le contenu est disposé comme enfant et l'arête parent-enfant est tracée pour vous. Dans un child, on écrit d'ordinaire node {...}, et l'on imbrique d'autres child pour les petits-enfants. Deux distances gouvernent le placement : l'écart vertical entre le niveau du parent et celui des enfants, level distance, et l'écart entre frères voisins, sibling distance — toutes deux à 15 mm par défaut. Pour les faire varier par niveau, utilisez level ⟨n⟩/.style, comme dans level 1/.style={sibling distance=4cm} ; le sens de croissance se règle avec [grow=right] et consorts, et la forme des branches par edge from parent (edge from parent fork down pour des connecteurs à angle droit).
\usetikzlibrary{trees}
\begin{tikzpicture}[level distance=12mm, sibling distance=24mm]
\node {root}
child { node {a} }
child { node {b}
child { node {c} }
child { node {d} }
}; % one semicolon for the whole tree
\end{tikzpicture}Attention à un détail : il n'y a qu'un seul point-virgule ; pour tout l'arbre, à la fin de \node ... ;. Et TikZ pur ne dispose pas du compactage automatique de forest : à mesure que le nombre d'enfants ou la profondeur augmente, vous élargirez sibling distance à la main pour éviter les chevauchements. C'est parfait pour un petit arbre de quelques niveaux — mais dès que l'on se surprend à souhaiter que l'espacement suive le contenu, c'est le signal qu'il faut passer à forest.
Lequel choisir
En cas de doute, forest pour un arbre dessiné de zéro. La mise en page se fait seule, la couverture va de la linguistique aux diagrammes généraux, et tout TikZ reste disponible pour la décoration. Si vous héritez d'une source \Tree existante, ou si un coauteur écrit en \Tree, restez sur qtree / tikz-qtree — des deux, tikz-qtree donne une meilleure sortie et plus de marge de réglage. Pour un arbre de quelques niveaux sans aucune dépendance nouvelle, le child de TikZ pur convient. Les quatre sont sur CTAN ; forest et tikz-qtree sous graphics/pgf/contrib/, tributaires de TikZ/pgf. Pour le détail, la référence la plus sûre est texdoc forest, texdoc qtree ou texdoc tikz-qtree sur votre propre machine.
| Outil | Notation | Usage adapté |
|---|---|---|
forest | [S [NP] [VP]] (sans points) | tout nouvel arbre ; compactage auto, de la linguistique aux arbres de décision |
qtree | \Tree [.S [.NP Kim ] ] (points et espaces requis) | l'arbre syntaxique le plus court ; léger, fondé sur pict2e |
tikz-qtree | \Tree (comme qtree) | la même notation en qualité TikZ ; étiquettes d'arêtes et flèches |
tikz trees library | \node {r} child {node {a}}; | petit arbre de quelques niveaux, sans paquet supplémentaire |
Une remarque pratique pour finir. Beaucoup de gens veulent un arbre syntaxique sur une diapositive de colloque ou dans un support de cours ; il est alors souvent plus rapide d'exporter l'arbre comme image autonome et de le coller dans PowerPoint ou Keynote que de le garder dans un document LaTeX. Comme forest et tikz-qtree reposent sur TikZ, envelopper l'arbre dans la classe standalone en fait directement un PDF ou un SVG rogné au plus près. La page consacrée à l'export d'images détaille la marche à suivre.