
Estou tentando definir um nó entre chaves {}:
\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}
Preciso definir o nó x dentro do ambiente {}, pois quero que o tikz-qtree trate a string 'Algum texto aqui' como uma única unidade. Porém, se eu colocar o ponto e vírgula após o primeiro ou segundo colchete de fechamento, não funciona.
Responder1
Como o texto dentro do nó coberto é um nó interno e você não pode incorporar nós dentro de nós, você precisa atacar esse problema de uma maneira um pouco diferente. A ideia básica é tornar o nó pai do nó coberto o nó nomeado. Então, se você quiser mostrar, por exemplo, uma seta de cada um dos nós, será necessário deslocar o ponto inicial da seta em relação ao nó pai. Aqui está um exemplo:
\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}
Um método alternativo (que talvez seja um pouco mais simples) é definir o próprio texto do telhado como um nó e, em seguida, apenas usar o [xshift]
parâmetro para deslocar o ponto inicial da seta para o local desejado:
\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}
Responder2
Caso tenha passado despercebido a alguém, tendo a preferir forest
desenhar árvores.
Esta solução não requer a repetição manual da palavra 'aqui' ou o ajuste manual do posicionamento do início da seta. É baseado em um exemplo da página 20 do manual, embora eu possa ter distorcido um pouco.
triangle
é usado para o telhado- é definido um estilo
move={}{}
que recebe 2 argumentos: o primeiro especifica o nó para o qual o conteúdo deve ser copiado; a segunda especifica texto adicional a ser adicionado ao nó atual.
Presumo que você talvez não queira fazer exatamente isso, então isso é mais uma ilustração do que uma solução pronta para uso. No exemplo que você deu, você colocaria move={<specification of target node>}{Some text}
e especificaria o conteúdo do nó de origem como here
.
O nó de origem acabaria contendo Some text here
, o nó de destino acabaria contendo here
e uma seta seria desenhada entre um ponto logo abaixo here
no nó de origem e outro logo abaixo here
no nó de destino.
Usei uma 'caminhada relativa do nó' para especificar o nó de destino. No entanto, você também pode adicionar , name=target
ao seu nó de destino e simplesmente colocar move={target}{Some text}
, o que provavelmente é mais simples na maioria dos casos. Adicionei esta alternativa como código comentado na árvore para demonstrar a ideia.
\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}