Agregar nodos fuera de un árbol y dibujarles flechas con tikz-qtree y tikz

Agregar nodos fuera de un árbol y dibujarles flechas con tikz-qtree y tikz

Intento hacer un dibujo que se supone que explica la frase.

dass er das Lied wird haben singen müssen

que él la canción tendrá que cantar debe

La idea es escribir la oración y tener el árbol del código a continuación que muestra las relaciones de dominancia, es decir, qué verbo domina a qué otro verbo. Directamente a la derecha de singen quiero tener un nodo adicional para müssen y a la izquierda uno para haben y a la izquierda de haben uno para wird. Los verbos que están en los árboles deben conectarse a estos nodos con flechas. es posible? Intenté algo (ver código), pero los nuevos nodos no aparecen en la misma línea base que singen.

¿Tal vez tengo que volver a dibujar todo de alguna otra manera?

    \documentclass{article}

\usepackage{tikz-qtree}

\begin{document}

\begin{tikzpicture}
\Tree [.wird
          [.haben
              [.muessen singen ] ] ] \node[anchor=east]{muessen}; 
\end{tikzpicture}

\end{document}

Así es como debería verse:

ingrese la descripción de la imagen aquí

Respuesta1

Una idea sencilla: escribe tu frase en formato matrix of nodes. Este tipo de objeto tikz asigna automáticamente un nombre a cada uno de sus componentes. En el siguiente ejemplo, nombré la matriz M, por lo que los elementos de la primera (y única) fila reciben el nombre M-1-1, M-1-2y así sucesivamente. Esto facilita agregar más palabras además M-1-7y hacer las conexiones:

\usetikzlibrary{matrix, positioning}
\begin{tikzpicture}[shorten >=1mm]
\matrix[name=M, matrix of nodes, inner sep=0pt, column sep=1ex]{
  dass & er & das & Lied & wird & haben & singen & m\"ussen \\
};

