forest - Ändern Sie die Farbe der Knoten nach ihrer Erstellung, indem Sie ihren automatischen Namen verwenden

forest - Ändern Sie die Farbe der Knoten nach ihrer Erstellung, indem Sie ihren automatischen Namen verwenden

Ich habe versucht, die Lösung zu verwenden, die indieser Beitragum auf Knoten eines forestBaums einzuwirken, aber die Lösung funktioniert nicht mit automatischen Namen, die forestden 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, !1weilnichtder automatische Name, der dem Knoten von forest zugewiesen wird. Diese Namen haben die Form node@N, wobei Nforest in der Reihenfolge aufsteigend die Klammerdarstellung des Knotens analysiert. Im zweiten Baum ist \aftercolorof{red}{node@3}die Farbe Arot.

!1ist 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 \aftercolorofund 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 ( Bund C), sodass das „Ändern“ des Knotentextes durch \changetxtzu einem nicht optimalen Baum führen kann.

verwandte Informationen