tikz 参数化圆节点,树形图中内部有 t 线

tikz 参数化圆节点,树形图中内部有 t 线

我想绘制一个由圆形节点组成的树形图,其中三个子部分由一条 t 线分隔(见下面的示例)。我不想手动分离每个树节点,而是只指定节点的样式,并附带至少三个参数(圆形节点图内的字段)。我已经通过将以下内容放入来实现以下效果:此 stackexchange 圆圈节点与 t 线示例变成一种风格:

\tikzset{%
  sectors/.style n args={5}{%
    circle,
    draw,
    minimum width=#4,
    append after command={
      \pgfextra{
        \draw (\tikzlastnode.center) -- (\tikzlastnode.south) ;
        \draw (\tikzlastnode.west)   -- (\tikzlastnode.east) ;
        \path (\tikzlastnode.center) -- node[#5] {#1} (\tikzlastnode.north);  
        \path (\tikzlastnode.center) -- node[#5] {#2} (\tikzlastnode.south west); 
        \path (\tikzlastnode.center) -- node[#5] {#3} (\tikzlastnode.south east);
      }
    }
  }
}

只要只有一个根节点,这种方法就很好。但是,每当我想绘制子节点时,tikz 就会编译失败,提示“错误:没有已知的形状名称。[...]”。因此,以下方法不起作用。

\begin{tikzpicture}[]

  \node[sectors={0}{1}{1}{1.5cm}{}]{}%
    child{ 
      node [sectors={1}{2}{3}{1.5cm}{font=\bfseries}]{} 
    };%
\end{tikzpicture}

我已经注意到了在树结构中使用 tex 宏但我无法通过那里给出的答案找到解决方案。我没有指定简单的 tex-macro,而是指定了参数化样式。也许在底层这类似,但我不是 tikz 方面的专业人士,因此无法将解决方案应用于这种情况。

任何帮助,将不胜感激。

这里您可以看到我想要实现的树结构的轮廓: 具有由 T 线分隔的圆形节点的树形结构

答案1

append after command使用与树用于连接节点的类似方法来保存节点的名称。为此,我借用了 alabel或 a中的大部分代码pin并将其应用于您的示例中。我在这里使用edges,因为对于您的\pgfextra示例,您还需要额外的\pgfinterruptpath

不幸的是,这两种实现都没有从节点继承样式。path picture如果我没记错的话,它确实继承了样式,但与变换结合使用时非常不切实际,而且您无法使用节点的锚点。

为了获得最佳体验,最好将其作为单独的形状来实现(至少是圆圈内的线条)。

代码

\documentclass[tikz]{standalone}
\makeatletter
\tikzset{
  sectors/.style n args={5}{
    shape=circle, draw, minimum width={#4},
    append after command={%
      \bgroup
        [current point is local = true]
        \pgfextra{\let\tikz@save@last@fig@name=\tikz@last@fig@name}
        {[-,shorten >=+.5\pgflinewidth, shorten <=+.5\pgflinewidth]
          (\tikzlastnode.west)   edge (\tikzlastnode.east)
          (\tikzlastnode.center) edge (\tikzlastnode.south)
          [every edge/.style=]   edge node[#5] {#1} (\tikzlastnode.north)
                                 edge node[#5] {#2} (\tikzlastnode.south west)
                                 edge node[#5] {#3} (\tikzlastnode.south east)
        }
        \pgfextra{\global\let\tikz@last@fig@name=\tikz@save@last@fig@name}
      \egroup}}}
\makeatother
\begin{document}
\begin{tikzpicture}
  \node[sectors={0}{1}{1}{1.0cm}{}] {}%
    child{ 
      node [sectors={1}{2}{3}{1.0cm}{font=\bfseries}] {} 
    };
\end{tikzpicture}
\end{document}

相关内容