bosque: cambia el color de los nodos después de su creación usando su nombre automático

bosque: cambia el color de los nodos después de su creación usando su nombre automático

He intentado utilizar la solución dada enesta publicaciónactuar sobre los nodos de un forestárbol, pero la solución no funciona con nombres automáticos dados por forestlos nodos: consulte el MN(ot)WE a continuación.

¿Hay alguna manera de solucionar esto? Si no, ¿qué hace que las cosas vayan mal? ¿Un problema de código de gato?

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

Respuesta1

Comandos como \aftercolorof{red}{!1}no funcionan porque !1esnoel nombre automático dado al nodo por el bosque. Esos nombres tienen la forma node@N, y Naumentan en el orden en que el bosque analiza la representación entre corchetes del nodo. En el segundo árbol, \aftercolorof{red}{node@3}colores Arojo.

!1es unnombre de nodo relativo: una instrucción de cómo llegar a algún nodo comenzando desde otro nodo. Por ejemplo, en OP \aftercolorof{red}{!1}, comenzamos en el nodo raíz (todo el código TikZ que sigue a la especificación del árbol se adjunta al nodo raíz; y no hay ningún nombre de nodo delante !) y luego pasamos a su primer hijo, A.

Entonces, para que el código de OP funcione según lo previsto, debemos crear \aftercolorofy \changetxt aceptar nombres de nodos relativos. Esto es más fácil de hacer redefiniendo \labeltextof, como se muestra a continuación, pero tenga cuidado: el código contiene el comando interno del bosque \forest@nameandgo. Este comando cambia el nodo actual del bosque, por lo que se puede acceder al nombre (o cualquier otra opción) a través de \forest(e)option.

\makeatletter
\newcommand\labeltextof[1]{%
  \begingroup
  \forest@nameandgo{#1}%
  \edef\tempnodename{\foresteoption{name}}%
  \expandafter\endgroup
  \csname labeltextof@\tempnodename\endcsname
}
\makeatother

PS Forest calcula la posición de los nodos de segundo nivel utilizando el texto original ( By C), por lo que "cambiar" el texto del nodo \changetxtpodría dar como resultado un árbol subóptimo.

información relacionada