숲 - 자동 이름을 사용하여 생성 후 노드의 색상을 변경합니다.

숲 - 자동 이름을 사용하여 생성 후 노드의 색상을 변경합니다.

나는에 제공된 솔루션을 사용하려고 시도했습니다.이 게시물트리 의 노드에 대해 작업을 수행 forest하지만 노드에 지정된 자동 이름으로는 솔루션이 작동하지 않습니다 forest. 아래 MN(ot)WE를 참조하세요.

이 문제를 해결할 수 있는 방법이 있나요? 그렇지 않다면 무엇이 일을 잘못하게 만드는가? 캣코드 문제인가요?

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

답변1

다음 과 같은 명령은 \aftercolorof{red}{!1}작동하지 않습니다 .!1~ 아니다포리스트가 노드에 부여한 자동 이름입니다. 해당 이름은 형식이며 포리스트의 순서가 증가함에 node@N따라 N노드의 대괄호 표현을 구문 분석합니다. 두 번째 트리에서는 \aftercolorof{red}{node@3}색상이 A빨간색입니다.

!1상대 노드 이름: 다른 노드에서 시작하여 일부 노드에 도달하는 방법에 대한 지침입니다. 예를 들어 OP의 에서는 \aftercolorof{red}{!1}루트 노드(트리 사양을 따르는 모든 TikZ 코드는 루트 노드에 연결되며 앞에 노드 이름이 없음 !)에서 시작한 다음 첫 번째 자식인 으로 이동합니다 A.

따라서 OP의 코드가 의도한 대로 작동하도록 하려면 상대 노드 이름을 만들고 수락 \aftercolorof해야 합니다 . 아래와 같이 \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

BPS Forest는 원본 텍스트( 및 ) 를 사용하여 두 번째 수준 노드의 위치를 ​​계산하므로 C노드 텍스트를 "변경"하면 \changetxt차선책 트리가 생성될 수 있습니다.

관련 정보