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