森林 - 使用自动名称在创建节点后更改节点的颜色

森林 - 使用自动名称在创建节点后更改节点的颜色

我曾尝试使用给出的解决方案这个帖子对树的节点进行操作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

BPS Forest 使用原始文本(和)计算第二级节点的位置C,因此“更改”节点文本\changetxt可能会导致次优树。

相关内容