我正在尝试制作一个“for 循环”,它将迭代变量达到 1。但是,我在互联网上找到的所有“for 循环”都不起作用。
这些文件将分发给其他人,因此如果我们只坚持使用默认软件包,将会有所帮助。在这种情况下,我使用的是软件包ifthen
。
\newcommand{\displayauthors}[1]
{
\newcounter{blargh}
\setcounter{blargh}{#1}
\ifthenelse{#1 = 0}{
}{
\the\value{blargh}
\displayauthors{\value{blargh}}
}
此命令没有错误。但是,当我运行
\displayauthors{2}
LaTeX 抱怨
Command \c@blargh already defined.
是什么原因造成的?如何解决?
答案1
以下解决方案不需要任何包或任何计数器,速度更快,解决尾部递归,可扩展,并处理尾随/最后一个逗号(,)。
\documentclass{article}
\def\displayauthors#1{%
\ifnum#1>0 #1\ifnum\numexpr#1-1>0, \fi
\expandafter\displayauthors\expandafter{\number\numexpr#1-1\expandafter}%
\fi
}
\begin{document}
\displayauthors{10}
\edef\x{\displayauthors{10}}\x
\end{document}
答案2
移动
\newcounter{blargh}
移出宏主体并将其放在定义之前。您不想在每次使用时分配一个新寄存器,每个循环都应使用在开始时分配一次的相同寄存器。
你还需要减少计数器和%
行尾的一些
\documentclass{article}
\usepackage{ifthen}
\newcounter{blargh}
\newcommand{\displayauthors}[1]
{%
\setcounter{blargh}{#1}%
\ifthenelse{#1 = 0}{%
}{%
\theblargh, %
\addtocounter{blargh}{-1}%
\displayauthors{\value{blargh}}%
}}
\begin{document}
\displayauthors{10}
\end{document}
答案3
您提到使用 for 循环没有找到任何成功方法。这里有一个选项:
\documentclass{article}
\usepackage{multido}% http://ctan.org/pkg/multido
\newcommand{\displaynums}[1]{%
\ifnum#1<0\else\multido{\i=#1+-1}{#1}{\i\ }\unskip\fi}
\begin{document}
4: \displaynums{4}\par
12: \displaynums{12}\par
1: \displaynums{1}\par
0: \displaynums{0}\par
-7: \displaynums{-7}
\end{document}
multido
为变量提供迭代/顺序接口:
\multido{<var>=<start>+<increment>}{<times>}{<stuff>}