etoolbox para bucle sobre rango

etoolbox para bucle sobre rango

¿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 \mycommanden 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. ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

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 #1por ##1if dentro de una definición de macro.

ingrese la descripción de la imagen aquí

información relacionada