
Ich versuche, mit dem Forest-Paket einen Baum zu erstellen, bei dem sich alle Blattknoten auf derselben Ebene befinden.
Allerdings schneiden die Linien, die höher gelegene Knoten verbinden, durch andere Knoten. Gibt es eine Möglichkeit, dies mit diesem Paket zu verhindern?
Hier ist der entsprechende Codeausschnitt:
\begin{forest}
where n children=0{tier=word}{}
[equation, %for tree={parent anchor=south, child anchor=north}
[VARIABLE[y]]
[{=}]
[expression
[additionOrSubtraction
[multiplicationOrDivision
[atom[VARIABLE[x]]]
]
[{*}]
[atom
[{(}]
[expression
[additionOrSubtraction
[multiplicationOrDivision
[atom[INTEGER[2]]]
]
[{+}]
[multiplicationOrDivision
[atom[INTEGER[3]]]
[{*}]
[atom[VARIABLE[x]]]
]
]
]
[{)}]
]
]
]
]
\end{forest}
Und hier ist ein Bild davon:
Antwort1
Ich habe die Pfade zunächst so eingestellt, dass sie orthogonale Kanten verwenden (beschrieben im edge path
Abschnitt, Seite 33 des Waldhandbuchs). Theoretisch wäre es auch möglich, gekrümmte Pfade zu verwenden, aber ich denke, das würde exponentiell mehr Zeit in Anspruch nehmen.
Anschließend habe ich den Abstand zwischen den Kindern vergrößert, indem ich den s sep
Wert (siehe Seite 32 im Handbuch) von Fall zu Fall erhöht habe. In manchen Ebenen reichten 10 mm aus, in anderen waren 20 mm erforderlich.
Ich war mir nicht sicher, ob Sie die Zeichenfolgen „Multiplikation oder Division“ und ähnliche durch Symbole oder Icons ersetzen würden (was ich empfehlen würde – oder ob Sie Zeilenumbrüche innerhalb dieser Zeichenfolgen zulassen würden), also habe ich nur eine schnelle Annäherung der Abstände vorgenommen. Für die Veröffentlichung bedeutet dies natürlich, dass sie noch fein abgestimmt werden müssen.
Leider ist das Bild etwas gewachsen. Vielleicht könnte ein sidewaysfigure
oder ein \resizebox
es in den von Ihnen benötigten Kontext einpassen?
Code:
\documentclass{standalone}
\usepackage{forest}
\begin{document}
\begin{forest}for tree={%
edge path={\noexpand\path[\forestoption{edge}] (!u.parent anchor) -- +(0,-\baselineskip) -| (.child anchor)\forestoption{edge label};}},
where n children=0{tier=word}{}
[equation, s sep=15mm %for tree={parent anchor=south, child anchor=north}
[VARIABLE[y]]
[{=}]
[expression
[additionOrSubtraction, s sep=20mm
[multiplicationOrDivision
[atom[VARIABLE[x]]]
]
[{*}]
[atom, s sep=20mm
[{(}]
[expression
[additionOrSubtraction, s sep=20mm
[multiplicationOrDivision
[atom[INTEGER[2]]]
]
[{+}]
[multiplicationOrDivision, s sep=10mm
[atom[INTEGER[3]]]
[{*}]
[atom[VARIABLE[x]]]
]
]
]
[{)}]
]
]
]
]
\end{forest}
\end{document}
Antwort2
Wenn rechtwinklige Kanten akzeptabel sind, wird daraus, wie vorgeschlagen, wahrscheinlich der schönste Baum.
Es besteht jedoch keine Notwendigkeit, dies manuell zu konfigurieren, da dies forked edges
in der aktuellen Forest edges
-Bibliothek enthalten ist.
\usepackage[edges,linguistics]{forest}
und in der Präambel des Baumes
forked edges,
Ich würde es auch empfehlen fit=band
, da dadurch die Notwendigkeit vermieden wird, Dinge manuell zu verschieben oder die richtigen Abmessungen durch Ausprobieren herauszufinden.
for tree={%
fit=band,
},
Es kann auch hilfreich sein , die Einstellungen inner xsep=0pt
für alle Knoten außer der letzten Ebene vorzunehmen.
where n children=0{%
tier=word,
}{%
inner xsep=0pt,
},
Ich habe es auch ...Or...
in mehrzeilige Knoten aufgeteilt. Ich weiß nicht, ob das für Ihren Zweck akzeptabel ist oder nicht, aber es sorgt für ein übersichtlicheres Diagramm.
Ich empfehle, mehrere Makros einzurichten: eines für Addition/Subtraktion und eines für Multiplikation/Division. So können Sie mit verschiedenen Optionen experimentieren, indem Sie einfach die allgemeinen Makrodefinitionen in der Präambel ändern.
Zum Beispiel:
\newcommand*\multordiv{Multiplication\\or\\Division}
\newcommand*\addorsub{Addition\\or\\Subtraction}
und etwas zu den Sternchen – sollten diese zentriert und nicht oben platziert werden? Sie sollten für die letzte Knotenebene vielleicht den Mathematikmodus verwenden.
\newcommand*\asthere{\textasteriskcentered}
Dann die Baumspezifikation
[equation
[VARIABLE[y]]
[{=}]
[expression
[\addorsub
[\multordiv
[atom
[VARIABLE
[x]
]
]
]
[\asthere]
[atom
[{(}]
[expression
[\addorsub
[\multordiv
[atom
[INTEGER
[2]
]
]
]
[{+}]
[\multordiv
[atom
[INTEGER
[3]
]
]
[\asthere]
[atom
[VARIABLE
[x]
]
]
]
]
]
[{)}]
]
]
]
]
ergibt sich ein einigermaßen ordentliches und, wenn auch nicht ganz kompaktes, so doch zumindest viel überschaubareres Ergebnis.
Vollständiger Code:
\documentclass[border=5pt,tikz,multi]{standalone}
\usepackage[edges,linguistics]{forest}
\newcommand*\multordiv{Multiplication\\or\\Division}
\newcommand*\addorsub{Addition\\or\\Subtraction}
\newcommand*\asthere{\textasteriskcentered}
\begin{document}
\begin{forest}
where n children=0{%
tier=word,
}{%
inner xsep=0pt,
},
for tree={%
fit=band,
},
forked edges,
[equation
[VARIABLE[y]]
[{=}]
[expression
[\addorsub
[\multordiv
[atom
[VARIABLE
[x]
]
]
]
[\asthere]
[atom
[{(}]
[expression
[\addorsub
[\multordiv
[atom
[INTEGER
[2]
]
]
]
[{+}]
[\multordiv
[atom
[INTEGER
[3]
]
]
[\asthere]
[atom
[VARIABLE
[x]
]
]
]
]
]
[{)}]
]
]
]
]
\end{forest}
\end{document}