\node [anchor=base, above=2em of M-1-7.base]  (mussen) {m\"ussen};
\node [anchor=base, above=2em of mussen.base] (haben)  {haben};
\node [anchor=base, above=2em of haben.base]  (wird)   {wird};
\draw[->] (wird)   to[out=180,in=90] (M-1-5);
\draw[->] (haben)  to[out=180,in=90] (M-1-6);
\draw[->] (mussen) to[out=0,in=90]   (M-1-8);
\draw (wird) --(haben) -- (mussen) -- (M-1-7);
\end{tikzpicture}

Resultado

Respuesta2

Hm, un árbol no se ve bien. ¿Qué pasa con las cadenas?

Instalamos dos cadenas:

  1. La cadena sentenceva hacia la derecha, sentence going base right,
  2. La cadena verbssube, verbs going above.

En la sentencecadena simplemente colocamos las partes daß er das Lied, wird, haben, singen, können, para los artículos que tienen una Umlaut o un Eszett le asignamos unaseguronombre sin ellos (hay otras soluciones posibles, pero dificultarían el acceso a esos nodos). Si no especificamos a \Nameen el bucle , simplemente se utilizará \foreachel texto.\Item

La distancia de los nodos horizontales .3333emse establece de manera que los nodos queden colocados como lo harían en una oración, para esto también ponemos inner xsepy outer xsepa cero. Puedes comprobar este comportamiento colocando otro nodo para que se superponga con la frase:

\node[anchor=text] at (sentence-begin.text) {da\ss\space er das Lied wird haben singen k\"onnen};

La parte vertical de node distance, 1.5\baselineskip, se elige al azar y inner yseptiene la mitad del tamaño predeterminado. También se outer ysepestablece en cero (no tenemos ningún nodo dibujado).

Los nodos de la cadena vertical se conectan automáticamente mediante la joinopción (que usa el every joinestilo). Las conexiones a los nodos de la oración también se realizan en el segundo bucle.

El arc and lineestilo especial garantiza que los arcos tengan el tamaño de un cuarto de círculo con el radio más grande posible. Sin embargo, se puede asignar un valor opcional arc and line maximum.

Si lo establecemos arc and line maximumen un valor muy pequeño, digamos 6pt(el valor predeterminado para rounded corners), podemos imitar un -|camino básico con dichas esquinas redondeadas. No hay necesidad de la calcbiblioteca y esas let … incosas.
Con arc and line maximumel valor cero obtenemos el -|camino básico con esquinas afiladas. Como arriba, no necesitaríamos calcesos cálculos.

Personalmente prefiero la variante azul con un rounded cornersradio pequeño.

Código

\documentclass[tikz,convert=false]{standalone}
\usetikzlibrary{chains,calc}
\tikzset{
  /pgf/arc and line maximum/.initial=+1000pt,
  arc and line/.style={
    to path={
      let
        \p{@end}=(\tikztotarget.north),
        \p{@aux1}=($(\tikztostart)-(\p{@end})$),
        \p{@start}=(node cs: name=\tikztostart, anchor={\x{@aux1} < 0pt ? +0 : +180}),
        \n{@aux2}={min(\pgfkeysvalueof{/pgf/arc and line maximum},abs(\x{@start}-\x{@end}),abs(\y{@start}-\y{@end})-.1pt))}
      in
      { [rounded corners=\n{@aux2}] -| (\tikztotarget) }
    }},
  special curve 0/.style={draw,->,arc and line},
  special curve 1/.style={
    special curve 0,
    arc and line maximum=+6pt},
  special curve 2/.style={
    special curve 0,
    arc and line maximum=+0pt},
  every sentence and verb node/.style={
    inner ysep=+.1667em,
    outer ysep=+0pt},
  sentence node/.style={
    every sentence and verb node,
    inner xsep=+0pt,
    outer xsep=+0pt,
    on chain=#1},
  sentence node/.default=sentence,
  verb node/.style={
    every sentence and verb node,
    on grid,
    text depth=+0pt,
    join,
    on chain=#1},
  verb node/.default=verbs
}
\begin{document}
\begin{tikzpicture}[
  node distance=1.5\baselineskip and width(" ")*1pt,
  start chain=sentence going base right,
  start chain=verbs going above,
  every join/.style={draw}
]
\foreach \Item/\Name in {da\ss\space er das Lied/dass,wird,haben,singen,k\"onnen/konnen}
  \node [sentence node, alias=s-\Name] {\Item};
\chainin[on chain=verbs] (s-singen);
\foreach \Item/\Name in {k\"onnen/konnen,haben,wird} {
  \node [verb node, alias=v-\Name] {\Item}
    edge[special curve 2,green] (s-\Name)
    edge[special curve 1,blue]  (s-\Name)
    edge[special curve 0]       (s-\Name);
}
\end{tikzpicture}
\end{document}

Producción

ingrese la descripción de la imagen aquí

Respuesta3

Si lo hace \usetikzlibrary{positioning}, puede definir nodos en términos de otros nodos. Por lo tanto, si define nodos dentro del árbol, puede colocar los nodos fuera del árbol en relación con los nodos dentro del árbol. Esto significa que tendrás que jugar con el espaciado manualmente, pero proporciona una solución. Aquí hay un MWE que debería funcionar para usted:

Actualizar: Como señala @Qrrbrbirlbel en los comentarios, la 'g' en 'singen' altera la alineación vertical de los nodos, entre sí. Esto se solucionó a continuación usando base lefty base rightalineando los nodos entre sí.

\documentclass{article}

\usepackage{qtree}
\usepackage{tikz}
\usepackage{tikz-qtree,tikz-qtree-compat}
\tikzset{every tree node/.style={align=center, anchor=north}}
\usetikzlibrary{positioning}

\begin{document}

\begin{tikzpicture}

\Tree [.\node(1){wird};
          [.\node(2){haben};
              [.\node(3){m\"{u}ssen}; \node(4){singen}; ] ] ]

\node(5)[base left=1.9cm of 4]{dass er das Lied};
\node(6)[base left=1.1cm of 4]{wird};
\node(7)[base left=.1cm of 4]{haben};
\node(8)[base right=.1cm of 4]{m\"{u}ssen};
\draw[->] (1)..controls +(west:1) and +(north:1)..(6);
\draw[->] (2)..controls +(west:1) and +(north:1)..(7);
\draw[->] (3)..controls +(east:1) and +(north:1)..(8);

\end{tikzpicture}

\end{document}

ingrese la descripción de la imagen aquí

información relacionada