
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 \count0
almacena 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 \@tempcnta
y \@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}
Con \numexpr
té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}