Я хотел бы убедиться, что количество моих страниц кратно четырем. Если оно не кратно четырем, я хотел бы добавлять, \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}