Una forma más eficiente de dibujar una flecha de movimiento hacia el techo en tikz-qtree

Una forma más eficiente de dibujar una flecha de movimiento hacia el techo en tikz-qtree

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-qtreecomando \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 positioningbiblioteca 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}

árbol sintáctico

¿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-qtreecomando \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}

salida de código

Respuesta2

No sé tikz-qtreepero conforest, puede acceder al nodo del árbol con la !sintaxis especial. El nodo (!2211)(en sus ejemplos, esto es <John>), es el TPsegundo 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 aliassi 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 up, luego al lprimer hijo y al primer 2hijo de su segundo hijo, 1lo 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 angledque 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}

Producción

ingrese la descripción de la imagen aquí

información relacionada