
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:
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-2
y así sucesivamente. Esto facilita agregar más palabras además M-1-7
y 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}
Respuesta2
Hm, un árbol no se ve bien. ¿Qué pasa con las cadenas?
Instalamos dos cadenas:
- La cadena
sentence
va hacia la derecha,sentence going base right
, - La cadena
verbs
sube,verbs going above
.
En la sentence
cadena 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 \Name
en el bucle , simplemente se utilizará \foreach
el texto.\Item
La distancia de los nodos horizontales .3333em
se establece de manera que los nodos queden colocados como lo harían en una oración, para esto también ponemos inner xsep
y outer xsep
a 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 ysep
tiene la mitad del tamaño predeterminado. También se outer ysep
establece en cero (no tenemos ningún nodo dibujado).
Los nodos de la cadena vertical se conectan automáticamente mediante la join
opción (que usa el every join
estilo). Las conexiones a los nodos de la oración también se realizan en el segundo bucle.
El arc and line
estilo 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 maximum
en 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 calc
biblioteca y esas let … in
cosas.
Con arc and line maximum
el valor cero obtenemos el -|
camino básico con esquinas afiladas. Como arriba, no necesitaríamos calc
esos cálculos.
Personalmente prefiero la variante azul con un rounded corners
radio 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
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 left
y base right
alineando 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}