MWE

MWE

O MWE a seguir é baseado em um exemplo da forestdocumentação. O dotestilo (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/ fillto nonedeve desenhar/preencher o caminho sem cor.

O que causa esse efeito curioso? Isso tem algo a ver com o fato de dotser 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

insira a descrição da imagem aqui

Responder1

draw=nonefunciona bem em tikz+, assim como no dotestilo:

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

ponto vermelho, sem empate

No entanto, tikznã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 dotestilo é executado fillcomo argumento e os seguintes comandos são adicionados à lista para serem usados ​​posteriormente:

\draw [fill] (.child anchor) circle [radius=1.5pt];

Se você aplicar dotnovamente a um nó específico, dotserá 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 dotpara ser eficaz, altere a definição para use tikzem vez de tikz+. No entanto, o uso de dotsubstituirá qualqueroutrousos de tikz/ tikz+/ +tikzpara 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 dotocorramantesquaisquer 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}

apenas um ponto por nó!

informação relacionada