MWE

MWE

El siguiente MWE se basa en un ejemplo de la forestdocumentación. Se supone que el dotestilo (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/ fillto nonedibuja/rellena el camino sin color.

¿A qué se debe este curioso efecto? ¿Tiene esto algo que ver con el hecho de que dotse 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

ingrese la descripción de la imagen aquí

Respuesta1

draw=nonefunciona bien en tikz+, como lo hace en el dotestilo:

\begin{forest}
  [abc, dot={draw=none, fill=red}
  ]
\end{forest}

punto rojo, sin empate

Sin embargo, tikzno 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 dotestilo se ejecuta con fillsu 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 dotnuevamente a un nodo en particular, dotse 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 dotsea efectivo, cambie la definición a usar tikzen lugar de tikz+. Sin embargo, el uso dedot sobrescribirá cualquierotrousos de // tikzpara 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++tikzdot 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}

¡Solo un punto por nodo!

información relacionada