我有一个命令,用于将文本放入带有背景颜色的圆角框中。它使用 tikz 节点:
\newcommand\mybox[1]{\tikz[overlay]\node[fill=blue!20, rectangle, rounded corners=2pt]{#1};}
当我在森林节点内使用此框时,节点不会出现。请告诉我原因?如何在森林中实现相同的效果,同时仍具有像 tikz 一样的良好格式选项?
梅威瑟:
\documentclass{article}
\usepackage{forest}
\newcommand\mybox[1]{\tikz[overlay]\node[fill=blue!20, rectangle, rounded corners=2pt]{#1};}
\begin{document}
\tikz\node[fill=blue!20,rectangle, rounded corners=2pt]{123};
\mybox{inside box}
\begin{forest}
for tree={align=center, parent anchor=south, child anchor=north, l sep=5mm}
[\tikz\node{eee}; node1
[\mybox{2} node2
[\mybox{3} node3]
[\mybox{4} node4]
]
]
\end{forest}
\end{document}
答案1
正如所提到的阿博阿马尔,这里的技巧是使用森林的键来获取所需的结果。
为了方便起见,我们可以定义一个 TikZ 样式和相应的森林一。
\tikzset{
my blue box/.style={fill=blue!20, rectangle, rounded corners=2pt},
}
\forestset{
my blue label/.style={
label={[my blue box]left:#1},
s sep+=10pt,
}
}
作为阿博阿马尔秀for tree
,如果设置应该简单地应用于树的每个节点,则可以传入 TikZ 样式。
\begin{forest}
for tree={
align=center,
parent anchor=south,
child anchor=north,
l sep=5mm,
my blue box,
}
[eee node1
[2 node2
[3 node3]
[4 node4]
]
]
\end{forest}
或者您可以使用森林样式可轻松指定要在树中特定节点左侧创建的标签的内容。
\begin{forest}
for tree={
align=center,
parent anchor=south,
child anchor=north,
l sep=5mm,
}
[node1, my blue label=eee
[node2, my blue label=2
[node3, my blue label=3]
[node4, my blue label=4]
]
]
\end{forest}
在某些情况下,还可以根据树中节点位置等信息自动添加标签。例如,根据节点的级别或相对于其兄弟节点的位置,或者在本例中根据节点的内部id
。
然后可以使用之前使用的样式覆盖特定节点的默认标签my blue label
。
\begin{forest}
for tree={
align=center,
parent anchor=south,
child anchor=north,
l sep=5mm,
label/.wrap pgfmath arg={% specify default label for nodes
{[my blue box]left:#1}
}{int(id()-1)},
s sep+=10pt,
}
[node1, my blue label=eee% override default label for this node
[node2
[node3]
[node4]
]
]
\end{forest}
另一个类似的选项是在绘制树后使用 TikZ 代码添加标签。我们可以再添加几个森林风格来促进这一点。
\forestset{
...
my blue postscript/.style={
tikz={\node [my blue box, anchor=east] at (.west) {#1};},
s sep+=10pt,
},
auto blue postscripts/.style={
my blue postscript/.wrap pgfmath arg={##1}{int(id()-1)},
}
}
然后,auto blue postscripts
将像以前一样自动添加标签,my blue postscript=<content>
如果未激活自动标签或在特定情况下应覆盖自动标签,则会添加特定标签。
然后
\begin{forest}
for tree={
align=center,
parent anchor=south,
child anchor=north,
l sep=5mm,
auto blue postscripts,
}
[node1, my blue postscript=eee
[node2
[node3]
[node4]
]
]
\end{forest}
但是,我认为在这种情况下这种更复杂的选项并没有真正的优势,所以我建议采用label
上述方法。
完整代码:
\documentclass[tikz, border=10pt, multi]{standalone}
\usepackage{forest}
\begin{document}
\tikzset{
my blue box/.style={fill=blue!20, rectangle, rounded corners=2pt},
}
\forestset{
my blue label/.style={
label={[my blue box]left:#1},
s sep+=10pt,
},
my blue postscript/.style={
tikz={\node [my blue box, anchor=east] at (.west) {#1};},
s sep+=10pt,
},
auto blue postscripts/.style={
my blue postscript/.wrap pgfmath arg={##1}{int(id()-1)},
}
}
\begin{forest}
for tree={
align=center,
parent anchor=south,
child anchor=north,
l sep=5mm,
my blue box,
}
[eee node1
[2 node2
[3 node3]
[4 node4]
]
]
\end{forest}
\begin{forest}
for tree={
align=center,
parent anchor=south,
child anchor=north,
l sep=5mm,
}
[node1, my blue label=eee
[node2, my blue label=2
[node3, my blue label=3]
[node4, my blue label=4]
]
]
\end{forest}
\begin{forest}
for tree={
align=center,
parent anchor=south,
child anchor=north,
l sep=5mm,
label/.wrap pgfmath arg={
{[my blue box]left:#1}
}{int(id()-1)},
s sep+=10pt,
}
[node1, my blue label=eee
[node2
[node3]
[node4]
]
]
\end{forest}
\begin{forest}
for tree={
align=center,
parent anchor=south,
child anchor=north,
l sep=5mm,
auto blue postscripts,
}
[node1, my blue postscript=eee
[node2
[node3]
[node4]
]
]
\end{forest}
\end{document}
答案2
只需将以下内容添加到您的树选项中:rounded corners=2pt, fill=blue!20
并且不需要\mybox{}
您创建的命令。
\documentclass{article}
\usepackage{forest}
\begin{document}
\begin{forest}
for tree={align=center, parent anchor=south, child anchor=north, l sep=5mm, rounded corners=2pt, fill=blue!20}
[node1
[ node2
[ node3]
[ node4]
]
]
\end{forest}
\end{document}