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}
tendrá el formato de esta manera:
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 split
claves) "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 option
funciona 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}
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}