Ich habe versucht, die Lösung zu verwenden, die indieser Beitragum auf Knoten eines forest
Baums einzuwirken, aber die Lösung funktioniert nicht mit automatischen Namen, die forest
den Knoten zugewiesen werden: siehe MN(ot)WE unten.
Gibt es eine Möglichkeit, dies zu beheben? Wenn nicht, was führt dann dazu, dass es schief läuft? Ein Catcode-Problem?
\documentclass{article}
\usepackage{tikz}
\usepackage{forest}
\makeatletter
\protected\def\tikz@fig@main#1{%
\expandafter\gdef\csname labeltextof@\tikz@fig@name\endcsname{#1}%
\iftikz@node@is@pic%
\tikz@node@is@picfalse%
\tikz@subpicture@handle{#1}%
\else%
\tikz@@fig@main#1\egroup%
\fi}
\makeatother
\newcommand\labeltextof[1]{\csname labeltextof@#1\endcsname}
\newcommand{\aftercolorof}[2]{% #1 is the color, #2 us the node
\path (#2.center) node[#1] {\labeltextof{#2}};
}
\newcommand{\changetxt}[2]{% #1 the node, #2 the text
\path (#1.center) node[white, fill=white] {\labeltextof{#1}};
\path (#1.center) node[black] {#2};
}
\begin{document}
\section{OK}
\begin{forest}
[
[$A$, name = nA
[$B$, name = nB]
[$C$, name = nC]
]
[$D$, name = nD]
]
\aftercolorof{red}{nA}
\aftercolorof{blue}{nD}
\changetxt{nB}{...}
\changetxt{nC}{?}
\end{forest}
\section{KO}
\begin{forest}
[
[$A$
[$B$]
[$C$]
]
[$D$]
]
\aftercolorof{red}{!1}
\aftercolorof{blue}{!2}
\changetxt{!11}{...}
\changetxt{!12}{?}
\end{forest}
\end{document}
Antwort1
Befehle wie \aftercolorof{red}{!1}
funktionieren nicht, !1
weilnichtder automatische Name, der dem Knoten von forest zugewiesen wird. Diese Namen haben die Form node@N
, wobei N
forest in der Reihenfolge aufsteigend die Klammerdarstellung des Knotens analysiert. Im zweiten Baum ist \aftercolorof{red}{node@3}
die Farbe A
rot.
!1
ist einrelativer Knotenname: eine Anweisung, wie man einen Knoten von einem anderen Knoten aus erreicht. In OPs \aftercolorof{red}{!1}
beginnen wir beispielsweise beim Stammknoten (der gesamte TikZ-Code, der der Baumspezifikation folgt, ist an den Stammknoten angehängt; und vor steht kein Knotenname !
) und bewegen uns dann zu seinem ersten untergeordneten Knoten, A
.
Damit der Code des OP wie vorgesehen funktioniert, müssen wir relative Knotennamen erstellen \aftercolorof
und akzeptieren. Dies geht am einfachsten durch Neudefinition von , wie unten gezeigt, aber Vorsicht: Der Code enthält den internen Befehl von forest . Dieser Befehl ändert den aktuellen Knoten von forest, sodass der Name (oder jede andere Option) dann über abgerufen werden kann .\changetxt
\labeltextof
\forest@nameandgo
\forest(e)option
\makeatletter
\newcommand\labeltextof[1]{%
\begingroup
\forest@nameandgo{#1}%
\edef\tempnodename{\foresteoption{name}}%
\expandafter\endgroup
\csname labeltextof@\tempnodename\endcsname
}
\makeatother
PS Forest berechnet die Position der Knoten der zweiten Ebene unter Verwendung des Originaltextes ( B
und C
), sodass das „Ändern“ des Knotentextes durch \changetxt
zu einem nicht optimalen Baum führen kann.