Formatear el contenido de los nodos según los parámetros.

Formatear el contenido de los nodos según los parámetros.

Me gustaría poder cambiar elcontenidode los nodos, desde una lista de parámetros hecha en casa hasta un texto real.

Por ejemplo, me gustaría crear árboles como:

\documentclass{standalone}
\usepackage{forest}

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

ingrese la descripción de la imagen aquí

tendrá el formato de esta manera:

ingrese la descripción de la imagen aquí

Básicamente, dependiendo de la cantidad de parámetros, separados por una semicolumna, me gustaría formatear el contenido final de manera diferente:

  • con 1 parámetro, el formato es "#1 es el indicado"
  • con 2 parámetros, el formato es "con #1[#2]"
  • con 3 parámetros, el formato es "$#2 \geq #1$ para #3 casos"

Hasta ahora, logré dividir el contenido de cada nodo conopción dividida, pero no logré saber cuántos tengo realmente y acceder a cada uno de ellos.

Lo que estoy buscando es 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}
               {}
            }
        }  
    }
}

PD: La razón por la que intento hacer esto de esta manera es porque necesito crear muchos árboles grandes con el mismo formato de nodo. Y desde la perspectiva del escritor, es mucho más fácil simplemente elegir los parámetros de cada nodo y mantener el formato separado, especialmente si tiene que cambiarlo más adelante.

Respuesta1

split option(y otras splitclaves) "comprimen" la lista de claves de "instrucción" dada (su #3) y la lista de "parámetros" (en el caso de la opción, el valor dividido de la opción dada como su #1). De este modo, las partes de la opción pueden procesarse mediante claves 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}

Respuesta2

No estoy seguro si split optionfunciona con listas de diferentes dimensiones. (No estoy seguro de que realmente signifique que no lo sé). Sin embargo, puedes dividir el contenido conxstring . (También agregué unparche que elimina espacios espurios; en versiones posteriores de pgf esto ya no será necesario).

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

ingrese la descripción de la imagen aquí

O una versión que también funcione con cuerdas.

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

información relacionada