TikZ`来自父级的边`后跟一个节点。

TikZ`来自父级的边`后跟一个节点。

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}

在此处输入图片描述

相关内容