O uso do novo comando redefine os números das páginas

O uso do novo comando redefine os números das páginas

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 \count0armazena 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 \@tempcntae \@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}

insira a descrição da imagem aqui

Com \numexprté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}

informação relacionada