
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 \count0
speichert 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, \@tempcnta
und \@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}
Mit \numexpr
Standard-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}