私は、この郵便受けツリーのノードに作用します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@N
、N
forest がノードの括弧表現を解析する順に増加します。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
B
PS Forest は、元のテキスト (および)を使用して第 2 レベルのノードの位置を計算するためC
、ノード テキストを「変更」すると、\changetxt
最適ではないツリーが生成される場合があります。