我找到了绘制单色根树(数值分析中使用的 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
这是另一种选择。像你之前那样定义一个\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
,您填充白色,然后内容再次可见。由于您的内容是,因此.
您看到的是所谓的小黑点。
那么,对于你的问题:
- 保持“hacky”风格,您可以在自己的风格中添加白色文本
white node
。 - 指定
north
和south
锚点,加上零值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
。