在花括号内定义节点

在花括号内定义节点

我试图在花括号 {} 内定义一个节点:

\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在画树时这样做。

此解决方案不需要手动重复单词“here”或手动调整箭头起点的位置。它基于手册第 20 页的示例,尽管我可能对其进行了一点改动。

  • triangle用于屋顶
  • move={}{}定义一个样式,它接受两个参数:第一个参数指定应该将内容复制到的节点;第二个参数指定要添加到当前节点的附加文本。

我假设您可能不想这样做,因此这更多的是举例说明,而不是现成的解决方案。在您给出的示例中,您将输入move={<specification of target node>}{Some text}并将源节点的内容指定为here

然后,源节点将最终包含Some text here,目标节点将最终包含,并且将在源节点正下方的点和目标节点正下方的点here之间绘制一个箭头。herehere

我使用了“相对节点遍历”来指定目标节点。但是,您也可以同样添加, 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}

自动树

相关内容