
O MWE a seguir é baseado em um exemplo da forest
documentação. O dot
estilo (marcado entre %%%
sinais) deve receber um argumento especificando estilos (principalmente cores) para os pontos na árvore. Embora funcione para cores nomeadas, a configuração dot={draw=none}
não tem efeito. Normalmente, a configuração draw
/ fill
to none
deve desenhar/preencher o caminho sem cor.
O que causa esse efeito curioso? Isso tem algo a ver com o fato de dot
ser definido usando \tikz+
?
MWE
\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}
Saída
Responder1
draw=none
funciona bem em tikz+
, assim como no dot
estilo:
\begin{forest}
[abc, dot={draw=none, fill=red}
]
\end{forest}
No entanto, tikz
não é o mesmo que tikz+
. tikz+
é cumulativo. Portanto, se você disser
for descendants={%
dot={fill},
},
então, para todos os descendentes do nó atual (raiz aqui), o dot
estilo é executado fill
como argumento e os seguintes comandos são adicionados à lista para serem usados posteriormente:
\draw [fill] (.child anchor) circle [radius=1.5pt];
Se você aplicar dot
novamente a um nó específico, dot
será executado novamente com o argumento relevante. Por exemplo,
dot={draw=none, fill=red}
adiciona isso à lista de comandos TikZ a serem usados posteriormente:
\draw [draw=none, fill=red] (.child anchor) circle [radius=1.5pt];
Então agora o que acontece com este nó é que ambos os comandos serão usados, um após o outro, quando a árvore for desenhada:
\draw [fill] (.child anchor) circle [radius=1.5pt];
\draw [draw=none, fill=red] (.child anchor) circle [radius=1.5pt];
O primeiro desenha e preenche o círculo em preto. A segunda adiciona outro círculo, não desenhado, mas com preenchimento vermelho, exatamente no mesmo lugar. Então, o que você vê na saída édoiscírculos, um sobre o outro.
Se você quiser apenas oduraruse of dot
para ser eficaz, altere a definição para use tikz
em vez de tikz+
. No entanto, o uso de dot
substituirá qualqueroutrousos de tikz
/ tikz+
/ +tikz
para o nó. Se isso não for um problema, a solução é muito simples. Se for um problema, você precisará fazer mais ginástica para que funcione conforme desejado ou garantir que todas as invocações dot
ocorramantesquaisquer outras adições são feitas à lista de comandos TikZ.
Aqui está o código alterado para o caso simples, que impõe uma política de no máximo um ponto por nó:
\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}