Bäume (forest/qtree)

Syntaxbäume, Taxonomien, Entscheidungsbäume, B-Bäume: Für verzweigte Diagramme in LaTeX gibt es im Wesentlichen drei Werkzeuge. Am mächtigsten und modernsten ist forest; der schnellste Standard für linguistische Syntaxbäume ist qtree / tikz-qtree; und für kleine Bäume ohne Zusatzpaket reicht reines TikZ. Alle drei beschreiben die verschachtelte Struktur „Elternknoten wächst zu Kindern“ ohne eine einzige Koordinate auszurechnen. Diese Seite zeigt, wann man welches nimmt und wie es geschrieben wird.

Drei Ansätze

Ein Baum ist im Kern eine verschachtelte, rekursive Struktur: Es gibt eine Wurzel, darunter hängen Kinder, diese Kinder haben Enkel und so weiter. Wenn diese Verschachtelung mit verschachtelten Klammern gespiegelt wird, lässt sich ein Baum ohne Koordinaten bauen. Alle drei Werkzeuge folgen dieser Idee, unterscheiden sich aber im Schreibgefühl und in der Reichweite.

  • forest — das flexibelste Paket, gebaut auf TikZ und pgfkeys. Zur beschrifteten Klammernotation [root [child] [child]] kommen Optionen pro Knoten und ein Stil für den ganzen Baum; Abstände werden je nach Komplexität der Knoten automatisch gepackt. Geeignet für Linguistik und allgemeine Bäume.
  • qtree / tikz-qtree — der schnellste Standard für linguistische Syntaxbäume. Man schreibt \Tree [.S [.NP ... ] [.VP ... ] ], wobei .label einen nichtterminalen, verzweigenden Knoten markiert. tikz-qtree implementiert dieselbe Notation auf TikZ neu, mit schönerer Ausgabe und mehr Kontrolle.
  • Reines TikZ (die Bibliothek trees) — der child-/node-Mechanismus, \node {root} child {node {a}} child {node {b}};. Kein Zusatzpaket und gut für kleine Bäume direkt im Dokument.

Kurz gesagt: forest ist am flexibelsten und eignet sich für aufwendige Bäume, während qtree / tikz-qtree am schnellsten für Konstituentenbäume sind. Reines TikZ fügt keine Abhängigkeit hinzu und ist für kleine Aufgaben wendig. Wir gehen sie der Reihe nach durch.

forest: moderne Bäume in Klammern

forest (von Sašo Živanović, auf CTAN) ist ein Baumzeichenpaket auf TikZ und pgfkeys. Man lädt es in der Präambel und schreibt den Baum in beschrifteter Klammernotation innerhalb einer forest-Umgebung. Jeder Knoten steht in eckigen Klammern [ ], und seine Kinder werden darin aufgeführt; die Klammerstruktur *ist* die Baumstruktur. Für Linguistik sorgt die Option linguistics dafür, dass Zweige oberhalb der beiden Kinder zusammentreffen.

document.tex
\usepackage[linguistics]{forest}

\begin{forest}
[CP
  [C]
  [IP
    [I]
    [VP
      [V]
      [NP]
    ]
  ]
]
\end{forest}

Dieses Beispiel zeichnet einen Baum mit Wurzel CP über C und IP, IP über I und VP, und VP über V und NP. Auf eine Zeile gepackt, [CP[C][IP[I][VP[V][NP]]]], ergibt es denselben Baum, aber bei Komplexität werden Klammern schwer zuzuordnen; daher zeigt man die Hierarchie üblicherweise mit Zeilenumbrüchen und Einrückung. Ein Fallstrick: Eine Leerzeile in der Quelle lässt forest beim Parsen scheitern, weil sie als Absatzumbruch gelesen wird. Einrückung selbst ist frei.

Die Stärke von forest liegt im automatischen Layout. Es positioniert jeden Knoten entsprechend der Komplexität dessen, was er dominiert, und packt die Knoten horizontal so, dass sie nicht kollidieren. Selbst ein dichter Baum ist dadurch fast sofort brauchbar. Wenn du Abstände von Hand steuern willst, wende for tree={...} auf den ganzen Baum oder einen Teilbaum an. Am häufigsten nutzt man s sep (horizontaler Abstand), l (vertikaler Abstand zwischen Ebenen) und inner sep (Innenabstand um einen Knoten).

