以下 MWE 基于forest
文档中的示例。dot
样式(在%%%
符号之间标记)应该接受一个参数,该参数指定树中点的样式(主要是颜色)。虽然它适用于命名颜色,但设置dot={draw=none}
无效。通常,将draw
/设置fill
为none
应该绘制/填充无颜色的路径。
dot
是什么导致了这种奇怪的现象?这是否与使用 定义的有关\tikz+
?
平均能量损失
\documentclass{standalone}
\usepackage{forest}
\forestset{
declare toks={elo}{}, % Edge Label Options
anchors/.style={anchor=#1,child anchor=#1,parent anchor=#1},
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
dot/.style={tikz+={\draw[#1] (.child anchor) circle[radius=1.5pt];}},
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
decision edge label/.style n args=3{
edge label/.expanded={node[midway,auto=#1,anchor=#2,\forestoption{elo}]{\strut$\unexpanded{#3}$}}
},
decision/.style={if n=1
{decision edge label={left}{east}{#1}}
{decision edge label={right}{west}{#1}}
},
text/.style={plain content},
decision tree/.style={
for tree={
s sep=0mm,l=5mm,
if n children=0{anchors=north}{
if n=1{anchors=south east}{anchors=south west}},
math content,
/tikz/font=\footnotesize,
},
anchors=south, outer sep=2pt,
dot={fill=white},for descendants={dot={fill}},
delay={for descendants={split option={content}{;}{decision,content}}},
}
}
\begin{document}
\begin{forest} decision tree
[N,plain content
[x;I,dot={draw=none,fill=red}] % 'draw=none' doesn't work here
[x;I,dot={draw=red,fill=none}] % 'fill=none' doesn't work here
]
% 'draw=none' works fine below
\draw[draw=none](!1.anchor)--(!2.anchor)node[midway,above]{$x$};
\end{forest}
\end{document}
输出
答案1
draw=none
在 中运行良好tikz+
,就像在样式中一样dot
:
\begin{forest}
[abc, dot={draw=none, fill=red}
]
\end{forest}
但是,tikz
与 不同tikz+
。tikz+
是累积的。因此,如果你说
for descendants={%
dot={fill},
},
然后,对于当前节点(此处为根)的所有后代,dot
将以样式作为其参数执行fill
,并将以下命令添加到列表中以供稍后使用:
\draw [fill] (.child anchor) circle [radius=1.5pt];
如果您dot
再次应用到特定节点,dot
则会使用相关参数再次执行。例如,
dot={draw=none, fill=red}
将其添加到稍后要使用的 TikZ 命令列表中:
\draw [draw=none, fill=red] (.child anchor) circle [radius=1.5pt];
所以现在对于这个节点发生的情况是,当树被绘制出来时,这两个命令将一个接一个地被使用:
\draw [fill] (.child anchor) circle [radius=1.5pt];
\draw [draw=none, fill=red] (.child anchor) circle [radius=1.5pt];
第一个命令绘制圆圈并用黑色填充。第二个命令在完全相同的位置添加另一个圆圈,未绘制但填充为红色。因此,您在输出中看到的是二圆圈,一个在另一个之上。
如果你只想要最后的使用dot
才能有效,将定义改为使用tikz
而不是tikz+
。但是,使用dot
会覆盖任何其他tikz
节点的/ tikz+
/用法+tikz
。如果这不是问题,那么解决方案就非常简单了。如果这是问题,您需要做更多的工作才能使其按预期工作,或者确保所有调用都dot
发生前TikZ 命令列表中进行了任何其他添加。
以下是简单情况的修改后的代码,它强制执行每个节点最多一个点的策略:
\documentclass[tikz,multi,border=10pt]{standalone}
\usepackage{forest}
\forestset{
declare toks={elo}{}, % Edge Label Options
anchors/.style={%
anchor=#1,
child anchor=#1,
parent anchor=#1,
},
dot/.style={%
tikz={%
\draw [#1] (.child anchor) circle [radius=1.5pt];
},
},
decision edge label/.style n args=3{
edge label/.expanded={%
node [midway, auto=#1, anchor=#2, \forestoption{elo}] {\strut$\unexpanded{#3}$}
}
},
decision/.style={%
if n=1{%
decision edge label={left}{east}{#1},
}{%
decision edge label={right}{west}{#1},
}
},
decision tree/.style={
for tree={
s sep=0mm,
l=5mm,
if n children=0{anchors=north}{
if n=1{%
anchors=south east,
}{%
anchors=south west,
},
},
math content,
font=\footnotesize,
},
anchors=south,
outer sep=2pt,
dot={%
fill=white,
},
for descendants={%
dot={fill},
},
delay={%
for descendants={%
split option={content}{;}{decision,content},
},
},
}
}
\begin{document}
\begin{forest}
decision tree
[N, plain content
[x;I, dot={draw=none, fill=red}
]
[x;I, dot={draw=red, fill=none}
]
]
\end{forest}
\end{document}