![TikZ`来自父级的边`后跟一个节点。](https://linux22.com/image/232321/TikZ%60%E6%9D%A5%E8%87%AA%E7%88%B6%E7%BA%A7%E7%9A%84%E8%BE%B9%60%E5%90%8E%E8%B7%9F%E4%B8%80%E4%B8%AA%E8%8A%82%E7%82%B9%E3%80%82.png)
TikZ 文档给出了在树的边上添加标签的以下示例:
\begin{tikzpicture}
\node {r}
child {node {t}
edge from parent node {label}};
\end{tikzpicture}
现在,我想调整绘制边缘的方式。也就是说,我希望能够指定任意数量的线来连接两个节点。我已经非常接近了,但是当我想在中间标记时,我遇到了困难,就像示例中那样。我的问题在于以下简化的示例:
[edge from parent path={%
\foreach \n in {0} { (\tikzparentnode) -- (\tikzchildnode) }}]
当进行此调整时,label
第一个示例中的 会粘在图片底部。我的第一个想法是添加一部分路径,以便 可以node {label}
附加到某物上。我能想到的最接近的方法是:
[edge from parent path={%
\foreach \n in {0} { (\tikzparentnode) -- (\tikzchildnode) };
\path ($(\tikzparentnode)!.5!(\tikzchildnode)$)}]
这将终止路径并开始新的路径。现在,它label
被定位在正确的位置。但这里有一个奇怪的事情。让我们定义一个计数器来查看实际绘制了多少条路径(预期值为 1):
\newcounter{cnt}\setcounter{cnt}{0}
\begin{tikzpicture}%
[edge from parent path={%
\pgfextra{\addtocounter{cnt}{1}}%
\foreach \n in {0} { (\tikzparentnode) -- (\tikzchildnode) };
\path ($(\tikzparentnode)!.5!(\tikzchildnode)$)}]
\node (root) {r}
child {node {t}
edge from parent node {label}};
\end{tikzpicture}
\arabic{cnt}
使用我之前的修复,路径被绘制了……2 次!(我注意到这一点是因为有多条线路,所以非常明显)。另外,如果我在后面立即加上分号{label}
,似乎一切都运行顺利;问题是,通常的语法也必须起作用……
总结一下,我的问题是:
我该如何重新定义,edge from parent path
以便可以foreach
在其中使用,并且仍然能够在节点中间放置标签?
答案1
解决方案是抑制绘图edge from parent
本身并定义绘制特定边缘的代码(在用户定义内pgfkey
),这应该作为选项执行。唉,每次要绘制标签节点时,edge from parent
可能都会产生不受欢迎的后果,让您明确说明。edge from parent
\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{trees}
\begin{document}
\begin{tikzpicture}[
edge from parent/.style=my incredible edge,
my incredible edge/.code={
\foreach \n in {0.5,1} {
\draw (\tikzparentnode.south) .. controls +(0,-\n) and +(0,\n) .. (\tikzchildnode.north);
}
}
]
\node {root}
child {node {left}}
child {node {right}
child {node {child}}
child {node {child}} edge from parent node[near end] (A) {label}
};
\filldraw[red] (A) circle[radius=1pt];
\end{tikzpicture}
\end{document}