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 forest
los 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 !1
esnoel nombre automático dado al nodo por el bosque. Esos nombres tienen la forma node@N
, y N
aumentan en el orden en que el bosque analiza la representación entre corchetes del nodo. En el segundo árbol, \aftercolorof{red}{node@3}
colores A
rojo.
!1
es 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 \aftercolorof
y \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 ( B
y C
), por lo que "cambiar" el texto del nodo \changetxt
podría dar como resultado un árbol subóptimo.