我嘗試使用中給出的解決方案這個帖子作用於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
可能會導致生成次優樹。