我试图在花括号 {} 内定义一个节点:
\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
之间绘制一个箭头。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}