Durch die Verwendung eines neuen Befehls werden die Seitenzahlen zurückgesetzt

Durch die Verwendung eines neuen Befehls werden die Seitenzahlen zurückgesetzt

Ich habe in der Präambel einen Befehl definiert, der es erlaubt, etwas n-mal zu wiederholen

\def\myrepeat#1#2{\count0=#1 \loop \ifnum\count0>0 \advance\count0 by -1 #2\repeat}

daher ist \myrepeat{3}{foo} dasselbe wie die Eingabe von foofoofoo.

Jedes Mal, wenn ich den Befehl \myrepeat im Textkörper verwende, wird die Seitennummerierung auf 0 zurückgesetzt. Warum passiert das und gibt es eine einfache Möglichkeit, das zu beheben?

Hier ist ein Beispiel, das das Problem veranschaulicht:

\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}

Danke schön.

Antwort1

Der Zähler \count0speichert die aktuelle Seitenzahl. Daher ist es keine gute Idee, ihn zur temporären Speicherung zu verwenden. Dies wäre möglich, indem der Code in eine Gruppe eingeschlossen wird. Dies ist jedoch nicht zu empfehlen, wenn etwas ausgedruckt werden soll, da das Drucken eines Absatzes den Seitenersteller zu unerwarteten Zeitpunkten auslösen und der Seite so die falsche Nummer zuweisen kann.

LaTeX stellt zwei Zähler für die temporäre Speicherung bereit, \@tempcntaund \@tempcntb; man kann auch verwenden \count@, was dasselbe ist wie \count255.

Es gibt bessere Möglichkeiten, mehrere Kopien einer Tokenliste auszudrucken. Die einfachste Möglichkeit sind LaTeX3-Funktionen:

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\irepeat}{ m m }
{
 \prg_replicate:nn { #1 } { #2 }
}
\ExplSyntaxOff

\begin{document}

\irepeat{3}{foo}

\end{document}

Bildbeschreibung hier eingeben

Mit \numexprStandard-LaTeX-Techniken könnte es

\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}

Mit einer Schleife

\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}

verwandte Informationen