森林 - 在建立節點後使用其自動名稱變更節點的顏色

森林 - 在建立節點後使用其自動名稱變更節點的顏色

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

相關內容