我正在尝试在 Tex 中构建一个名为 \rootedtree 的函数,该函数接受以 J. Butcher 符号写成的一棵树,然后在 TikZ 中打印出相应的树。
例如考虑这里的树木:http://alexander.lundervold.com/talks/ICMAT_oct2014/assets/grafting.jpg,忽略这些操作,这里我们不需要它们。从左到右,相应的符号是
[*]
[*,*]
[[*,*],*,*]
ETC。
因此,其思想是 * 对应于一个节点,方括号将内部的节点/树绑定到同一个根。对于计算机科学家来说,请注意,根向下,叶子向上。
所以最终我想要的是这样的
\rootedtree([*,*])
然后在 TikZ 中绘制相应的树,其中根均匀向上分布,例如,如果有一个子节点,那么它直接指向上方(两侧均为 90 度),如果有两个子节点,那么它们之间相差 60 度,两侧相差 60 度。
我自己几乎没有用 Tex 编程的经验,因此不知道如何开始。任何帮助都非常感谢。还有其他软件包吗?它们有类似的功能,我不需要从头开始?
答案1
我之前为此做了一个包。请参阅我的博客。我的解决方案使用 PythonTeX。您可以排版森林和树木,结果将如下所示:
该包基于以下美丽的树木和森林的递归定义(来自我的博客):
如果满足以下条件,森林就是美丽的:
- 每棵子树都是美丽的。
- 两个相邻子树之间的水平距离为一个单位。
- 子树的根尽可能均匀分布。
如果一棵树符合以下条件,那么它就是美丽的:
- 除去树根后得到的森林是美丽的。
- 根和下一级节点之间的垂直距离是一个单位。
- 根的水平位置是子树根的水平位置的中值。
此外:
- 由单个节点组成的树是美丽的。
格式与问题中指定的格式不同,但它非常紧凑,应该很容易使用。例如,上图中的最后一个例子是由
\forest{b,b,b[b,b[b,b,b]],b,b[b,b,b[b,b]],b[b]}
这里,b
是黑色节点,b[...]
表示括号内的所有森林都与其前面的黑色节点相连,并以黑色节点为父节点。森林的指定方式很简单,只需用逗号分隔即可。
可以使用以下方法添加颜色(如右上示例所示)
\newnodecolor{r}{red}
\newnodecolor{w}{white}
\forest{b[w,r]}
该包托管于GitHub。
答案2
像这样吗?
改编自我之前的回答:
\documentclass{article}
\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,
}
}
}
}
\usepackage{xparse}
\DeclareDocumentCommand\rootedtree{o}{\Forest{rooted tree [#1]}}
\begin{document}
\[
\rootedtree
[*]
\,
\rootedtree
[*,*]
\,
\rootedtree
[[*,*],*,*]
\]
\end{document}