floresta - Altere a cor dos nós após sua criação usando seu nome automático

floresta - Altere a cor dos nós após sua criação usando seu nome automático

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 forestaos 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 No aumento na ordem em que a floresta analisa a representação de colchetes do nó. Na segunda árvore, \aftercolorof{red}{node@3}a cor é Avermelha.

!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 \aftercolorofe \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 ( Be C), portanto, "alterar" o texto do nó \changetxtpode resultar em uma árvore abaixo do ideal.

informação relacionada