Árboles sintácticos, taxonomías, árboles de decisión, árboles B: para dibujar diagramas ramificados en LaTeX hay tres herramientas principales. La más potente y moderna es forest; el estándar más rápido para árboles sintácticos lingüísticos es qtree / tikz-qtree; y para árboles pequeños sin paquetes extra está TikZ puro. Las tres permiten describir la estructura anidada “un padre se ramifica en hijos” sin calcular una sola coordenada. Esta página trata de cómo elegir entre ellas y cómo se escribe cada una.
Tres enfoques
Un árbol es esencialmente una estructura anidada (recursiva): hay una raíz, debajo cuelgan hijos, esos hijos tienen nietos, etc. Si puedes reflejar ese anidamiento con corchetes anidados, puedes construir un árbol sin especificar coordenadas. Las tres herramientas se basan en esta idea, pero difieren en la sensación de uso y en hasta dónde llegan.
forest— el paquete más flexible, construido sobre TikZ y pgfkeys. Sobre su notación de corchetes etiquetados[root [child] [child]]puedes aplicar opciones por nodo y un estilo para todo el árbol, y empaqueta automáticamente el espaciado según la complejidad del contenido de cada nodo. Sirve tanto para lingüística como para árboles generales.qtree/tikz-qtree— el estándar más rápido para árboles sintácticos lingüísticos. Escribes\Tree [.S [.NP ... ] [.VP ... ] ], donde.labelmarca un nodo no terminal, ramificado.tikz-qtreereimplementa la misma notación sobre TikZ, con mejor salida y más control.- TikZ puro (biblioteca
trees) — el mecanismochild/node,\node {root} child {node {a}} child {node {b}};. Sin paquete extra, adecuado para dibujar un árbol pequeño al momento.
En resumen, forest es el más flexible y sirve para árboles elaborados, mientras que qtree / tikz-qtree son lo más rápido para árboles de constituyentes. TikZ puro no añade dependencia y es ágil para trabajos pequeños. Veamos cada uno.
forest: árboles modernos con corchetes
forest (de Sašo Živanović, en CTAN) es un paquete para dibujar árboles construido sobre TikZ y pgfkeys. Se carga en el preámbulo y el árbol se escribe en notación de corchetes etiquetados dentro de un entorno forest. Cada nodo va entre corchetes [ ], y sus hijos se listan dentro; el anidamiento de corchetes *es* el anidamiento del árbol. Para lingüística, la opción linguistics hace que las ramas se unan por encima de los dos hijos.
\usepackage[linguistics]{forest}
\begin{forest}
[CP
[C]
[IP
[I]
[VP
[V]
[NP]
]
]
]
\end{forest}Este ejemplo dibuja un árbol con raíz CP sobre C e IP; IP sobre I y VP; y VP sobre V y NP. Compactarlo en una línea como [CP[C][IP[I][VP[V][NP]]]] produce el mismo árbol, pero con algo complejo cuesta emparejar los corchetes, así que lo idiomático es mostrar la jerarquía con saltos de línea e indentación, como arriba. Un tropiezo: una línea en blanco en la fuente hace que forest falle al analizar (se interpreta como salto de párrafo). La indentación en sí es libre.
La fuerza de forest es la maquetación automática. Coloca cada nodo según la complejidad de lo que domina y empaqueta los nodos horizontalmente para que no choquen, de modo que incluso un árbol cargado sale casi presentable. Cuando quieras ajustar el espaciado, aplica for tree={...} a todo el árbol o a un subárbol. Los tres ajustes más usados son s sep (separación horizontal), l (distancia vertical entre niveles) e inner sep (relleno alrededor 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}Este ejemplo reúne varios modismos. El for tree={...} inicial fija el espaciado de todo el árbol, y poner una coma tras una etiqueta de nodo, como en [IP, for tree={s sep=20mm}, sobrescribe el espaciado solo para ese subárbol. roof coloca un triángulo, un “techo”, sobre la etiqueta del nodo, usado para abreviar estructura interna y mostrar una frase como unidad. Dar name= a un nodo permite dibujar una flecha de movimiento después del corchete final del árbol con \draw[->] (src) to[...] (tgt); (dentro de forest puedes usar comandos TikZ directamente). Para poner una coma *dentro* de una etiqueta, envuélvela en llaves como {NP, PP}, distinguiéndola de una instrucción de diseño.
Si no quieres escribir el mismo aspecto cada vez, define un estilo por defecto en el preámbulo con \forestset{default preamble={for tree={...}}}. Como forest se basa en TikZ/pgf, la apariencia fina de nodos — forma, color, puntas de flecha, resaltado — sigue directamente de lo que sabes de TikZ (ver “Fundamentos de TikZ”).
qtree / tikz-qtree: el camino más corto a un árbol sintáctico
Para dibujar rápidamente un árbol de constituyentes en lingüística, el estándar de larga data es qtree. Pon \usepackage{qtree} en el preámbulo y, en el cuerpo, sigue \Tree con un árbol entre corchetes. El corazón de la notación: una etiqueta precedida por un punto . marca un nodo no terminal, ramificado, mientras que una palabra desnuda sin punto es una hoja, terminal.
\Tree [.S [.NP Kim ] [.VP [.V saw ] NP ] ]Esa sola línea dibuja un árbol con raíz S sobre NP y VP; NP con la hoja Kim; y VP sobre V (hoja saw) y NP. Se aplican algunas reglas: el árbol debe ir inmediatamente después de \Tree; las etiquetas no terminales empiezan con punto (.S); y un corchete de cierre ] debe ir precedido de espacio (como saw ]). qtree también tiene comodidades: NP_i y N^0 formatean automáticamente subíndices/superíndices en modo matemático dentro del árbol, X\1 abrevia X$'$ (X′), y \qroof{...} pone un techo triangular sobre una frase (por ejemplo \qroof{out of style}.PP). Para desactivar el centrado automático, carga \usepackage[nocenter]{qtree}.
tikz-qtree (de David Chiang) reimplementa esta notación \Tree sobre TikZ. Carga \usepackage{tikz} y \usepackage{tikz-qtree}, y el mismo \Tree [.S ... ] funciona sin cambios, ahora con calidad TikZ. Para árboles simples es casi completamente intercambiable con qtree; además, como se aplica la maquinaria de estilos de TikZ, flechas y ramas son más fáciles de ajustar. Por ejemplo, \tikzset{grow'=right} hace que el árbol crezca de izquierda a derecha en lugar de arriba abajo. Mientras el qtree original dibuja líneas solo con métricas de fuente, tikz-qtree dibuja con TikZ, por lo que las líneas son más suaves y la decoración posterior es sencilla.
TikZ puro: child y node
Para un árbol pequeño en el que no quieras añadir paquetes, basta el mecanismo child propio de TikZ. Tras colocar un nodo, añades child {...} y su contenido se coloca como hijo, con la arista padre-hijo dibujada automáticamente. Dentro de un child normalmente escribes node {...}, y anidas más child para crear nietos.
\begin{tikzpicture}[level distance=12mm, sibling distance=24mm]
\node {root}
child { node {a} }
child { node {b}
child { node {c} }
child { node {d} }
};
\end{tikzpicture}Este ejemplo dibuja, de arriba abajo, una raíz root sobre a y b, con b dividido luego en c y d. Observa el único punto y coma ; para todo el árbol, al final de \node ... ;. La colocación se rige por dos distancias: el hueco vertical entre el nivel de un padre y el de sus hijos, level distance (15 mm por defecto), y el espaciado entre hermanos contiguos, sibling distance (15 mm por defecto). Para variarlos por nivel, usa level ⟨n⟩/.style, por ejemplo level 1/.style={sibling distance=4cm}. La dirección de crecimiento cambia con [grow=right] y similares, y las aristas se controlan con edge from parent (por ejemplo edge from parent fork down para conectores en ángulo recto).
TikZ puro es cómodo, pero al no tener empaquetado automático como forest, exige ajustar sibling distance a mano para evitar solapamientos cuando crece el número de hijos o la profundidad. Es suficiente para un árbol pequeño de pocos niveles, pero para un árbol sintáctico cargado, o uno cuyo espaciado deba seguir el contenido, forest da menos trabajo.
Cuál elegir
Regla práctica si dudas. En general, para un árbol nuevo, empieza con forest: maquetación automática, alcance desde lingüística hasta árboles generales, y toda la potencia de TikZ para decorar. Para escribir rápido un único árbol sintáctico, la notación \Tree de qtree / tikz-qtree es el camino más corto, y tikz-qtree si quieres una salida más pulida. Para un árbol de pocos niveles sin nueva dependencia, basta child de TikZ puro.
| Herramienta | Notación | Mejor para |
|---|---|---|
forest | [root [child] [child]] (corchetes) | Árboles elaborados, auto-maquetación, lingüísticos y generales |
qtree | \Tree [.S [.NP ... ] ... ] | Árboles sintácticos más rápidos; ligero, basado en fuentes |
tikz-qtree | \Tree (igual que qtree) | Árboles sintácticos con calidad TikZ, más ajustables |
TikZ (trees) | \node {r} child {node {a}} | Árboles pequeños; cuando se evitan paquetes extra |
Todos están en CTAN y se distribuyen con TeX Live y MiKTeX. forest y tikz-qtree viven bajo graphics/pgf/contrib/ en CTAN y dependen de TikZ/pgf. Para el detalle completo de cada paquete, la referencia más segura es texdoc forest, texdoc tikz-qtree o texdoc qtree en tu propia máquina.