Определение узла внутри фигурных скобок

Определение узла внутри фигурных скобок

Я пытаюсь определить узел внутри фигурных скобок {}:

\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}

Мне нужно определить узел x внутри окружения {}, так как я хочу, чтобы tikz-qtree обрабатывал строку 'Some text here' как единое целое. Однако, если я поставлю точку с запятой после первой или второй закрывающей скобки, это не сработает.

решение1

Поскольку текст внутри узла с крышей сам по себе является узлом, и вы не можете встраивать узлы в узлы, вам нужно подойти к решению этой проблемы немного по-другому. Основная идея заключается в том, чтобы вместо этого сделать родительский узел узла с крышей именованным узлом. Затем, если вы хотите показать, например, стрелку из каждого из узлов, вам нужно сместить начальную точку стрелки относительно родительского узла. Вот пример:

\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}

Альтернативный метод (который, возможно, немного проще) — определить сам текст крыши как узел, а затем просто использовать параметр [xshift]для смещения начальной точки стрелки в желаемое место:

\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}

вывод кода

решение2

На всякий случай, если кто-то это заметил, скажу, что я предпочитаю forestрисовать деревья.

Это решение не требует ручного повторения слова «здесь» или ручной корректировки положения начала стрелки. Оно основано на примере со страницы 20 руководства, хотя я, возможно, немного его исказил.

  • triangleиспользуется для крыши
  • определяется стиль, move={}{}который принимает 2 аргумента: первый указывает узел, в который следует скопировать содержимое; второй указывает дополнительный текст, который следует добавить к текущему узлу.

Я предполагаю, что вы, возможно, не захотите делать именно это, поэтому это больше для иллюстрации, чем готовое решение. В приведенном вами примере вы бы поместили move={<specification of target node>}{Some text}и указали бы содержимое исходного узла как here.

Исходный узел в конечном итоге будет содержать Some text here, целевой узел в конечном итоге будет содержать , hereи стрелка будет нарисована между точкой, расположенной чуть ниже hereв исходном узле, и точкой, расположенной чуть ниже hereв целевом узле.

Я использовал «относительный обход узла» для указания целевого узла. Однако вы могли бы в равной степени добавить , name=targetк целевому узлу и затем просто поставить move={target}{Some text}, что, вероятно, проще в большинстве случаев. Я добавил эту альтернативу как закомментированный код в дереве, чтобы продемонстрировать идею.

\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}

автоматизированное дерево

Связанный контент