我曾尝试使用给出的解决方案这个帖子对树的节点进行操作forest
,但解决方案不适用于forest
节点给出的自动名称:请参阅下面的 MN(ot)WE。
有办法解决这个问题吗?如果没有,是什么原因导致错误?catcode 问题?
\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 的内部命令\forest@nameandgo
。此命令会更改 forest 的当前节点,因此可以通过 访问名称(或任何其他选项)\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
可能会导致次优树。