etoolbox для цикла по диапазону

etoolbox для цикла по диапазону

Есть ли способ запустить команду для диапазона последовательных целых чисел (например, 11, 12, 13, 14, 15), указав только первое и последнее числа (11 и 15)? По сути, я ищу общий эквивалент LaTeX для tikz's \foreach \x in {11,…,15}.

В MWE ниже (используя etoolbox), \forcsvlist\mycommand{11,12,13,14,15}правильно работает \mycommandна каждом из четырех входов и \myrange{11}{15}действительно расширяется до 11,12,13,14,15. Но объединение их \forcsvlist\mycommand{\myrange{11}{15}}не работает. Я думаю, что это сводится к порядку расширения, что выше моего понимания.

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

Я посмотрел наЦикл многофакторной проверки с использованием etoolbox,Распечатать все элементы рабочего массива, созданного с помощью пакета etoolbox, иУдалить лишние фигурные скобки, но не мог понять, как их применить в этой ситуации.

решение1

В этом случае так же легко организовать цикл без какого-либо конкретного кода пакета. введите описание изображения здесь

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

решение2

При желании можно указать шаг; \int_step_function:nnnNмакрос принимает в качестве аргумента начальную точку, шаг, конечную точку и, наконец, макрос с одним параметром, которому в качестве аргумента передается текущее значение.

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

введите описание изображения здесь

решение3

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

Теперь я перенял эту абстракцию из другого авторитетного ответа. Для повседневного использования вы также можете использовать

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

и замените #1на ##1if внутри определения макроса.

введите описание изображения здесь

Связанный контент