Чередование количества страниц при попытке обеспечить, чтобы номера страниц были кратны четырем

Чередование количества страниц при попытке обеспечить, чтобы номера страниц были кратны четырем

Я хотел бы убедиться, что количество моих страниц кратно четырем. Если оно не кратно четырем, я хотел бы добавлять, \newpage\begin{center}\textbf{BLANK PAGE}\end{center}пока не достигну количества страниц, кратного четырем. Я примитивно пытаюсь использовать решение expl3, задокументированное вэтот ответсо следующим МРП:

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

Когда я компилирую его в первый раз с любым движком, он выдает вывод в одну страницу, т. е. одну страницу с надписью "Test". Когда я компилирую его во второй раз, он выдает вывод в четыре страницы, что и является желаемым выводом.

Но когда я продолжаю компилировать его в третий раз, не удаляя файл .aux, номер страницы возвращается к 1.

Это происходит потому, что во время первой компиляции LaTeX записывает в файл .aux следующее:

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

Поэтому во второй компиляции \getpagerefnumber{LastPage}видит "1" и \ensurefourпродолжает добавлять 3 страницы, чтобы получить в общей сложности 4 страницы. Но затем он видит, что создается четыре страницы, поэтому он записывает в файл aux:

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

Из-за чего третья компиляция считает, что уже четыре страницы, поэтому больше страницы не добавляются, и у нас остается только одна страница... и так далее.

Вопрос: Есть ли способ сделать так, чтобы номера страниц сходились к 4, не чередуя 1 и 4?

решение1

К сожалению, пакет lastpageизменил способ управления этикеткой и теперь использует хук afterlastpage.

Вы можете выпустить \clearpageи использовать текущее значение 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}

Раскомментирование \newpageкоманд покажет правильный результат.

решение2

Вам не нужно ставить метку на последнюю страницу. Макрос \ensureforможет быть запущен \vfill\breakпервым (или \vfill\superejectесли у вас есть float в документе). Затем последняя реальная страница завершена, и вы уверены, что она \pagenoравна n+1, где n — количество реальных страниц. Вы можете добавить нужные банковские страницы с помощью регистра \pageno.

Еще одним преимуществом этого решения является то, что вам не нужно ждать второго запуска TeX для получения нужного количества страниц.

Я могу показать вам, как это сделать в OpTeX. Решение LaTeX может быть аналогичным.

\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

решение3

Быстрое и грубое решение — маркировать LastPage (или эквивалент)до \ensurefourпроизводит дополнительные страницы. Например:

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

решение4

Я создаю печатные документы с числом страниц, кратным четырем, и где я хочу разместить определенный контент на последней или двух последних страницах. Вот команды, которые я написал для этой цели.

Я получаю количество текущих физических страниц \ReadonlyShipoutCounter(количество уже созданных полных страниц, добавляю единицу, чтобы учесть текущую)

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

Я определяю команду \blankpage, которая позволяет задать стиль страницы ( \blankpage[plain]если вам нужен plainстиль страницы для пустых страниц)

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

и команда \clearpagestoendдля получения нужного количества пустых страниц

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

Например

\clearpagestoend[2][plain]

сгенерируйте количество пустых страниц, чтобы получить число страниц, кратное четырем минус 2 страницы с использованием plainстиля страницы.

Полный пример:

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

Связанный контент