
Das folgende MWE basiert auf einem Beispiel in der forest
Dokumentation. Der dot
Stil (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
/ fill
to den Pfad ohne Farbe zeichnen/füllen.none
Was verursacht diesen merkwürdigen Effekt? Hat das etwas damit zu tun, dass dot
mit 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
Antwort1
draw=none
funktioniert gut in tikz+
, ebenso wie im dot
Stil:
\begin{forest}
[abc, dot={draw=none, fill=red}
]
\end{forest}
Allerdings tikz
ist 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) dot
mit dem Argument ausgeführt fill
und die folgenden Befehle werden zur späteren Verwendung zur Liste hinzugefügt:
\draw [fill] (.child anchor) circle [radius=1.5pt];
Wenn Sie dann dot
erneut auf einen bestimmten Knoten anwenden, dot
wird 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 dot
effektiv zu sein, ändern Sie die Definition in „verwenden“ tikz
statt „ tikz+
. Allerdings ist die Verwendung vondot
überschreibt dann jedoch alleandereVerwendung von tikz
/ tikz+
/ +tikz
fü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}