Eu tentei usar a solução dada emesta postagempara atuar nos nós de uma forest
árvore, mas a solução não funciona com nomes automáticos dados por forest
aos nós: veja o MN(ot)WE abaixo.
Existe uma maneira de corrigir isso ? Se não, o que faz as coisas darem errado? Um 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}
Responder1
Comandos como \aftercolorof{red}{!1}
não funcionam porque !1
énãoo nome automático dado ao nó pela floresta. Esses nomes têm a forma node@N
, com N
o aumento na ordem em que a floresta analisa a representação de colchetes do nó. Na segunda árvore, \aftercolorof{red}{node@3}
a cor é A
vermelha.
!1
é umnome do nó relativo: uma instrução de como chegar a algum nó a partir de outro nó. Por exemplo, em OP's \aftercolorof{red}{!1}
, começamos no nó raiz (todo o código TikZ seguindo a especificação da árvore é anexado ao nó raiz; e não há nome de nó na frente de !
) e depois passamos para seu primeiro filho A
,.
Portanto, para fazer o código do OP funcionar conforme planejado, precisamos criar \aftercolorof
e \changetxt
aceitar nomes de nós relativos. Isso é mais fácil de fazer redefinindo \labeltextof
, conforme mostrado abaixo, mas esteja avisado: o código contém o comando interno da floresta \forest@nameandgo
. Este comando altera o nó atual da floresta, para que o nome (ou qualquer outra opção) possa ser acessado via \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 a posição dos nós de segundo nível usando o texto original ( B
e C
), portanto, "alterar" o texto do nó \changetxt
pode resultar em uma árvore abaixo do ideal.