Формирование содержимого узлов в зависимости от параметров

Формирование содержимого узлов в зависимости от параметров

Я хотел бы иметь возможность изменитьсодержаниеузлов, от самодельного списка параметров до реального текста.

Например, я хотел бы создать такие деревья:

\documentclass{standalone}
\usepackage{forest}

\begin{document}
\begin{forest}
[9;12;4
    [31;21]
    [3
        [14]
        [7;21;3]
    ]
]
\end{forest}
\end{document}

введите описание изображения здесь

будет отформатирован следующим образом:

введите описание изображения здесь

По сути, в зависимости от количества параметров, разделенных точкой с запятой, я бы хотел по-разному форматировать конечный контент:

  • с 1 параметром, формат "#1 - это тот самый"
  • с 2 параметрами, формат "с #1[#2]"
  • с 3 параметрами, формат "$#2 \geq #1$ для #3 случаев"

Пока что мне удалось разделить содержимое каждого узла с помощьювариант разделения, но мне не удалось узнать, сколько их на самом деле, и получить доступ к каждому из них.

Я ищу что-то вроде:

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ключи) "сжимают" заданный список ключей "instruction" (их #3) и список "parameter" (в случае опции, разделенное значение опции, заданное как их #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}

Связанный контент