Использование новой команды сбрасывает номера страниц

Использование новой команды сбрасывает номера страниц

Я определил команду в преамбуле, которая позволяет что-то повторить 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}

Связанный контент