Das Handbuch von forest beginnt mit einem Geständnis des Autors: Jahrelang habe er qtree und synttree dankbar benutzt, doch alle verfügbaren Werkzeuge hätten denselben Makel – die Bäume gerieten manchmal schlicht zu breit. Aus diesem einen Ärgernis entstand, was heute die erste Wahl ist, um in LaTeX Bäume zu zeichnen: Syntaxbäume, Verzeichnisbäume, Entscheidungs- und Wahrscheinlichkeitsbäume. Die älteren qtree und tikz-qtree leben jedoch weiter, und ihre Klammernotationen sehen fast gleich aus, unterscheiden sich aber an genau einer entscheidenden Stelle. Wer ohne dieses Wissen wechselt, erhält ganz ohne Fehlermeldung einen Knoten, der wörtlich .S heißt. Diese Seite führt von diesem Unterschied bis zur Wahl des passenden Werkzeugs.
Klammernotation: einen Baum ohne eine einzige Koordinate bauen
Alle Werkzeuge zum Baumzeichnen nehmen verschachtelte Klammern als Eingabe, weil ein Baum selbst rekursiv ist. Es gibt eine Wurzel, darunter hängen Kinder, diese haben Enkel – spiegelt man diese Verschachtelung mit verschachtelten [ ], wird die gesamte Koordinatenrechnung zur Sache des Werkzeugs. In forest schreibt man [S [NP] [VP]], in qtree \Tree [.S [.NP ] [.VP ] ]. Getippt wird nicht ein Layout, sondern eine Struktur.
Praktisch bestehen drei Optionen. forest (Sašo Živanović; v2.1.5 in TeX Live 2024), auf TikZ und pgfkeys gebaut, ist am flexibelsten und übernimmt das Layout. Die Klassiker, um einen linguistischen Syntaxbaum mit möglichst wenigen Anschlägen zu zeichnen, sind qtree (v3.1b) und tikz-qtree (David Chiang, v1.2), das dieselbe Notation auf TikZ neu umsetzt. Und für einen Baum mit wenigen Ebenen, für den man kein Paket hinzufügen möchte, genügt TikZs eigene Bibliothek trees mit child und node. Unten klären wir zuerst den Unterschied der beiden Klammernotationen und gehen dann die Werkzeuge einzeln durch.
Der Unterschied zwischen [.S [.NP ]] und [S [NP]]: forest kennt qtrees Punkt nicht
Kurz gesagt: In qtree markiert ein führender Punkt „dies ist ein verzweigender Knoten“, in forest ist der Punkt nur ein Zeichen. In qtree bedeutet [.S ... ] „ein nichtterminaler Knoten namens S“, und ein bloßes Wort ohne Punkt ist ein Blatt. forest kennt diese Konvention nicht: Alles vom [ bis zur nächsten [ oder ] ist das Label. Übergibt man forest also [.S [.NP Kim ]], entstehen – völlig ohne Fehlermeldung – zwei Knoten mit den Labels .S und .NP Kim. Kim wird kein Blatt, sondern landet in derselben Box wie .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}Der Fehler in die Gegenrichtung scheitert weit lautstärker. qtree verlangt Leerraum vor einer schließenden ]; schreibt man [.NP Kim] eng, erhält man ! LaTeX Error: \begin{tabular} on input line 5 ended by \end{document}. – eine Fehlermeldung, die tabular nennt, obwohl das Dokument keine einzige Tabelle enthält. Dasselbe bei tikz-qtree ergibt ! Emergency stop. und gar kein PDF. Eine an forest gewöhnte Hand stolpert genau hier, sobald sie eine qtree-Quelle anfasst. Kurz: keine der beiden Notationen nimmt die andere stillschweigend an; beim Umziehen einer Datei sind Paket und Notation daher stets gemeinsam zu prüfen.
Das automatische Layout von forest – und Abstände von Hand nachziehen
Das Kernmerkmal von forest ist die Antwort auf die Klage vom Seitenanfang, Bäume würden zu breit: automatisches Packing. Jeder Knoten wird nach der tatsächlichen Breite des von ihm beherrschten Teilbaums platziert, und Geschwister rücken so nah zusammen, wie es ohne Kollision geht; selbst ein dichter Baum sieht dadurch von allein brauchbar aus. Zum Eingreifen wendet man for tree={...} auf den ganzen Baum oder einen Teilbaum an. Die drei häufigsten Schlüssel sind s sep (waagerechter Abstand zwischen Geschwistern), l (senkrechter Abstand zwischen Ebenen) und inner sep (Innenabstand um den Knoteninhalt).
\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}Dieses kurze Beispiel enthält fast alle Idiome von forest. Das einleitende for tree={...} wird zum Standard für den gesamten Baum, und ein Komma hinter dem Knotenlabel – wie in [IP, for tree={s sep=20mm} – überschreibt die Einstellung nur für diesen Teilbaum. Gibt man einem Knoten ein name=, lässt sich nach dem Schließen des Baums mit \draw[->] (src) to[...] (tgt); ein Bewegungspfeil zeichnen, denn TikZ-Befehle funktionieren innerhalb einer forest-Umgebung direkt. Soll ein Komma im Label stehen, setzt man es in geschweifte Klammern wie {NP, PP}, damit es nicht als Layoutanweisung gelesen wird. Und wer nicht jedes Mal dasselbe Aussehen tippen will, definiert in der Präambel \forestset{default preamble={for tree={...}}}.
Und hier die häufigste Falle: Eine Leerzeile in einer forest-Quelle lässt das Parsen scheitern. Für TeX ist eine Leerzeile ein Absatzumbruch, also bricht die Analyse mitten im Baum ab, und es erscheint ! Paragraph ended before \forestOappto was complete. – eine Meldung, die mit Bäumen nichts zu tun zu haben scheint. Der Wunsch, einen langen Baum aufzulockern, ist verständlich, aber Zeilenumbrüche und Einrückung sind erlaubt, Leerzeilen nicht. Die Einrücktiefe ist dagegen völlig frei und eignet sich bestens dazu, die Hierarchie sichtbar zu machen.
Die Bibliotheken linguistics und edges: ohne sie gibt es weder roof noch folder
Ein Teil der Funktionalität von forest steckt in Bibliotheken, die als Optionen geladen werden müssen, etwa \usepackage[linguistics]{forest}. Am häufigsten stolpert man über roof, das einer Phrase ein dreieckiges „Dach“ aufsetzt. Es ist nicht im Kern von forest definiert, sondern in der Bibliothek linguistics; wer unter einem schlichten \usepackage{forest} [DP, roof [the woman]] schreibt, bleibt bei ! Package pgfkeys Error: I do not know the key '/tikz/roof' stehen. Ebenso gehört folder, der aus Verzeichnisdiagrammen vertraute Stil, zur Bibliothek edges.
Es hilft außerdem zu wissen, was die Bibliothek linguistics tatsächlich bewirkt. Erstens sn edges: forest verbindet Eltern und Kind standardmäßig von Rand zu Rand; dies stellt die Kante auf von der Unterkante (south) des Elternknotens zur Oberkante (north) des Kindes um – die aus linguistischen Syntaxbäumen vertraute Form. Zweitens richtet es die Grundlinie an der Wurzel aus, weshalb der Baum mit der Beispielnummer oder der Glosse daneben auf gleicher Höhe steht. Drittens definiert es Nodewalks für die C-Kommando-Relation, sodass sich mit c-commanded und c-commanders die ganze Menge betroffener Knoten auf einmal ansprechen lässt. Die Bibliothek edges liefert neben folder auch forked edge / forked edges, die die Zweige rechtwinklig knicken.
qtree und tikz-qtree: ein Syntaxbaum in einer Zeile
Für einen schnell hingeworfenen Syntaxbaum ist die \Tree-Notation nach wie vor der kürzeste Weg. \usepackage{qtree} laden, eine Zeile schreiben – \Tree [.S [.NP Kim ] [.VP [.V saw ] [.NP Lee ] ] ] – und der Baum steht. Im Inneren fließen zwei Arbeiten zusammen: Die baumzeichnenden Makros selbst sind Jeffrey Mark Siskinds QobiTree, und das Frontend samt Erweiterungen, das sie von LaTeX aus bequem macht, stammt von Alexis Dimitriadis. Seit Version 3.0b (2005) werden die Linien mit pict2e gezogen, sodass DVI/PostScript und direkte PDF-Ausgabe dasselbe Ergebnis liefern.
qtree bringt eine Reihe von Bequemlichkeiten mit, die genau auf Syntaxbäume zielen. Im Baum werden NP_i und N^0 automatisch als Tief- und Hochstellung im Mathematikmodus gesetzt, und X\1 kürzt X$'$ (X′) ab. Ein Dreieck über einer Phrase schreibt man als \qroof{out of style}.PP – dieselbe Aufgabe wie forests roof, nur anders geschrieben. Bäume werden standardmäßig zentriert; für linksbündige lädt man \usepackage[nocenter]{qtree}.
tikz-qtree (David Chiang) baut dieselbe \Tree-Notation auf TikZ neu auf. Lädt man \usepackage{tikz} und \usepackage{tikz-qtree} zusammen, läuft dieselbe Quelle unverändert durch. Der Autor nennt drei Gewinne: Es platziert Knoten kollisionsfrei, anders als TikZs Standardbäume; es ergänzt qtree um TikZ-Funktionen – Kantenbeschriftungen, Pfeile zwischen Knoten; und anders als pst-qtree funktioniert es mit pdfTeX und XeTeX. Auch die Wuchsrichtung lässt sich ändern: Gibt man der tikzpicture ein [grow'=right], wächst der Baum von links nach rechts. Die Kompatibilität ist hoch, aber nicht vollständig; kompilieren und hinsehen, bevor man einen komplizierten Baum umzieht.
\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}Bäume jenseits der Syntax: Verzeichnisse, Entscheidungen, Wahrscheinlichkeiten
forest ist kein reines Linguistikwerkzeug. Für ein Verzeichnisdiagramm ist die Standardkombination folder aus der Bibliothek edges zusammen mit grow'=east: Der Baum breitet sich von links nach rechts aus, mit den rechtwinkligen Zweigen, die man als Ordner liest. Für einen Entscheidungs- oder Wahrscheinlichkeitsbaum möchte man Zahlen an den Zweigen selbst – und da ein forest-Zweig ein TikZ-Pfad ist, schreibt ein angehängter Knoten wie edge label={node[midway,above]{0.3}} die Wahrscheinlichkeit oder Bedingung direkt auf die Kante. Das mit forest gelieferte Handbuch enthält ein ausgearbeitetes Beispiel für einen Entscheidungsbaum.
\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}Für einen Baum mit wenigen Ebenen, dem man gar kein neues Paket hinzufügen möchte, genügt TikZs eigene Bibliothek trees. Man setzt einen Knoten, lässt child {...} folgen, und der Inhalt wird als Kind angeordnet, die Kante vom Eltern- zum Kindknoten wird gezeichnet. In einem child schreibt man üblicherweise node {...} und verschachtelt weitere childs für Enkel. Zwei Abstände bestimmen die Platzierung: der senkrechte Abstand zwischen Eltern- und Kindebene, level distance, und der Abstand nebeneinanderstehender Geschwister, sibling distance – beide standardmäßig 15 mm. Pro Ebene ändert man sie mit level ⟨n⟩/.style, etwa level 1/.style={sibling distance=4cm}; die Wuchsrichtung stellt [grow=right] und Verwandtes ein, die Zweigform steuert edge from parent (edge from parent fork down für rechtwinklige Verbinder).
\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}Eine Sache ist zu beachten: Für den ganzen Baum gibt es genau ein Semikolon ;, am Ende von \node ... ;. Und reines TikZ kennt kein automatisches Packing wie forest; mit wachsender Kinderzahl oder Tiefe weitet man sibling distance also von Hand, damit nichts überlappt. Für einen kleinen Baum mit wenigen Ebenen ist das völlig in Ordnung – doch sobald man sich wünscht, der Abstand möge dem Inhalt folgen, ist das das Signal, zu forest zu wechseln.
Welches Werkzeug wählen
Im Zweifel gilt: Für einen neu gezeichneten Baum forest. Das Layout erledigt sich von selbst, die Reichweite geht von der Linguistik bis zu allgemeinen Diagrammen, und für die Gestaltung steht ganz TikZ bereit. Übernimmt man eine bestehende \Tree-Quelle oder schreibt eine Mitautorin in \Tree, bleibt man bei qtree / tikz-qtree – von beiden liefert tikz-qtree die bessere Ausgabe und mehr Spielraum. Für einen Baum mit wenigen Ebenen ganz ohne neue Abhängigkeit genügt child aus reinem TikZ. Alle vier liegen auf CTAN; forest und tikz-qtree unter graphics/pgf/contrib/, abhängig von TikZ/pgf. Für Einzelheiten ist texdoc forest, texdoc qtree oder texdoc tikz-qtree auf dem eigenen Rechner die verlässlichste Quelle.
| Werkzeug | Notation | Geeignet für |
|---|---|---|
forest | [S [NP] [VP]] (ohne Punkte) | jeder neue Baum; Auto-Packing, von Linguistik bis Entscheidungsbaum |
qtree | \Tree [.S [.NP Kim ] ] (Punkte und Leerzeichen nötig) | der kürzeste Syntaxbaum; leichtgewichtig, auf pict2e |
tikz-qtree | \Tree (wie qtree) | dieselbe Notation in TikZ-Qualität; auch Kantenlabels und Pfeile |
tikz trees library | \node {r} child {node {a}}; | kleiner Baum mit wenigen Ebenen, ohne Zusatzpaket |
Zum Schluss eine praktische Bemerkung. Sehr viele Leute wollen einen Syntaxbaum auf eine Konferenzfolie oder in Vorlesungsunterlagen bringen; dann ist es oft schneller, den Baum als eigenständiges Bild zu exportieren und in PowerPoint oder Keynote einzufügen, statt ihn im LaTeX-Dokument zu belassen. Da forest und tikz-qtree auf TikZ aufsetzen, wird der Baum, in die Klasse standalone verpackt, unmittelbar zu einem eng zugeschnittenen PDF oder SVG. Die Seite zum Bildexport führt das Schritt für Schritt vor.