MWE

MWE

Das folgende MWE basiert auf einem Beispiel in der forestDokumentation. Der dotStil (zwischen %%%Zeichen markiert) soll ein Argument annehmen, das Stile (hauptsächlich Farben) für die Punkte im Baum angibt. Während es für benannte Farben funktioniert, dot={draw=none}hat die Einstellung keine Auswirkung. Normalerweise soll die Einstellung draw/ fillto den Pfad ohne Farbe zeichnen/füllen.none

Was verursacht diesen merkwürdigen Effekt? Hat das etwas damit zu tun, dass dotmit definiert ist \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}

Ausgabe

Bildbeschreibung hier eingeben

Antwort1

draw=nonefunktioniert gut in tikz+, ebenso wie im dotStil:

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

roter Punkt, kein Unentschieden

Allerdings tikzist nicht dasselbe wie tikz+. tikz+ist kumulativ. Wenn Sie also sagen

for descendants={%
  dot={fill},
},

Anschließend wird der Stil für alle Nachkommen des aktuellen Knotens (hier: Wurzel) dotmit dem Argument ausgeführt fillund die folgenden Befehle werden zur späteren Verwendung zur Liste hinzugefügt:

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

Wenn Sie dann doterneut auf einen bestimmten Knoten anwenden, dotwird erneut mit dem entsprechenden Argument ausgeführt. Zum Beispiel:

dot={draw=none, fill=red}

fügt dies der Liste der später zu verwendenden TikZ-Befehle hinzu:

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

Was nun für diesen Knoten passiert, ist, dass diese beiden Befehle nacheinander verwendet werden, wenn der Baum gezeichnet wurde:

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

Der erste zeichnet und füllt den Kreis in Schwarz. Der zweite fügt einen weiteren Kreis hinzu, der nicht gezeichnet, aber rot gefüllt ist, an genau derselben Stelle. Was Sie also in der Ausgabe sehen, istzweiKreise, einer über dem anderen.

Wenn Sie nur diezuletztUm doteffektiv zu sein, ändern Sie die Definition in „verwenden“ tikzstatt „ tikz+. Allerdings ist die Verwendung vondot überschreibt dann jedoch alleandereVerwendung von tikz/ tikz+/ +tikzfür den Knoten. Wenn dies kein Problem ist, ist die Lösung also sehr einfach. Wenn es ein Problem ist, müssen Sie etwas mehr Kunststückchen machen, damit es wie gewünscht funktioniert oder sicherstellen, dass alle Aufrufe vondot erfolgenVorAlle anderen Ergänzungen werden zur Liste der TikZ-Befehle vorgenommen.

Hier ist der geänderte Code für den einfachen Fall, der eine Richtlinie von höchstens einem Punkt pro Knoten erzwingt:

\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}

nur ein Punkt pro Knoten!

verwandte Informationen