document.tex
\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 Beispiel enthält mehrere Idiome. Das führende for tree={...} setzt die Abstände des ganzen Baums, und ein Komma nach dem Knotenlabel, wie in [IP, for tree={s sep=20mm}, überschreibt die Abstände nur für diesen Teilbaum. roof setzt ein Dreieck, ein „Dach“, über das Label des Knotens, um interne Struktur abzukürzen und eine Phrase als Einheit zu zeigen. Mit name= gibst du einem Knoten einen Namen und kannst nach der schließenden Baumklammer mit \draw[->] (src) to[...] (tgt); einen Bewegungspfeil zeichnen; in forest sind TikZ-Befehle direkt nutzbar. Soll ein Komma *im* Label stehen, setze das Label in geschweifte Klammern wie {NP, PP}, damit es nicht als Layoutanweisung gelesen wird.

Wenn du nicht jedes Mal dasselbe Aussehen schreiben willst, definiere in der Präambel mit \forestset{default preamble={for tree={...}}} einen Standardstil. Da forest auf TikZ/pgf aufbaut, folgt die feine Gestaltung von Knoten, also Form, Farbe, Pfeilspitzen und Hervorhebung, direkt aus dem TikZ-Wissen (Grundlagen unter „TikZ basics“).

qtree / tikz-qtree: der kürzeste Weg zum Syntaxbaum

Für schnell gezeichnete Konstituenten- oder Syntaxbäume war lange qtree der Standard. In der Präambel steht \usepackage{qtree}, im Text folgt auf \Tree ein geklammerter Baum. Der Kern der Notation: Ein Label mit vorangestelltem Punkt . markiert einen nichtterminalen, verzweigenden Knoten, ein bloßes Wort ohne Punkt ist ein Blatt, ein Terminal.

latex
\Tree [.S [.NP Kim ] [.VP [.V saw ] NP ] ]

Diese eine Zeile zeichnet einen Baum mit Wurzel S über NP und VP, NP mit dem Blatt Kim, und VP über V (Blatt saw) und NP. Einige Regeln gelten: Der Baum muss direkt nach \Tree stehen; nichtterminale Labels beginnen mit einem Punkt (.S); und vor einer schließenden Klammer ] muss Leerraum stehen (wie in saw ]). qtree bietet auch Bequemlichkeiten: NP_i und N^0 werden im Baum automatisch als Tief- und Hochstellungen im Mathematikmodus formatiert, X\1 kürzt X$'$ (X′) ab, und \qroof{...} legt ein dreieckiges Dach über eine Phrase, etwa \qroof{out of style}.PP. Automatisches Zentrieren schaltest du mit \usepackage[nocenter]{qtree} aus.

tikz-qtree (von David Chiang) implementiert diese \Tree-Notation auf TikZ neu. Mit \usepackage{tikz} und \usepackage{tikz-qtree} funktioniert dasselbe \Tree [.S ... ] unverändert, nun in TikZ-Qualität. Für einfache Bäume ist es mit qtree fast vollständig austauschbar; außerdem greift TikZs Stilmechanismus, wodurch Pfeile und Zweige leichter anzupassen sind. So lässt \tikzset{grow'=right} den Baum von links nach rechts statt von oben nach unten wachsen. Während das ursprüngliche qtree Linien nur aus Fontmetriken zieht, zeichnet tikz-qtree mit TikZ, die Linien sind glatter und spätere Dekoration ist einfacher.

Reines TikZ: child und node

Für einen kleinen Baum ohne Zusatzpaket reicht TikZs eigener child-Mechanismus. Nach einem Knoten folgt child {...}; dessen Inhalt wird als Kind angeordnet, und die Kante vom Eltern- zum Kindknoten wird automatisch gezeichnet. Innerhalb von child schreibt man gewöhnlich node {...} und verschachtelt weitere childs für Enkel.

latex
\begin{tikzpicture}[level distance=12mm, sibling distance=24mm]
  \node {root}
    child { node {a} }
    child { node {b}
      child { node {c} }
      child { node {d} }
    };
\end{tikzpicture}

Dieses Beispiel zeichnet von oben nach unten eine Wurzel root über a und b, wobei b weiter in c und d verzweigt. Beachte das einzige Semikolon ; für den ganzen Baum am Ende von \node ... ;. Die Platzierung hängt von zwei Abständen ab: dem vertikalen Abstand zwischen Eltern- und Kindebene, level distance (Standard 15 mm), und dem Abstand benachbarter Geschwister, sibling distance (Standard 15 mm). Pro Ebene änderst du sie mit level ⟨n⟩/.style, etwa level 1/.style={sibling distance=4cm}. Die Wachstumsrichtung ändert sich mit [grow=right] und Ähnlichem, die Kanten steuert edge from parent, zum Beispiel edge from parent fork down für rechtwinklige Verbindungen.

Reines TikZ ist bequem, hat aber kein automatisches Packing wie forest; mit mehr Kindern oder größerer Tiefe musst du sibling distance von Hand anpassen, um Überlappungen zu vermeiden. Für kleine Bäume mit wenigen Ebenen reicht es völlig, aber bei dichten Syntaxbäumen oder Bäumen, deren Abstand dem Inhalt folgen soll, macht forest weniger Arbeit.

Was wählen?

Als Faustregel bei Unsicherheit: Für einen neuen Baum zuerst forest wählen: automatisches Layout, Einsatz von Linguistik bis zu allgemeinen Bäumen und die volle TikZ-Kraft für Dekoration. Für einen einzelnen schnell skizzierten Syntaxbaum ist die \Tree-Notation von qtree / tikz-qtree der kürzeste Weg, mit tikz-qtree, wenn die Ausgabe polierter sein soll. Für einen Baum mit wenigen Ebenen ohne neue Abhängigkeit reicht child in reinem TikZ.

WerkzeugNotationGeeignet für
forest[root [child] [child]] (Klammern)Aufwendige Bäume, Auto-Layout, linguistisch und allgemein
qtree\Tree [.S [.NP ... ] ... ]Schnellste Syntaxbäume; leichtgewichtig, fontbasiert
tikz-qtree\Tree (wie qtree)Syntaxbäume in TikZ-Qualität, besser einstellbar
TikZ (trees)\node {r} child {node {a}}Kleine Bäume; wenn Zusatzpakete vermieden werden

Alle liegen auf CTAN und werden mit TeX Live und MiKTeX ausgeliefert. forest und tikz-qtree liegen auf CTAN unter graphics/pgf/contrib/ und hängen von TikZ/pgf ab. Für vollständige Details ist auf dem eigenen Rechner texdoc forest, texdoc tikz-qtree oder texdoc qtree die verlässlichste Quelle.