
Estoy creando comandos dinámicamente y me gustaría definirlos en función del valor actual en una lista de iteraciones. El problema es que el valor actual aparece como el último valor de la variable iterada.
Aquí hay un MWE. Este ejemplo obviamente no tiene sentido, pero se me ocurre una aplicación que recuerda el último valor del bucle. He probado muchas variaciones de \expandafter
, \edef
y no puedo resolverlo. He estado leyendo sobre expansión. Me gustaría definir alguna variable intermedia y enviarla a los comandos que genero para que muestre "1:1, 2:2".
\documentclass[11pt,a4paper]{article}
\usepackage{etoolbox}
\begin{document}%
\noindent%
\newcounter{n}%
\setcounter{n}{0}%
\renewcommand{\do}[1]{%
\let\Num#1%
\setcounter{n}{#1}%
\expandafter\newcommand\csname C\alph{n}\endcsname{\textbf{#1}: \Num}% create a command
}%
\docsvlist{1,2,3,4}%
\Ca\\
\Cb\\
\end{document}
EDITAR:
Aquí hay un ejemplo más ilustrativo. Me gustaría definir un comando que muestre el número actual y el número anterior en el bucle, pero el número anterior siempre es el último en la lista.
\documentclass[11pt,a4paper]{article}
\usepackage{etoolbox}
\usepackage{xintexpr}
\begin{document}%
\noindent%
\newcounter{n}%
\setcounter{n}{0}%
\renewcommand{\do}[1]{%
\edef\evenodd{\xintthe\xintiexpr\value{n}/:2\relax}% get the column num
\ifnum\evenodd=0%
\let\PrevNum#1%
\fi
\ifnum\evenodd=1%
\expandafter\newcommand\csname C\alph{n}\endcsname{prev: \PrevNum, current: #1}% create a command
\fi
\setcounter{n}{#1}%
}%
\docsvlist{1,2,3,4,5,6}%
\Ca\\
\Cc\\
\Ce\\
\end{document}
Respuesta1
No está realmente claro cuál es el objetivo final. Sin embargo, \let
no es la herramienta adecuada y deberías utilizarla \def
. Además, debe acceder a la expansión de \PrevNum
, en lugar de a la secuencia de control.
\documentclass[11pt,a4paper]{article}
\usepackage{etoolbox}
\usepackage{xintexpr}
\newcounter{n}
%\setcounter{n}{0}%
\renewcommand{\do}[1]{%
\edef\evenodd{\xintthe\xintiexpr\value{n}/:2\relax}% get the column num
\ifnum\evenodd=0
\def\PrevNum{#1}%
\fi
\ifnum\evenodd=1
\definetablecommand{C\alph{n}}{#1}{\PrevNum}%
\fi
\setcounter{n}{#1}%
}
\newcommand{\definetablecommand}[3]{%
\expandafter\definetablecommandaux\expandafter{#3}{#1}{#2}%
}
\newcommand{\definetablecommandaux}[3]{%
\expandafter\newcommand\csname #2\endcsname{prev: #1, current #3}%
}
\docsvlist{1,2,3,4,5,6}
\begin{document}
\Ca
\Cc
\Ce
\end{document}
Tenga en cuenta que %
después de las constantes es incorrecto y podría generar resultados inesperados.
Hacer esas cosas en el interior document
también es discutible.
Con un estilo de programación diferente.
\documentclass[11pt,a4paper]{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\definetablecommands}{m}
{
\ilikethevegetable_dtc_main:n { #1 }
}
\seq_new:N \l__ilikethevegetables_dtc_data_seq
\tl_new:N \l__ilikethevegetables_dtc_item_tl
\cs_new_protected:Nn \ilikethevegetable_dtc_main:n
{
\seq_set_from_clist:Nn \l__ilikethevegetables_dtc_data_seq { #1 }
\seq_map_indexed_inline:Nn \l__ilikethevegetables_dtc_data_seq
{% ##1 is the current item index, ##2 is the current item
\int_if_odd:nTF { ##1 }
{% remember the item
\tl_set:Nn \l__ilikethevegetables_dtc_item_tl { ##2 }
}
{% define the control sequence
\cs_new:cpx { C \int_to_alph:n { ##1 - 1 } }
{
\exp_not:n { prev:~} \exp_not:V \l__ilikethevegetables_dtc_item_tl ,~
\exp_not:n { current:~ ##2 }
}
}
}
}
\ExplSyntaxOff
\definetablecommands{1,2,3,4,5,6}
\begin{document}
\Ca
\Cc
\Ce
\end{document}