
El siguiente MWE se basa en un ejemplo de la forest
documentación. Se supone que el dot
estilo (marcado entre signos) toma un argumento que especifica estilos (principalmente colores) para los puntos en el árbol. %%%
Si bien funciona para colores con nombre, la configuración dot={draw=none}
no tiene ningún efecto. Normalmente, se supone que configurar draw
/ fill
to none
dibuja/rellena el camino sin color.
¿A qué se debe este curioso efecto? ¿Tiene esto algo que ver con el hecho de que dot
se define 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}
Producción
Respuesta1
draw=none
funciona bien en tikz+
, como lo hace en el dot
estilo:
\begin{forest}
[abc, dot={draw=none, fill=red}
]
\end{forest}
Sin embargo, tikz
no es lo mismo que tikz+
. tikz+
es acumulativo. Por lo tanto, si dices
for descendants={%
dot={fill},
},
luego, para todos los descendientes del nodo actual (raíz aquí), el dot
estilo se ejecuta con fill
su argumento y los siguientes comandos se agregan a la lista para usarse más adelante:
\draw [fill] (.child anchor) circle [radius=1.5pt];
Si luego se aplica dot
nuevamente a un nodo en particular, dot
se ejecuta nuevamente con el argumento correspondiente. Por ejemplo,
dot={draw=none, fill=red}
agrega esto a la lista de comandos de TikZ que se usarán más adelante:
\draw [draw=none, fill=red] (.child anchor) circle [radius=1.5pt];
Entonces, lo que sucede con este nodo es que ambos comandos se usarán, uno tras otro, cuando se haya dibujado el árbol:
\draw [fill] (.child anchor) circle [radius=1.5pt];
\draw [draw=none, fill=red] (.child anchor) circle [radius=1.5pt];
El primero dibuja y rellena el círculo de negro. El segundo añade otro círculo, sin dibujar pero con un relleno rojo, exactamente en el mismo lugar. Entonces lo que ves en el resultado esdoscírculos, uno sobre el otro.
Si quieres solo elúltimoPara que el uso de dot
sea efectivo, cambie la definición a usar tikz
en lugar de tikz+
. Sin embargo, el uso dedot
sobrescribirá cualquierotrousos de // tikz
para el nodo. Si esto no es un problema, la solución es muy sencilla. Si es un problema, necesitarás hacer un poco más de gimnasia para que funcione como deseas o asegurarte de que todas las invocaciones detikz+
+tikz
dot
se produzcan todas las invocaciones.antescualquier otra adición se realiza a la lista de comandos de TikZ.
Aquí está el código modificado para el caso sencillo, que aplica una política de como máximo un punto por nodo:
\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}