使用新命令重置页码

使用新命令重置页码

我在序言中定义了一个命令,允许某件事重复 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}

相关内容