etoolbox para loop acima do intervalo

etoolbox para loop acima do intervalo

Existe uma maneira de executar um comando em um intervalo de números inteiros consecutivos (digamos, 11, 12, 13, 14, 15), especificando apenas o primeiro e o último número (11 e 15)? Basicamente, estou procurando o equivalente geral em LaTeX de tikz's \foreach \x in {11,…,15}.

No MWE abaixo (usando etoolbox), \forcsvlist\mycommand{11,12,13,14,15}é executado corretamente \mycommandem cada uma das quatro entradas e, \myrange{11}{15}de fato, se expande para 11,12,13,14,15. Mas colocá-los juntos \forcsvlist\mycommand{\myrange{11}{15}}não funciona. Acho que tudo se resume à ordem de expansão, que está muito além da minha cabeça.

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

eu olheiLoop Multi-Contingência usando etoolbox,Imprima todos os elementos de um array funcional criado com o pacote etoolbox, eRemova chaves extras, mas não consegui descobrir como aplicá-los a esta situação.

Responder1

É igualmente fácil fazer um loop sem nenhum código de pacote específico neste caso. insira a descrição da imagem aqui

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

Responder2

Fornecendo opcionalmente também a etapa; a \int_step_function:nnnNmacro toma como argumento o ponto inicial, o passo, o ponto final e finalmente a macro de um parâmetro para o qual o valor atual é passado 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}

insira a descrição da imagem aqui

Responder3

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

Agora peguei essa abstração de outra resposta confiável. Para uso diário você também pode usar

\xintFor #1 in {99, 37, -53, 'zouzou'}\do{ whatever }

e substitua #1por ##1if dentro de uma definição de macro.

insira a descrição da imagem aqui

informação relacionada