我在序言中定义了一个命令,允许某件事重复 n 次
\def\myrepeat#1#2{\count0=#1 \loop \ifnum\count0>0 \advance\count0 by -1 #2\repeat}
因此 \myrepeat{3}{foo} 与输入 foofoofoo 相同。
每次我在正文中使用 \myrepeat 命令时,页码都会重置为 0。为什么会发生这种情况?有没有简单的方法可以解决这个问题?
以下示例可以说明该问题:
\documentclass[]{article}
\def\irepeat#1#2{\count0=#1 \loop \ifnum\count0>0 \advance\count0 by -1 #2\repeat}
\begin{document}
The page number here is 1.
\newpage
\irepeat{3}{foo}
The page number here is 0.
\newpage
And 1 again.
\end{document}
谢谢。
答案1
计数器\count0
存储当前页码,因此将其用作临时存储并不是一个好主意;也可以将代码放在一个组中,但如果要打印某些内容则不建议这样做,因为打印段落可能会在意外的时间触发页面构建器,从而给页面错误的号码。
LaTeX 提供了两个用于临时存储的计数器,\@tempcnta
和\@tempcntb
;也可以使用\count@
,其作用与 相同\count255
。
有更好的方法来打印标记列表的重复副本。最简单的方法是使用 LaTeX3 功能:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\irepeat}{ m m }
{
\prg_replicate:nn { #1 } { #2 }
}
\ExplSyntaxOff
\begin{document}
\irepeat{3}{foo}
\end{document}
使用\numexpr
标准 LaTeX 技术可以
\documentclass{article}
\makeatletter
\newcommand{\irepeat}[2]{%
\ifnum#1>\z@
#2%
\expandafter\@firstofone
\else
\expandafter\@gobble
\fi
{\expandafter\irepeat\expandafter{\number\numexpr#1-1\relax}{#2}}%
}
\makeatother
\begin{document}
\irepeat{3}{foo}
\end{document}
使用循环
\documentclass{article}
\makeatletter
\newcommand\irepeat[2]{%
\@tempcnta=#1\relax % or \@tempcntb or \count@
\loop\ifnum\@tempcnta>\z@
\advance\@tempcnta by \m@ne
#2%
\repeat
}
\makeatother
\begin{document}
\irepeat{3}{foo}
\end{document}