Formatando o conteúdo dos nós dependendo dos parâmetros

Formatando o conteúdo dos nós dependendo dos parâmetros

Eu gostaria de poder mudar ocontentedos nós, desde uma lista de parâmetros caseira até um texto real.

Por exemplo, eu gostaria de criar árvores como:

\documentclass{standalone}
\usepackage{forest}

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

insira a descrição da imagem aqui

será formatado desta forma:

insira a descrição da imagem aqui

Basicamente, dependendo da quantidade de parâmetros, separados por semicoluna, gostaria de formatar o conteúdo final de forma diferente:

  • com 1 parâmetro, o formato é "#1 é aquele"
  • com 2 parâmetros, o formato é "com #1[#2]"
  • com 3 parâmetros, o formato é "$#2 \geq #1$ para #3 casos"

Até agora, consegui dividir o conteúdo de cada nó comopção de divisão, mas não consegui saber quantos realmente tenho e acessar cada um deles.

O que estou procurando é algo como:

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: A razão pela qual estou tentando fazer isso é porque preciso criar muitas árvores grandes com o mesmo formato de nó. E do ponto de vista do escritor, é muito mais fácil apenas escolher os parâmetros de cada nó e manter a formatação separada, especialmente se você precisar alterá-la posteriormente.

Responder1

split option(e outras splitchaves) "zip" a lista de chaves de "instruções" fornecida (their #3) e a lista de "parâmetros" (no caso da opção, o valor de divisão da opção fornecido como their #1). As partes da opção podem assim ser processadas por chaves diferentes.

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

Responder2

Não tenho certeza se split optionfunciona com listas de dimensões diferentes. (Não tenho certeza se realmente significa que não sei.) No entanto, você pode dividir o conteúdo com xstring. (Eu também adicionei umpatch que remove espaços espúrios; em versões posteriores do pgf isso não será mais necessário.)

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

insira a descrição da imagem aqui

Ou uma versão que também funciona com strings.

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

informação relacionada