¿Hay alguna manera de ejecutar un comando en un rango de números enteros consecutivos (por ejemplo, 11, 12, 13, 14, 15), especificando solo el primer y el último número (11 y 15)? Básicamente estoy buscando el equivalente general de LaTeX de tikz
's \foreach \x in {11,…,15}
.
En el MWE siguiente (usando etoolbox
), \forcsvlist\mycommand{11,12,13,14,15}
se ejecuta correctamente \mycommand
en cada una de las cuatro entradas y, \myrange{11}{15}
de hecho, se expande a 11,12,13,14,15
. Pero juntarlos \forcsvlist\mycommand{\myrange{11}{15}}
no funciona. Creo que todo se reduce al orden de expansión, que está muy por encima de mi cabeza.
\documentclass{article}
\usepackage{amsmath, etoolbox}
\newcommand\mycommand[1]{\boxed{#1} }
\newcounter{mycounter}
\newcommand\myrange[2]{
\defcounter{mycounter}{#1}
\themycounter%
\whileboolexpr
{test {\ifnumless{\themycounter}{#2}}}
{\stepcounter{mycounter},\themycounter}
}
\begin{document}
\forcsvlist\mycommand{11,12,13,14,15}
does not equal
\forcsvlist\mycommand{\myrange{11}{15}}
\end{document}
he miradoBucle de contingencia múltiple usando etoolbox,Imprima todos los elementos de una matriz de trabajo creada con el paquete etoolbox, yQuitar llaves adicionales, pero no pude descubrir cómo aplicarlos a esta situación.
Respuesta1
En este caso, es igual de fácil realizar un bucle sin ningún código de paquete específico.
\documentclass{article}
\usepackage{amsmath}
\newcommand\mycommand[1]{\boxed{#1} }
\makeatletter
\newcommand\zz[3]{%
#1{#2}%
\ifnum#2=\numexpr#3\relax\expandafter\@gobblefour\fi
\zz#1{\the\numexpr#2+1\relax}{#3}%
}
\makeatother
\begin{document}
\zz\mycommand{11}{15}
\end{document}
Respuesta2
Opcionalmente, se proporciona también el paso; la \int_step_function:nnnN
macro toma como argumento el punto inicial, el paso, el punto final y finalmente la macro de parámetro a la que se pasa el valor actual como argumento.
\documentclass{article}
\usepackage{xparse}
\newcommand\mycommand[1]{\fbox{#1} }
\ExplSyntaxOn
\NewDocumentCommand{\forrange}{mO{1}mm}
{
\int_step_function:nnnN { #1 } { #2 } { #3 } #4
}
\ExplSyntaxOff
\begin{document}
\forrange{11}{15}{\mycommand}
\forrange{11}[4]{27}{\mycommand}
\forrange{15}[-1]{11}{\mycommand}
\end{document}
Respuesta3
\documentclass{article}
\usepackage{xinttools}
\newcommand\mycommand[1]{\fbox{#1} }
\newcommand\forrange[4][1]%
{\xintFor*##1in{\xintSeq[#1]{#2}{#3}}\do{#4{##1}}}
\begin{document}
\forrange{11}{15}{\mycommand}
\forrange[4]{11}{27}{\mycommand}
\forrange[-1]{15}{11}{\mycommand}
\end{document}
Ahora tomé esa abstracción de otra respuesta autorizada. Para uso diario también puedes utilizar
\xintFor #1 in {99, 37, -53, 'zouzou'}\do{ whatever }
y reemplazar #1
por ##1
if dentro de una definición de macro.