
Defini um comando no preâmbulo que permite que algo seja repetido n vezes
\def\myrepeat#1#2{\count0=#1 \loop \ifnum\count0>0 \advance\count0 by -1 #2\repeat}
então \myrepeat{3}{foo} é o mesmo que digitar foofofoo.
Cada vez que uso o comando \myrepeat no corpo, a numeração da página é redefinida para 0. Por que isso está acontecendo e existe uma maneira fácil de corrigir isso?
Aqui está um exemplo que ilustra o problema:
\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}
Obrigado.
Responder1
O contador \count0
armazena o número da página atual, portanto não é uma boa ideia usá-lo para armazenamento temporário; pode ser colocando o código em um grupo, mas não é recomendado se algo for impresso, porque imprimir um parágrafo pode acionar o construtor de páginas em momentos inesperados e, assim, fornecer o número errado à página.
LaTeX fornece dois contadores para armazenamento temporário \@tempcnta
e \@tempcntb
; também se pode usar \count@
, que é o mesmo que \count255
.
Existem maneiras melhores de imprimir cópias repetidas de uma lista de tokens. O mais simples é com recursos do LaTeX3:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\irepeat}{ m m }
{
\prg_replicate:nn { #1 } { #2 }
}
\ExplSyntaxOff
\begin{document}
\irepeat{3}{foo}
\end{document}
Com \numexpr
técnicas LaTeX padrão, poderia ser
\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}
Com um laço
\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}