forest - 自動名を使用してノードを作成後にノードの色を変更します

forest - 自動名を使用してノードを作成後にノードの色を変更します

私は、この郵便受けツリーのノードに作用します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ないforest によってノードに自動的に付けられた名前。これらの名前は の形式でありnode@NNforest がノードの括弧表現を解析する順に増加します。2 番目のツリーでは、\aftercolorof{red}{node@3}色がA赤になります。

!1相対ノード名: 別のノードから開始して、あるノードに到達する方法の指示。たとえば、OP の では\aftercolorof{red}{!1}、ルート ノードから開始し (ツリー仕様に続くすべての TikZ コードはルート ノードにアタッチされ、 の前にノード名はありません!)、その最初の子である に移動しますA

したがって、OP のコードを意図したとおりに動作させるには、 相対ノード名を作成し\aftercolorofて受け入れる必要があります。これは、以下に示すように を再定義することで最も簡単に実行できますが、コードには forest の内部コマンド が含まれていることに注意してください。このコマンドは forest の現在のノードを変更するため、名前 (またはその他のオプション) には を介し​​てアクセスできるようになります。\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 は、元のテキスト (および)を使用して第 2 レベルのノードの位置を計算するためC、ノード テキストを「変更」すると、\changetxt最適ではないツリーが生成される場合があります。

関連情報