パラメータに応じてノードのコンテンツをフォーマットする

パラメータに応じてノードのコンテンツをフォーマットする

変更できるようにしたいコンテンツ自作のパラメータリストから実際のテキストまで、ノードの。

たとえば、次のようなツリーを作成したいと思います。

\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}

関連情報