나는에 제공된 솔루션을 사용하려고 시도했습니다.이 게시물트리 의 노드에 대해 작업을 수행 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
B
PS Forest는 원본 텍스트( 및 ) 를 사용하여 두 번째 수준 노드의 위치를 계산하므로 C
노드 텍스트를 "변경"하면 \changetxt
차선책 트리가 생성될 수 있습니다.