Recuento de páginas alternas al intentar garantizar que los números de página sean múltiplos de cuatro

Recuento de páginas alternas al intentar garantizar que los números de página sean múltiplos de cuatro

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 \ensurefourprocede 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 lastpagecambió la forma en que administra la etiqueta y ahora usa el gancho afterlastpage.

Puede emitir \clearpagey 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 \newpagecomandos mostrará el resultado correcto.

Respuesta2

No es necesario etiquetar hasta la última página. La \ensureformacro puede ejecutarse \vfill\breakprimero (o \vfill\superejectsi tiene elementos flotantes en el documento). Luego, la última página real estará terminada y estará seguro de que \pagenoes igual a n+1, donde n es el número de páginas reales. Puede agregar las páginas bancarias que desee utilizando el \pagenoregistro.

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 \ensurefourproduce 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 \blankpageque permite configurar el estilo de página ( \blankpage[plain]si desea el plainestilo 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 \clearpagestoendpara 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 plainestilo 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}

información relacionada