
Estoy intentando definir un nodo dentro de llaves {}:
\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\begin{document}
\begin{tikzpicture}
\Tree [.CP \node(y){here}; [.C$'$ C [.TP \edge[roof]; {Some text \node(x){here};} ]]]
\end{tikzpicture}
\end{document}
Necesito definir el nodo x dentro del entorno {} ya que quiero que tikz-qtree trate la cadena 'Algo de texto aquí' como una sola unidad. Sin embargo, si coloco el punto y coma después del primer o segundo corchete de cierre, no funciona.
Respuesta1
Dado que el texto dentro del nodo techado es un nodo en sí mismo internamente y no se pueden incrustar nodos dentro de nodos, es necesario abordar este problema de una manera ligeramente diferente. La idea básica es convertir el nodo padre del nodo techado en el nodo nombrado. Luego, si desea mostrar, por ejemplo, una flecha de cada uno de los nodos, debe desplazar el punto inicial de la flecha en relación con el nodo principal. He aquí un ejemplo:
\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\begin{document}
\begin{tikzpicture}
\Tree [.CP \node(y){here}; [.C$'$ C [.\node(x){TP}; \edge[roof]; {Some text here} ]]]
\draw [->] (x.south)++(.9,-1) to[out=-90,in=-90,looseness=2] (y.south);
\end{tikzpicture}
\end{document}
Un método alternativo (que quizás sea un poco más simple) es definir el texto del techo como un nodo y luego simplemente usar el [xshift]
parámetro para desplazar el punto inicial de la flecha al lugar deseado:
\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\begin{document}
\begin{tikzpicture}
\Tree [.CP \node(y){here}; [.C$'$ C [.TP \edge[roof]; \node(x){Some text here}; ]]]
\draw [->] ([xshift=2.5em]x.south) to[out=-90,in=-90,looseness=2] (y.south);
\end{tikzpicture}
\end{document}
Respuesta2
En caso de que se le haya escapado a alguien, tiendo a preferirlo forest
cuando dibujo árboles.
Esta solución no requiere repetir manualmente la palabra "aquí" ni ajustar manualmente la posición del inicio de la flecha. Está basado en un ejemplo de la página 20 del manual, aunque es posible que lo haya estropeado un poco.
triangle
se utiliza para el techo- Se define un estilo
move={}{}
que toma 2 argumentos: el primero especifica el nodo al que se debe copiar el contenido; el segundo especifica texto adicional para agregar al nodo actual.
Supongo que es posible que no quieras hacer exactamente esto, por lo que esto es más a modo de ilustración que una solución lista para usar. En el ejemplo que diste, pondrías move={<specification of target node>}{Some text}
y especificarías el contenido del nodo de origen como here
.
El nodo de origen terminaría conteniendo Some text here
, el nodo de destino terminaría conteniendo here
y se dibujaría una flecha entre un punto justo debajo here
en el nodo de origen y uno justo debajo here
en el nodo de destino.
He utilizado un 'recorrido relativo por nodos' para especificar el nodo objetivo. Sin embargo, también podría agregarlo , name=target
a su nodo de destino y luego simplemente colocarlo move={target}{Some text}
, lo cual probablemente sea más simple en la mayoría de los casos. Agregué esta alternativa como código comentado en el árbol para demostrar la idea.
\documentclass[tikz,border=5pt]{standalone}
\usepackage{forest}
\begin{document}
\newlength{\sourcetextaddwidth}
\begin{forest}
for tree={
parent anchor=south,
child anchor=north,
fit=rectangle
},
move/.style n args=2{% page 20 of forest manual
before typesetting nodes={
TeX={
\settowidth{\sourcetextaddwidth}{#2}
},
#1.content={##1},
content={#2 ##1},
tikz={
\draw[->] (.south) +(.5\sourcetextaddwidth,0) to [out=south west, in=south] (#1);
},
},
},
[CP
[this is the target node to which text will be moved%, name=target
]
[C$'$
[C
]
[TP
[here, triangle, move={!r1}{Some text}% move={target}{Some text}
]
]
]
]
\end{forest}
\end{document}