Contagem de páginas alternada ao tentar garantir que os números das páginas sejam múltiplos de quatro

Contagem de páginas alternada ao tentar garantir que os números das páginas sejam múltiplos de quatro

Gostaria de garantir que minha contagem de páginas seja um múltiplo de quatro. Se não for um múltiplo de quatro, gostaria de adicionar \newpage\begin{center}\textbf{BLANK PAGE}\end{center}até chegar à contagem de páginas que é um múltiplo de quatro. Estou tentando usar primitivamente a solução expl3 documentada emesta respostacom o seguinte 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}

Quando eu o compilo pela primeira vez com qualquer mecanismo, ele produz uma saída de uma página, ou seja, uma única página que diz "Teste". Quando compilo pela segunda vez, ele produz uma saída de quatro páginas, que é a saída desejada.

Mas quando continuo compilando pela terceira vez, sem remover o arquivo .aux, o número da página retorna para 1.

Isso ocorre porque, durante a primeira compilação, o LaTeX grava o seguinte no arquivo .aux:

\relax 
\newlabel{LastPage}{{}{1}}
\xdef\lastpage@lastpage{1}
\gdef\lastpage@lastpageHy{}
\gdef \@abspage@last{1}

Portanto, na segunda compilação, \getpagerefnumber{LastPage}vê "1" e \ensurefouradiciona 3 páginas para perfazer um total de 4 páginas. Mas então ele vê que quatro páginas foram produzidas e grava no arquivo aux:

\relax 
\newlabel{LastPage}{{}{4}}
\xdef\lastpage@lastpage{4}
\gdef\lastpage@lastpageHy{}
\gdef \@abspage@last{4}

O que faz com que a terceira compilação pense que já existem quatro páginas, então nenhuma página adicional é adicionada, deixando-nos com apenas uma página... e assim por diante.

Pergunta: Existe uma maneira de fazer os números das páginas convergirem para 4, sem alternar entre 1 e 4?

Responder1

Infelizmente, o pacote lastpagemudou a forma como gerencia o rótulo e agora usa o hook afterlastpage.

Você pode emitir \clearpagee usar o valor atual 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}

Remover o comentário dos \newpagecomandos mostrará o resultado correto.

Responder2

Você não precisa rotular até a última página. A \ensureformacro pode ser executada \vfill\breakprimeiro (ou \vfill\superejectse você tiver pontos flutuantes no documento). Então a última página real é finalizada e você tem certeza de que \pagenoé igual a n+1 onde n é o número de páginas reais. Você pode adicionar páginas bancárias desejadas usando o \pagenoregistro.

Outro avanço desta solução é que você não precisa esperar a segunda execução do TeX para obter o número correto de páginas.

Posso mostrar como fazer isso no OpTeX. Uma solução LaTeX pode 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

Responder3

Uma solução rápida e suja seria rotular LastPage (ou equivalente)antes \ensurefourproduz páginas extras. Por exemplo:

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

Responder4

Produzo documentos impressos com número de páginas múltiplo de quatro e onde desejo colocar algum conteúdo específico na última ou nas duas últimas páginas. Aqui estão os comandos que escrevi para esse propósito.

Eu obtenho o número de páginas físicas atuais \ReadonlyShipoutCounter(número de páginas completas já criadas, adicione uma para levar em conta a atual)

\newcommand{\theabsolutepage}{\inteval{\ReadonlyShipoutCounter+1}}

Eu defino um comando \blankpageque permite definir o estilo da página ( \blankpage[plain]se você quiser o plainestilo da página para as páginas em branco)

\NewDocumentCommand{\blankpage}{ O{empty} }
% #1: page style for the blank page
{
  \clearpage{}\thispagestyle{#1}\null\clearpage{}
}

e um comando \clearpagestoendpara obter o número desejado de páginas em branco

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

\clearpagestoend[2][plain]

gere o número de páginas em branco para obter um número de páginas múltiplo de quatro menos 2 páginas com o plainestilo de página.

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

informação relacionada