El manual de forest empieza con una confesión de su autor: durante años había sido un usuario agradecido de qtree y synttree, pero todas las herramientas disponibles tenían el mismo defecto: los árboles a veces salían demasiado anchos. De esa única molestia nació lo que hoy es la primera opción para dibujar árboles en LaTeX: árboles sintácticos, jerarquías de directorios, árboles de decisión, árboles de probabilidad. Los veteranos qtree y tikz-qtree siguen muy vivos, eso sí, y sus notaciones de corchetes se parecen muchísimo pero difieren en exactamente un punto decisivo. Si migras sin saberlo, obtendrás, sin error alguno, un nodo llamado literalmente .S. Esta página va de esa diferencia hasta la elección entre herramientas.
Notación de corchetes: construir un árbol sin una sola coordenada
Todas las herramientas para dibujar árboles toman corchetes anidados como entrada porque un árbol es en sí mismo una estructura recursiva. Hay una raíz, debajo cuelgan hijos, esos hijos tienen nietos: refleja ese anidamiento con [ ] anidados y toda la aritmética de coordenadas pasa a ser problema de la herramienta. En forest escribes [S [NP] [VP]]; en qtree, \Tree [.S [.NP ] [.VP ] ]. Lo que tecleas no es una disposición, sino una estructura.
Hay en realidad tres opciones. forest (Sašo Živanović; v2.1.5 en TeX Live 2024), construido sobre TikZ y pgfkeys, es el más flexible y se encarga de la maquetación. Los clásicos para dibujar un árbol sintáctico lingüístico con el mínimo de pulsaciones son qtree (v3.1b) y tikz-qtree (David Chiang, v1.2), que reimplementa la misma notación sobre TikZ. Y para un árbol de pocos niveles en el que preferirías no añadir un paquete, basta la biblioteca trees del propio TikZ, con child y node. Abajo aclaramos primero la diferencia entre las dos notaciones de corchetes y luego vamos herramienta por herramienta.
La diferencia entre [.S [.NP ]] y [S [NP]]: el punto de qtree no significa nada para forest
La respuesta corta: en qtree un punto inicial marca «esto es un nodo ramificado», mientras que en forest un punto es solo un carácter. En qtree, [.S ... ] significa «un nodo no terminal llamado S», y una palabra desnuda sin punto es una hoja. forest no tiene esa convención: todo lo que va del [ hasta el siguiente [ o ] es la etiqueta. Así que darle a forest un [.S [.NP Kim ]] produce —sin error alguno— dos nodos etiquetados .S y .NP Kim. Kim no se convierte en hoja: acaba dentro de la misma caja 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}El error en la dirección contraria falla mucho más ruidosamente. qtree exige espacio antes de un ] de cierre, así que escribir [.NP Kim] pegado te da ! LaTeX Error: \begin{tabular} on input line 5 ended by \end{document}., un error que nombra tabular en un documento sin una sola tabla. Haz lo mismo con tikz-qtree y obtienes ! Emergency stop. sin PDF alguno. Una mano acostumbrada a forest tropieza justo ahí en cuanto toca una fuente de qtree. En resumen, ninguna de las dos notaciones acepta en silencio a la otra, así que al mover un archivo entre ellas comprueba el paquete y la notación como pareja.
La maquetación automática de forest y cómo ajustar el espaciado a mano
La función central de forest es la respuesta a la queja del principio de esta página, la de los árboles demasiado anchos: el empaquetado automático. Coloca cada nodo según la anchura real del subárbol que domina y acerca a los hermanos tanto como sea posible sin que choquen, de modo que hasta un árbol cargado queda presentable sin más. Para intervenir, aplica for tree={...} a todo el árbol o a un subárbol. Las tres claves que más se usan son s sep (separación horizontal entre hermanos), l (distancia vertical entre niveles) e inner sep (el relleno alrededor del contenido de un nodo).
\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}Ese ejemplo breve reúne casi todos los modismos de forest. El for tree={...} inicial pasa a ser el valor por defecto de todo el árbol, y poner una coma tras una etiqueta de nodo —como en [IP, for tree={s sep=20mm}— sobrescribe el ajuste solo para ese subárbol. Da a un nodo un name= y, tras cerrar el árbol, podrás dibujar una flecha de movimiento con \draw[->] (src) to[...] (tgt);, porque dentro de un entorno forest los comandos de TikZ funcionan directamente. Para poner una coma dentro de una etiqueta, envuélvela en llaves como {NP, PP} para que no se lea como instrucción de diseño. Y si no quieres escribir el mismo aspecto cada vez, define un valor por defecto en el preámbulo con \forestset{default preamble={for tree={...}}}.
Y aquí el escollo con el que más gente tropieza: una línea en blanco dentro de una fuente forest hace fallar el análisis. Para TeX una línea en blanco es un fin de párrafo, así que el análisis se corta a mitad del árbol y sale ! Paragraph ended before \forestOappto was complete., un error que parece no tener nada que ver con árboles. Las ganas de airear un árbol largo se entienden, pero los saltos de línea y la indentación están permitidos y las líneas en blanco no. La profundidad de indentación, en cambio, es libre: úsala para mostrar la jerarquía.
Las bibliotecas linguistics y edges: sin ellas, roof y folder no existen
Parte de la funcionalidad de forest vive en bibliotecas que hay que cargar como opciones, por ejemplo \usepackage[linguistics]{forest}. Con la que más se tropieza es roof, que coloca un «techo» triangular sobre un sintagma. No está definida en el núcleo de forest sino en la biblioteca linguistics, así que escribir [DP, roof [the woman]] con un \usepackage{forest} pelado se detiene en ! Package pgfkeys Error: I do not know the key '/tikz/roof'. Del mismo modo, folder, el estilo que todos reconocemos de los diagramas de directorios, pertenece a la biblioteca edges.
También conviene saber qué hace de verdad la biblioteca linguistics. Primero, sn edges: por omisión forest une padre e hijo de borde a borde, y esto lo cambia para que vaya del sur del padre al norte del hijo, la forma que se reconoce en los árboles sintácticos lingüísticos. Segundo, alinea la línea base con la raíz, y por eso el árbol queda a la altura del número de ejemplo o de la glosa contigua. Tercero, define recorridos de nodos para el mando-c (c-command), de modo que c-commanded y c-commanders permiten dirigirse de golpe a todo ese conjunto de nodos. La biblioteca edges, por su parte, aporta folder y además forked edge / forked edges, que doblan las ramas en ángulo recto.
qtree y tikz-qtree: un árbol sintáctico en una línea
Para despachar un solo árbol sintáctico, la notación \Tree sigue siendo la vía más corta. Carga \usepackage{qtree} y una línea —\Tree [.S [.NP Kim ] [.VP [.V saw ] [.NP Lee ] ] ]— te da un árbol. Por dentro es la confluencia del trabajo de dos personas: las macros que dibujan el árbol son el QobiTree de Jeffrey Mark Siskind, y el frontal y las extensiones que lo hacen cómodo desde LaTeX son de Alexis Dimitriadis. Desde la versión 3.0b (2005) las líneas se trazan con pict2e, así que el resultado es el mismo tanto por la ruta DVI/PostScript como con salida directa a PDF.
qtree trae un conjunto de comodidades pensadas justo para árboles sintácticos. Dentro de un árbol, NP_i y N^0 se convierten automáticamente en subíndices y superíndices en modo matemático, y X\1 abrevia X$'$ (X′). Para poner un triángulo sobre un sintagma se escribe \qroof{out of style}.PP, el mismo trabajo que el roof de forest, escrito de otra manera. Los árboles se centran por omisión, así que carga \usepackage[nocenter]{qtree} si los quieres alineados a la izquierda.
tikz-qtree (David Chiang) reconstruye la misma notación \Tree sobre TikZ. Carga \usepackage{tikz} y \usepackage{tikz-qtree} juntos y la misma fuente pasa sin cambios. Su autor menciona tres ventajas: coloca los nodos sin colisiones, a diferencia de los árboles estándar de TikZ; añade a qtree funciones de TikZ —etiquetas en las aristas, flechas entre nodos—; y, a diferencia de pst-qtree, funciona con pdfTeX y XeTeX. La dirección de crecimiento también es ajustable: da a la tikzpicture un [grow'=right] y el árbol corre de izquierda a derecha. La compatibilidad es alta pero no total, así que compila y mira antes de confiarle un árbol complicado a la mudanza.
\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}Árboles que no son sintácticos: directorios, decisiones, probabilidades
forest no es una herramienta solo para lingüística. Para un diagrama de directorios, la combinación estándar es folder, de la biblioteca edges, junto con grow'=east: el árbol se despliega de izquierda a derecha con las ramas en ángulo recto que se leen como carpetas. Para un árbol de decisión o de probabilidad, quieres números sobre las propias ramas, y como una rama de forest es un camino de TikZ, colgarle un nodo con edge label={node[midway,above]{0.3}} escribe la probabilidad o la condición directamente sobre la arista. El manual que acompaña a forest incluye un ejemplo resuelto de árbol de decisión.
\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}Para un árbol de pocos niveles al que no quieras añadir ningún paquete, basta la biblioteca trees del propio TikZ. Coloca un nodo, añade child {...} y el contenido se dispone como hijo con la arista padre-hijo dibujada por ti. Dentro de un child normalmente escribes node {...}, y anidas más child para los nietos. Dos distancias rigen la colocación: el hueco vertical entre el nivel del padre y el de sus hijos, level distance, y el espaciado entre hermanos contiguos, sibling distance, ambos de 15 mm por omisión. Para variarlos por nivel usa level ⟨n⟩/.style, como en level 1/.style={sibling distance=4cm}; la dirección de crecimiento cambia con [grow=right] y afines, y la forma de la rama la controla edge from parent (edge from parent fork down para conectores en ángulo recto).
\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}Cuidado con una cosa: hay exactamente un punto y coma ; para todo el árbol, al final de \node ... ;. Y TikZ puro no tiene el empaquetado automático de forest, así que a medida que crezca el número de hijos o la profundidad estarás ensanchando sibling distance a mano para evitar solapamientos. Para un árbol pequeño de pocos niveles está bien, pero en cuanto te sorprendas deseando que el espaciado siga al contenido, esa es la señal para pasarte a forest.
Cuál elegir
En caso de duda, usa forest para un árbol que dibujes de cero. La maquetación es automática, su alcance va de la lingüística a los diagramas generales, y todo TikZ está disponible para decorar. Si heredas una fuente \Tree existente, o un coautor escribe en \Tree, quédate con qtree / tikz-qtree; de los dos, tikz-qtree da mejor salida y más margen de ajuste. Para un árbol de pocos niveles sin ninguna dependencia nueva, el child de TikZ puro sirve. Los cuatro están en CTAN; forest y tikz-qtree viven bajo graphics/pgf/contrib/ y dependen de TikZ/pgf. Para los detalles, la referencia más segura es texdoc forest, texdoc qtree o texdoc tikz-qtree en tu propia máquina.
| Herramienta | Notación | Mejor para |
|---|---|---|
forest | [S [NP] [VP]] (sin puntos) | cualquier árbol nuevo; empaquetado automático, de lingüística a árboles de decisión |
qtree | \Tree [.S [.NP Kim ] ] (puntos y espacios obligatorios) | el árbol sintáctico más corto; ligero, sobre pict2e |
tikz-qtree | \Tree (igual que qtree) | la misma notación con calidad TikZ; también etiquetas y flechas |
tikz trees library | \node {r} child {node {a}}; | árbol pequeño de pocos niveles, sin paquete extra |
Una nota práctica final. Muchísima gente quiere un árbol sintáctico en una diapositiva de congreso o en unas transparencias de clase, y en ese caso suele ser más rápido exportar el árbol como imagen independiente y pegarlo en PowerPoint o Keynote que mantenerlo dentro de un documento LaTeX. Como tanto forest como tikz-qtree se apoyan en TikZ, envolver el árbol en la clase standalone lo convierte directamente en un PDF o un SVG recortado al milímetro. La página sobre exportar imágenes recorre ese procedimiento.