我已经使用该属性定义了一棵树pic
以供以后重用,例如下面的 MWE。
\documentclass{standalone}
\usepackage{tikz}
\tikzset {
my tree/.pic = {
\node (4){4}
child { node (5){5}
child { node (15){15} }
child { node (9){9} }
}
child { node (8){8}
child { node (20){20} }
child { node (10){10} }
}
;
},
level 1/.style={sibling distance=35mm, level distance=1cm},
level 2/.style={sibling distance=17mm, level distance=1cm},
level 3/.style={sibling distance=10mm, level distance=1cm},
}
\begin{document}
\begin{tikzpicture}
\pic{my tree};
\end{tikzpicture}
\end{document}
得出
我现在想在另一个tikzpicture
环境中重新绘制my tree
,但将子节点添加到某些节点,例如下面的红色节点
而不必完全重新定义树。
这可以在 TikZ 中实现吗?如果可以,怎么做?
答案1
抱歉,我这么说,但是因为编辑器无法自动缩进而不使用 Forest 是疯了。我不知道是否有编辑器可以正确缩进它 - 我的肯定不行 - 但是 Forest 树仍然比 Ti 更具可读性钾Z 的冗长等价物,即使不是,为了一点点自动格式化而牺牲功能和灵活性也太疯狂了。与手动格式化源代码的小部分相比,您很容易会花更多的时间从头开始破解解决方案。
无论如何,森林是这这样做的方法。这里没有其他任何有意义的方法。(Lua 可能也可以做到这一点,但它不会提供 Forest 提供的现成配方。)
这是针对这个不知感恩的世界的森林解决方案。
首先,我们设置一个样式,my tree
它定义了我们的基础树。它采用一个可选值,可用于指定修改树的代码。
\forestset{
my tree/.style={
delay={
!r.replace by={[4, #1 [5[15][9]][8[20][10]]]},
},
},
}
然后我们可以使用
\Forest{
my tree,
[]
}
第一棵经过修改的树
\Forest{
my tree={
before typesetting nodes={
for nodewalk={fake=r,L}{prepend={[0, red]},append={[1, red]}},
}
},
[]
}
第二个是
\Forest{
my tree={
before typesetting nodes={
for nodewalk={fake=r,l}{replace by={[40, red, append, prepend={[,phantom]}]}}
},
},
[]
}
您还可以在进行修改时命名基础树中的节点,以便于参考或按内容搜索等。
\documentclass[border=10pt]{standalone}
\usepackage{forest}
\forestset{
my tree/.style={
delay={
!r.replace by={[4, #1 [5[15][9]][8[20][10]]]},
},
},
}
\begin{document}
\Forest{
my tree,
[]
}
\Forest{
my tree={
before typesetting nodes={
for nodewalk={fake=r,L}{prepend={[0, red]},append={[1, red]}},
}
},
[]
}
\Forest{
my tree={
before typesetting nodes={
for nodewalk={fake=r,l}{replace by={[40, red, append, prepend={[,phantom]}]}}
},
},
[]
}
\end{document}