具有白色和黑色节点的彩色根树(屠夫树)

具有白色和黑色节点的彩色根树(屠夫树)

我找到了绘制单色根树(数值分析中使用的 Butcher 树)的解决方案TikZ 中的屠夫树

我想将其改编为具有白色和黑色节点的彩色树。到目前为止,我正在使用上述链接中的以下代码改编版。

\documentclass{standalone}

% Butcher trees, cf. https://tex.stackexchange.com/questions/283343/butcher-trees-in-tikz
\usepackage{forest}
\forestset{
  */.style={
    delay+={append={[]},}
  },
  rooted tree/.style={
    for tree={
      grow'=90,
      parent anchor=center,
      child anchor=center,
      s sep=2.5pt,
      if level=0{
        baseline
      }{},
      delay={
        if content={*}{
          content=,
          append={[]}
        }{}
      }
    },
    before typesetting nodes={
      for tree={
        circle,
        fill,
        minimum width=3pt,
        inner sep=0pt,
        child anchor=center,
      },
    },
    before computing xy={
      for tree={
        l=5pt,
      }
    }
  },
  white node/.style={
    circle, fill=white, draw=black, thick,
  },
}
\DeclareDocumentCommand\rootedtree{o}{\Forest{rooted tree [#1]}}

\begin{document}

\rootedtree[]

\rootedtree[[]]

\rootedtree[.,white node]

\rootedtree[.,white node[]]

\rootedtree[[.,white node]]

\end{document}

这给出

在此处输入图片描述

我有两个问题:

  1. 如何去掉“白色节点”中的小黑点?
  2. 我怎样才能让边缘结束于外圆?

答案1

这是另一种选择。像你之前那样定义一个\NewDocumentCommand调用rootedtree,但节点要么是已填充的节点,要么是开放的节点。以下是一些示例.o

在此处输入图片描述

使用代码创建

\rootedtree[.]\rootedtree[.[.]]\rootedtree[o]\rootedtree[o[.]]\rootedtree[.[o][o, colornode]]

对于使用不同颜色填充的节点,还有一个附加选项,即[o, colornode=<color>],默认设置为red

\documentclass{article}

\usepackage{forest}
\forestset{
    whitenode/.style={draw, circle, minimum size=2mm, inner sep=0pt},
    blacknode/.style={draw, fill=black, circle, minimum size=2mm, inner sep=0pt},
    colornode/.style={draw, fill=#1, circle, minimum size=2mm, inner sep=0pt},
    colornode/.default={red}
}

\newcommand{\blank}{\rule{0pt}{0pt}}
\NewDocumentCommand\rootedtree{o}{\begin{forest}
    for tree={grow'=90, very thick, edge=very thick, l sep=2mm, l=2mm},
    delay={where content={}{for children={no edge, before drawing tree={for tree={y-=5mm}}}}
    {where content={o}{content={\blank}, whitenode}{where content={.}{content={\blank}, blacknode}{}}}}
    [#1]
\end{forest}}

\begin{document}

\rootedtree[.]\qquad
\rootedtree[.[.]]\qquad
\rootedtree[o]\qquad
\rootedtree[o[.]]\qquad
\rootedtree[.[o][o, colornode]]\qquad
\rootedtree[[.][.][.[.][.[.][.][.]]][.][.[.][.][.[.][.]]][.[.]]]

\end{document}

也可以将森林设计为单根树——只需将根节点留空即可。

在此处输入图片描述

\rootedtree[[.][.][.[.][.[.][.][.]]][.][.[.][.][.[.][.]]][.[.]]]

答案2

您正在指定center父/子节点锚点,这决定了节点的连接方式。摘自手册forest

和选项分别指示父节点和子parent anchor节点child anchor之间的边的端点应该在哪里

此外,您使用“技巧”通过填充黑色(默认情况下)来隐藏节点内容。但是,在 中white node,您填充白色,然后内容再次可见。由于您的内容是,因此.您看到的是所谓的小黑点

那么,对于你的问题:

  1. 保持“hacky”风格,您可以在自己的风格中添加白色文本white node
  2. 指定northsouth锚点,加上零值outer sep

这里你的MWE修改了:

\documentclass{standalone}
\usepackage{forest}
\forestset{
    */.style={
        delay+={append={[]},}
    },
    rooted tree/.style={
        for tree={
            grow'=90,
            parent anchor=north,
            child anchor=south,
            s sep=2.5pt,
            if level=0{
                baseline
            }{},
            delay={
                if content={*}{
                    content=,
                    append={[]}
                }{}
            }
        },
        before typesetting nodes={
            for tree={
                circle,
                fill,
                minimum width=3pt,
                inner sep=0pt,
                outer sep=0pt,
            },
        },
        before computing xy={
            for tree={
                l=5pt,
            }
        }
    },
    white node/.style={
        circle, fill=white, draw=black, thick, text=white
    },
    old white node/.style={% For demonstration purposes
        circle, fill=white, draw=black, thick
    }
}
\DeclareDocumentCommand\rootedtree{o}{\Forest{rooted tree [#1]}}
\begin{document}
    \rootedtree[]
    
    \rootedtree[[]]
    
    \rootedtree[.,white node]
    
    \rootedtree[.,white node[]]
    
    \rootedtree[[.,white node]]
    
    \rootedtree[[x,old white node]] % For demonstration purposes
\end{document}
平均能量损失

最右边的树只是为了具体展示发生了什么小黑点

顺便说一句,您的方法是生成具有不同维度的节点,因为您确实指定了minimum size,但这小于通过将 用作.节点内容所确定的维度。最后,您通常不会对draw节点的轮廓进行处理,但您会对 进行处理white nodes

相关内容