答案1
tikzpicture
应避免嵌套环境。它保证了不可预测性 ;)。
不过,有一个简单的方法可以做到这一点森林它提供了tikz
在绘制树之后向节点添加注释的关键:
\documentclass[border=10pt,tikz]{standalone}
\usepackage{forest}
\usetikzlibrary{positioning}
\begin{document}
\Forest{
[A, tikz={\node[circle, draw, inner sep=.15ex, right=0pt of .east] {1};} [B] [C]]
}
\end{document}
这样做的好处是您可以使用相对节点名称。这.east
是east
当前节点的锚点。我们需要调整间距以避免节点重叠。我使用了positioning
推荐的间距,但如果出于某种原因必须这样做,您也可以不用它。
如果需要节点更近,请考虑减少或消除inner sep
:
\Forest{
[A, tikz={\node[circle, draw, inner sep=0pt, right=0pt of .east] {1};} [B] [C]]
}
或使用负值:
\Forest{
[A, tikz={\node[circle, draw, inner sep=0pt, right=-2.5pt of .east] {1};} [B] [C]]
}
编辑
上述解决方案的唯一问题是,如果经常需要,它会变得相当繁琐,并且如果数字变大,圈出的数字可能会与兄弟节点重叠。
此外,也可以(也许稍微简单一点)使用森林的label
选项来创建带圆圈的数字作为节点的标签。
label={[circle, draw, inner sep=.15ex, label distance=-2.5pt, anchor=west]east:<number to be circled>}
但是,输入起来一点也不乏味。因此,创建一种允许我们编写的样式会很方便,例如,circ=89
用圆圈标记节点89
:
\forestset{
circ/.style={
label={[circle, draw, inner sep=.15ex, label distance=-2.5pt, anchor=west]east:#1}
},
}
现在我们可以写
\Forest
{
[A, circ=3
[B
[D, circ=-4
]
]
[C, circ=4499]
]
}
生产
这更方便。
如果数字都在树的边界上,这种方法就很好,但如果它们出现在树内的节点之间,这种方法就不太好:
为了解决这个问题,我们可以增加该特定节点的兄弟节点之间的距离。我们希望自动执行此操作,但我们只想在必要时执行此操作,因此我们添加了一些条件代码circ
:
circ/.style={
label={[circle, draw, inner sep=.15ex, label distance=-2.5pt, anchor=west]east:#1},
if level=0{}{
if n'=1{}{
if={equal(n_children("!u"),1)}{}{
!u.s sep+/.pgfmath={width("#1")+.3ex+.8pt},
}
},
},
}
从而产生了这个
完整代码:
\documentclass[border=10pt,tikz]{standalone}
\usepackage{forest}
\forestset{
circ/.style={
label={[circle, draw, inner sep=.15ex, label distance=-2.5pt, anchor=west]east:#1},
if level=0{}{
if n'=1{}{
if={equal(n_children("!u"),1)}{}{
!u.s sep+/.pgfmath={width("#1")+.3ex+.8pt},
}
},
},
}
}
\begin{document}
\Forest
{
[A, circ=3
[B
[D, circ=-4
[E, circ=895]
[F]
]
]
[C, circ=4499]
]
}
\end{document}