![Recuento de páginas alternas al intentar garantizar que los números de página sean múltiplos de cuatro](https://rvso.com/image/476229/Recuento%20de%20p%C3%A1ginas%20alternas%20al%20intentar%20garantizar%20que%20los%20n%C3%BAmeros%20de%20p%C3%A1gina%20sean%20m%C3%BAltiplos%20de%20cuatro.png)
Me gustaría asegurarme de que el número de páginas sea múltiplo de cuatro. Si no es un múltiplo de cuatro, me gustaría agregar \newpage\begin{center}\textbf{BLANK PAGE}\end{center}
hasta llegar al número de páginas que sea múltiplo de cuatro. Estoy intentando primitivamente utilizar la solución expl3 documentada enesta respuestacon el siguiente MWE:
\documentclass{article}
\usepackage{refcount, lastpage}
\newcommand{\blankpage}{\newpage\begin{center}\textbf{BLANK PAGE}\end{center}}
\ExplSyntaxOn
\NewDocumentCommand{\ensurefour} { }
{
\prg_replicate:nn
{ \int_mod:nn { 4 - \int_mod:nn { \getpagerefnumber{LastPage} } { 4 } } { 4 } }
{ \blankpage }
}
\ExplSyntaxOff
\begin{document}
Test\newpage
\ensurefour
\end{document}
Cuando lo compilo por primera vez con cualquier motor, produce un resultado de una página, es decir, una sola página que dice "Prueba". Cuando lo compilo por segunda vez, produce un resultado de cuatro páginas, que es el resultado deseado.
Pero cuando continúo compilándolo por tercera vez, sin eliminar el archivo .aux, el número de página vuelve a 1.
Esto se debe a que, durante la primera compilación, LaTeX escribe lo siguiente en el archivo .aux:
\relax
\newlabel{LastPage}{{}{1}}
\xdef\lastpage@lastpage{1}
\gdef\lastpage@lastpageHy{}
\gdef \@abspage@last{1}
Por lo tanto, en la segunda compilación, \getpagerefnumber{LastPage}
ve "1", y \ensurefour
procede a agregar 3 páginas para hacer 4 páginas en total. Pero luego ve que se han generado cuatro páginas, por lo que escribe en el archivo auxiliar:
\relax
\newlabel{LastPage}{{}{4}}
\xdef\lastpage@lastpage{4}
\gdef\lastpage@lastpageHy{}
\gdef \@abspage@last{4}
Lo que hace que la tercera compilación piense que ya son cuatro páginas, por lo que no se añaden más páginas, dejándonos solo una página... y así sucesivamente.
Pregunta: ¿Hay alguna manera de hacer que los números de página converjan a 4, sin alternar entre 1 y 4?
Respuesta1
Desafortunadamente, el paquete lastpage
cambió la forma en que administra la etiqueta y ahora usa el gancho afterlastpage
.
Puede emitir \clearpage
y utilizar el valor actual de page
.
\documentclass{article}
\newcommand{\blankpage}{\begin{center}\textbf{BLANK PAGE}\end{center}\clearpage}
\ExplSyntaxOn
\NewDocumentCommand{\ensurefour} { }
{
\clearpage
\prg_replicate:nn
{ \int_mod:nn { 4 - \int_mod:nn { \value{page}-1 } { 4 } } { 4 } }
{ \blankpage }
}
\ExplSyntaxOff
\AtEndDocument{\ensurefour}
\begin{document}
Test
%\newpage
test
%\newpage
test
%\newpage
test
\end{document}
Descomentar los \newpage
comandos mostrará el resultado correcto.
Respuesta2
No es necesario etiquetar hasta la última página. La \ensurefor
macro puede ejecutarse \vfill\break
primero (o \vfill\supereject
si tiene elementos flotantes en el documento). Luego, la última página real estará terminada y estará seguro de que \pageno
es igual a n+1, donde n es el número de páginas reales. Puede agregar las páginas bancarias que desee utilizando el \pageno
registro.
Otro avance de esta solución es que no es necesario esperar hasta la segunda ejecución de TeX para obtener el número correcto de páginas.
Puedo mostrarte cómo hacer esto en OpTeX. Una solución LaTeX puede ser analógica.
\newcount\restpages
\def\ensurefour{\vfill\break
\restpages = \expr[0]{ 4 - (\the\pageno-1)\%4 }\relax
\ifnum\restpages=4 \restpages=0 \fi
\fornum 1..\restpages \do{\null\vfill\break}
}
Test:
\lipsum[1-10]
\ensurefour
\bye
Respuesta3
Una solución rápida y sucia sería etiquetar LastPage (o su equivalente)antes \ensurefour
produce páginas adicionales. Por ejemplo:
\documentclass{article}
\usepackage{refcount}
\newcommand{\blankpage}{\newpage\begin{center}\textbf{BLANK PAGE}\end{center}}
\ExplSyntaxOn
\NewDocumentCommand{\ensurefour} { }
{
\label{LastPageBeforeEnsureFour}
\prg_replicate:nn
{ \int_mod:nn { 4 - \int_mod:nn { \getpagerefnumber{LastPageBeforeEnsureFour} } { 4 } } { 4 } }
{ \blankpage }
}
\ExplSyntaxOff
\begin{document}
Test
\ensurefour
\end{document}
Respuesta4
Produzco documentos impresos con un número de páginas múltiplo de cuatro y donde quiero poner algún contenido específico en la última o dos últimas páginas. Aquí están los comandos que escribí para este propósito.
Obtengo el número de páginas físicas actuales mediante \ReadonlyShipoutCounter
(número de páginas completas ya creadas, agregue una para tener en cuenta la actual)
\newcommand{\theabsolutepage}{\inteval{\ReadonlyShipoutCounter+1}}
Defino un comando \blankpage
que permite configurar el estilo de página ( \blankpage[plain]
si desea el plain
estilo de página para las páginas en blanco)
\NewDocumentCommand{\blankpage}{ O{empty} }
% #1: page style for the blank page
{
\clearpage{}\thispagestyle{#1}\null\clearpage{}
}
y un comando \clearpagestoend
para obtener el número deseado de páginas en blanco
\NewDocumentCommand{\clearpagestoend}{ O{0} O{empty} }
% #1: number of reserved pages at end
% #2: page style for blank pages
{
\clearpage{\pagestyle{#2}}
\count255=\theabsolutepage \advance \count255 by #1 \advance \count255 by -1
\count254=\count255
\divide \count254 by 4 \multiply \count254 by 4
\advance \count255 by -\count254
\ifcase\count255 % pages nb % 4 == 0: do nothing
\relax
\or % pages nb % 4 == 1: skip 3 pages
\blankpage[#2] \blankpage[#2] \blankpage[#2]
\or % pages nb % 4 == 2: skip 2 pages
\blankpage[#2] \blankpage[#2]
\or % pages nb % 4 == 3: skip 1 page
\blankpage{\pagestyle{#2}}
\fi
}
Por ejemplo
\clearpagestoend[2][plain]
genere el número de páginas en blanco para obtener un número de páginas múltiplo de cuatro menos 2 páginas con el plain
estilo de página.
Ejemplo completo:
\documentclass{article}
\usepackage{lipsum}
\newcommand{\theabsolutepage}{\inteval{\ReadonlyShipoutCounter+1}}
\NewDocumentCommand{\blankpage}{ O{empty} }
% #1: page style for the blank page
{
\clearpage{}\thispagestyle{#1}\null\clearpage{}
}
\NewDocumentCommand{\clearpagestoend}{ O{0} O{empty} }
% #1: number of reserved pages at end
% #2: page style for blank pages
{
\clearpage{\pagestyle{#2}}
\count255=\theabsolutepage \advance \count255 by #1 \advance \count255 by -1
\count254=\count255
\divide \count254 by 4 \multiply \count254 by 4
\advance \count255 by -\count254
\ifcase\count255 % pages nb % 4 == 0: do nothing
\relax
\or % pages nb % 4 == 1: skip 3 pages
\blankpage[#2] \blankpage[#2] \blankpage[#2]
\or % pages nb % 4 == 2: skip 2 pages
\blankpage[#2] \blankpage[#2]
\or % pages nb % 4 == 3: skip 1 page
\blankpage{\pagestyle{#2}}
\fi
}
\begin{document}
\lipsum
\clearpagestoend
\end{document}