
Следующий MWE основан на примере из forest
документации. dot
Стиль (отмеченный между %%%
знаками) должен принимать аргумент, определяющий стили (в первую очередь цвета) для точек в дереве. Хотя он работает для именованных цветов, настройка dot={draw=none}
не имеет никакого эффекта. Обычно настройка draw
/ fill
to 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}