etoolbox for 迴圈超出範圍

etoolbox for 迴圈超出範圍

有沒有辦法對一系列連續整數(例如 11、12、13、14、15)運行命令,僅指定第一個和最後一個數字(11 和 15)?基本上我正在尋找tikzs的一般 LaTeX 等效項\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##1巨集定義內的 if 取代。

在此輸入影像描述

相關內容