Definindo nó entre chaves

Definindo nó entre chaves

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}

saída de código

Responder2

Caso tenha passado despercebido a alguém, tendo a preferir forestdesenhar á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 heree uma seta seria desenhada entre um ponto logo abaixo hereno nó de origem e outro logo abaixo hereno nó de destino.

Usei uma 'caminhada relativa do nó' para especificar o nó de destino. No entanto, você também pode adicionar , name=targetao 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}

árvore automatizada

informação relacionada