
Estoy intentando crear un árbol usando el paquete forestal, donde los nodos hoja están todos en el mismo nivel.
Sin embargo, las líneas que unen los nodos superiores atraviesan otros nodos. ¿Hay alguna forma de evitar esto con este paquete?
Aquí está el fragmento de código relevante:
\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}
Y aquí tenéis una imagen de ello:
Respuesta1
Primero configuré los caminos para usar bordes ortogonales (descritos en la edge path
sección, página 33 del manual forestal. En teoría, también sería posible usar caminos curvos, pero creo que esto llevaría exponencialmente más tiempo.
A continuación, amplié la distancia entre niños aumentando el s sep
valor (descrito en la página 32 del manual) caso por caso. En algunos niveles, 10 mm fueron suficientes, pero en otros, 20 mm fueron necesarios.
No estaba seguro de si reemplazaría "multiplicationOrDivision" y cadenas similares con quizás símbolos o íconos (lo cual recomendaría, o permitiría saltos de línea dentro de estas cadenas), así que solo hice una rápida aproximación de las distancias. Por supuesto, para su publicación significa que aún sería necesario ajustarlos.
Desafortunadamente, la imagen ha aumentado un poco de tamaño. ¿Quizás a sidewaysfigure
o a \resizebox
podrían adaptarse al contexto que necesitas?
Código:
\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}
Respuesta2
Si los bordes cuadrados son aceptables, probablemente darán lugar al árbol más limpio, como se sugiere.
Sin embargo, no es necesario configurar esto manualmente como lo proporciona Forest actual forked edges
en su edges
biblioteca.
\usepackage[edges,linguistics]{forest}
y en el preámbulo del árbol
forked edges,
También recomendaría fit=band
que evite la necesidad de cambiar las cosas manualmente o determinar las dimensiones correctas mediante prueba y error.
for tree={%
fit=band,
},
También puede ser útil configurar inner xsep=0pt
todos los nodos excepto el último nivel.
where n children=0{%
tier=word,
}{%
inner xsep=0pt,
},
También los he dividido ...Or...
en nodos multilínea. No sé si esto es aceptable para su uso o no, pero crea un diagrama más manejable.
Recomiendo configurar un par de macros: una para suma/resta y otra para multiplicación/división. Esto le permitirá experimentar con diferentes opciones simplemente modificando las definiciones de macro comunes en el preámbulo.
Por ejemplo:
\newcommand*\multordiv{Multiplication\\or\\Division}
\newcommand*\addorsub{Addition\\or\\Subtraction}
y algo para los asteriscos: ¿deberían estar centrados en lugar de en la parte superior? Es posible que desee considerar el uso del modo matemático para el último nivel de nodos.
\newcommand*\asthere{\textasteriskcentered}
Entonces la especificación del árbol
[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]
]
]
]
]
]
[{)}]
]
]
]
]
produce algo razonablemente limpio y, si no del todo compacto, al menos mucho más contenido.
Código completo:
\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}