
Al dibujar representaciones sintácticas en lingüística, a menudo se utiliza un triángulo para representar una unidad cuya estructura interna es irrelevante. Esto se puede lograr con el tikz-qtree
comando \edge[roof]; {John}
.
Ahora bien, a veces necesito mostrar el movimiento de una unidad cuya estructura interna es irrelevante para el tema que nos ocupa. Para hacer esto, normalmente uso la positioning
biblioteca y defino un nodo relativo al nodo sobre el triángulo, así:
\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\tikzset{every tree node/.style={align=center, anchor=north}}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
\Tree
[.TP
[.\node(DP1-rel){DP}; \edge[roof]; {John} ]
[.T$'$
[.T ]
[.\emph{v}P
[.\node(DP2-rel){DP}; \edge[roof]; {$<$John$>$} ]
[.\emph{v}$'$
[.\emph{v}
[.V \node(V1){likes}; ]
[.\emph{v} ]
]
[.VP
[.V \node(V2){$<$likes$>$}; ]
[.DP \edge[roof]; {Mary} ]
]
]
]
]
]
\node (DP1) [below=1cm of DP1-rel] {};
\node (DP2) [below=1cm of DP2-rel] {};
\draw[->] (DP2)..controls +(south west:1) and +(south:1)..(DP1);
\draw[->] (V2)..controls +(south:1) and +(south:1)..(V1);
\end{tikzpicture}
\end{document}
¿Existe una manera mejor o más fácil de hacer esto, donde no tenga que definir un nodo relativo cada vez que necesito mover una unidad cuya estructura interna es irrelevante (es decir, cuya estructura estoy representando con un triángulo, usando el tikz-qtree
comando \edge[roof]; {John}
)?
Respuesta1
Puedes simplemente convertir el texto del techo en un nodo. (También simplifiqué un poco la sintaxis de las flechas).
\documentclass{article}
\usepackage{tikz-qtree,tikz-qtree-compat}
\tikzset{every tree node/.style={align=center, anchor=north}}
\begin{document}
\begin{tikzpicture}
\Tree
[.TP
[.DP \edge[roof]; \node (J) {John}; ]
[.T$'$
[.T ]
[.\emph{v}P
[.DP \edge[roof]; \node (Jtrace) {$<$John$>$}; ]
[.\emph{v}$'$
[.\emph{v}
[.V \node(V1){likes}; ]
[.\emph{v} ]
]
[.VP
[.V \node(V2){$<$likes$>$}; ]
[.DP \edge[roof]; {Mary} ]
]
]
]
]
]
\draw[->] (Jtrace) [in=-90,out=-90,looseness=1.5] to (J);
\draw[->] (V2) [in=-90,out=-90] to (V1);
\end{tikzpicture}
\end{document}
Respuesta2
No sé tikz-qtree
pero conforest
, puede acceder al nodo del árbol con la !
sintaxis especial. El nodo (!2211)
(en sus ejemplos, esto es <John>
), es el TP
segundo hijo de la raíz ( ), T'
el segundo hijo ( ) vP
, el primer hijo ( DP
), el primer hijo ( <John>
).
Luego, siempre existe la posibilidad de darle un nombre a un nodo con la clave habitual de TikZ: name
(o alias
si necesita más de un nombre).
También existe la posibilidad de proporcionar un nodo relativo a otro (que en realidad es el caso general de la !
sintaxis). En este ejemplo, vamos a u
p, luego al l
primer hijo y al primer 2
hijo de su segundo hijo, 1
lo que lleva a (!ul21)
.
Cada uno tiene sus ventajas, dependiendo de qué tan estático sea realmente el árbol. Si se mueve mucho, sería aconsejable darle a los nodos un nombre fijo. Si uno siempre se mantiene relativamente fijo con respecto a otro nodo, puede usar el nombre de nodo relativo. Si un nodo siempre se mantiene relativo a la raíz, puede utilizar la sintaxis relativa especial después del árbol (es decir, después del nodo raíz).
En el código siguiente, me tomé la libertad de definir un estilo angled
que se agrega <
automáticamente >
a su contenido. También utilicé otra ruta para las conexiones (que creo que se ve un poco mejor pero no soy lingüista).
Código
\documentclass[tikz]{standalone}
\usepackage{forest}
\usetikzlibrary{paths.ortho}% http://tex.stackexchange.com/a/110172/16595
\forestset{angled/.style={content/.expanded={$<$\forestov{content}$>$}}}
\begin{document}
\begin{forest} s sep*=3
[TP
[DP, tikz={\draw[blue, ->] () -- node[sloped, above] {\ttfamily !ul21} (!ul21);}
[John, triangle] ]
[T'
[T]
[\emph{v}P
[DP
[John, triangle, angled] ]
[\emph{v}'
[\emph{v}
[V
[likes, name=V1] ]
[\emph{v} ] ]
[VP
[V
[likes, angled, name=V2] ]
[DP
[Mary, triangle] ] ] ] ] ] ]
%
\path[rounded corners, du, -latex] (!2211) edge (!11)
(V2) edge (V1);
\end{forest}
\end{document}