El uso de un nuevo comando restablece los números de página

El uso de un nuevo comando restablece los números de página

Definí un comando en el preámbulo que permite repetir algo n veces

\def\myrepeat#1#2{\count0=#1 \loop \ifnum\count0>0 \advance\count0 by -1 #2\repeat}

entonces \myrepeat{3}{foo} es lo mismo que escribir foofofoo.

Cada vez que uso el comando \myrepeat en el cuerpo, la numeración de páginas se restablece a 0. ¿Por qué sucede esto? ¿Existe una manera fácil de solucionarlo?

Aquí hay un ejemplo que ilustra el 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}

Gracias.

Respuesta1

El contador \count0almacena el número de página actual, por lo que no es una buena idea utilizarlo para almacenamiento temporal; podría ser encerrando el código en un grupo, pero no se recomienda si se va a imprimir algo, porque imprimir un párrafo puede activar el generador de páginas en momentos inesperados y, por lo tanto, darle a la página un número incorrecto.

LaTeX proporciona dos contadores para almacenamiento temporal \@tempcntay \@tempcntb; También se puede utilizar \count@, que es lo mismo que \count255.

Hay mejores formas de imprimir copias repetidas de una lista de tokens. El más simple es con características de LaTeX3:

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\irepeat}{ m m }
{
 \prg_replicate:nn { #1 } { #2 }
}
\ExplSyntaxOff

\begin{document}

\irepeat{3}{foo}

\end{document}

ingrese la descripción de la imagen aquí

Con \numexprtécnicas estándar de LaTeX podría 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}

con un bucle

\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}

información relacionada