変更できるようにしたいコンテンツ自作のパラメータリストから実際のテキストまで、ノードの。
たとえば、次のようなツリーを作成したいと思います。
\documentclass{standalone}
\usepackage{forest}
\begin{document}
\begin{forest}
[9;12;4
[31;21]
[3
[14]
[7;21;3]
]
]
\end{forest}
\end{document}
次のようにフォーマットされます:
基本的に、セミコロンで区切られたパラメータの数に応じて、最終的なコンテンツを異なる形式でフォーマットしたいと思います。
- パラメータが 1 つの場合、形式は「#1 が 1 つ」です。
- パラメータが 2 つの場合、形式は "with #1[#2]" です。
- 3 つのパラメータの場合、形式は "$#2 \geq #1$ for #3 cases" です。
これまでのところ、各ノードのコンテンツを次のように分割することができました。分割オプションしかし、実際にいくつ持っているかを把握できず、それぞれにアクセスできませんでした。
私が探しているのは次のようなものです:
before typesetting nodes={
for tree={
split option={content}{;}{params},
if {length(params) = 1}{content=params[1] is the one}{
if {length(params) = 2}{content=with params[1][params[2]]}{
if {length(params} = 3}{content=$params[2] \geq params[1]$ for params[3] cases}
{}
}
}
}
}
PS: 私がこのような方法でやろうとしているのは、同じノード フォーマットで多数の大きなツリーを作成する必要があるためです。また、ライターの観点からは、各ノードのパラメーターを選択してフォーマットを分離しておく方がはるかに簡単です。特に後で変更する必要がある場合はそうです。
答え1
split option
(およびその他のsplit
キー) は、指定された「命令」キーリスト (それらの#3
) と「パラメータ」リスト (オプションの場合は、それらの として指定されたオプションの分割値#1
) を「圧縮」します。オプションの各部分は、異なるキーで処理できます。
\documentclass{standalone}
\usepackage{forest}
\forestset{
declare toks register=param1,
declare toks register=param2,
declare toks register=param3,
gobble/.style={},
my split/.style={
param1={},
param2={},
param3={},
split option={content}{;}{param1,param2,param3,gobble},
if param2={}{
content'/.process=Rw1{param1}{##1 is the one}
}{
if param3={}{
content'/.process=R2w2{param1}{param2}{with ##1[##2]}
}{
content'/.process=R3w3{param1}{param2}{param3}{$##2 \geq ##1$ for ##3 cases}
}
}
}
}
\begin{document}
\begin{forest} delay={for tree=my split}
[9;12;4
[31;21]
[3
[14]
[7;21;3]
]
]
\end{forest}
\end{document}
答え2
が異なる次元のリストで機能するかどうかはわかりませんsplit option
。(わからないというのは、本当にわからないという意味です。)ただし、 でコンテンツを分割することはできますxstring
。(私は も追加しました。不要なスペースを削除するパッチ; pgf の以降のバージョンではこれは必要ありません。
\documentclass{standalone}
\usepackage{forest}
\usepackage{xstring}
\makeatletter
% remove the stray space https://tex.stackexchange.com/a/513549
\patchcmd{\pgfutilsolvetwotwoleqfloat}
{ \noexpand\pgfmathfloatdivide@}
{\noexpand\pgfmathfloatdivide@}
{}{}
\makeatother
\begin{document}
\begin{forest}
before typesetting nodes={
for tree={
content/.wrap value={\StrCount{#1}{;}[\mydim]%
\StrSubstitute{#1}{;}{,}[\mytemp]%
\ifcase\mydim
\pgfmathsetmacro{\myone}{{\mytemp}[0]}\myone\ is the one
\or
\pgfmathsetmacro{\myone}{{\mytemp}[0]}%
\pgfmathsetmacro{\mytwo}{{\mytemp}[1]}%
{with \myone[\mytwo]}
\or
\pgfmathsetmacro{\myone}{{\mytemp}[0]}%
\pgfmathsetmacro{\mytwo}{{\mytemp}[1]}%
\pgfmathsetmacro{\mythree}{{\mytemp}[2]}%
{$\mytwo\geq\myone$ for \mythree\ cases}
\fi}}}
[9;12;4
[31;21]
[3
[14]
[7;21;3]
]
]
\end{forest}
\end{document}
または、文字列でも機能するバージョンもあります。
\documentclass{standalone}
\usepackage{forest}
\usepackage{xstring}
\makeatletter
% remove the stray space https://tex.stackexchange.com/a/513549
\patchcmd{\pgfutilsolvetwotwoleqfloat}
{ \noexpand\pgfmathfloatdivide@}
{\noexpand\pgfmathfloatdivide@}
{}{}
\makeatother
\def\pfttwo#1;#2|{\def\myone{#1}\def\mytwo{#2}}%
\def\pftthree#1;#2;#3|{\def\myone{#1}\def\mytwo{#2}\def\mythree{#3}}%
\begin{document}
\begin{forest}
before typesetting nodes={
for tree={
content/.wrap value={\StrCount{#1}{;}[\mydim]%
\ifcase\mydim
\pgfmathsetmacro{\myone}{#1}\myone\ is the one
\or
\pfttwo#1|%
{with \myone[\mytwo]}
\or
\pftthree#1|%
{$\mytwo\geq\myone$ for \mythree\ cases}
\fi}}}
[9;12;4
[31;21]
[3
[14]
[7;21;3]
]
]
\end{forest}
\end{document}