如何使用循环简化下面的代码?

如何使用循环简化下面的代码?
\documentclass{article}
\newcommand[3]{\mycounter}{a=#1, b=#2, c=#3}

\begin{document}
\mycounter{1}{2}{3}
\mycounter{4}{5}{6}
Too much… and the last line is
\mycounter{28}{29}{30}
\end{document}

我想用一个命令将这10行简化:\command{1}{30},如果我输入\command{1}{29},那么命令的最后一行将输出为\mycounter{28}{29}{29};如果我输入\command{1}{28},那么命令的最后一行将输出为\mycounter{28}{28}{28}。我该如何实现这个命令?

答案1

您也可以使用\loop在纯 TeX 中定义的循环。您不需要再加载任何 LaTeX 包,并且代码在纯 TeX 中也可以运行。

\newcount\tmpnum
\def\mycounter#1#2#3{a=#1, b=#2, c=#3 \par}
\def\command#1#2{%
   \def\maxnum{#2}\tmpnum=1 
   \loop
      \unless\ifnum\tmpnum>#2 \mycounter{\valnum0}{\valnum1}{\valnum2}
      \advance\tmpnum by3
   \repeat
}
\def\valnum#1{%
   \ifnum\maxnum>\numexpr\tmpnum+#1\relax 
      \the\numexpr\tmpnum+#1\relax \else \maxnum\fi
}

\command{1}{29}

答案2

multido几乎是针对你的问题而设计的:

\documentclass{article}

\newcommand\printnextthree[1]{#1, \the\numexpr#1+1\relax, \the\numexpr#1+2\relax \par}

\usepackage{multido}

\begin{document}

\multido{\i=1+3}{9}{\printnextthree{\i}}

\end{document}

输出:

在此处输入图片描述


但对于你的实际问题,为什么要重新发明轮子?只需使用pdfpages

\documentclass{article}
\usepackage{pdfpages}

\begin{document}

\includepdf[offset=-2in 0in,nup=1x3,pages=-]{testpdf.pdf}

\end{document}

的规范nup=1x3在每页上放置一列 3 张幻灯片,pages=-告诉它包含所有页面,并offset=-2in 0in告诉它将每个包含的幻灯片向左移动 2 英寸(否则它将水平居中)。

针对我的一组旧幻灯片运行时的示例输出:

在此处输入图片描述

相关内容