尝试确保页码是四的倍数时交替进行页数计数

尝试确保页码是四的倍数时交替进行页数计数

我想确保我的页数是四的倍数。如果不是四的倍数,我想添加,\newpage\begin{center}\textbf{BLANK PAGE}\end{center}直到页数达到四的倍数。我最初尝试使用记录在这个答案具有以下 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}

当我第一次使用任何引擎编译它时,它都会生成一页输出,即显示“测试”的单个页面。当我第二次编译它时,它会产生四页输出,这是所需的输出。

但是当我第三次继续编译它时,不删除.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 页。但随后它看到生成了 4 页,因此它写入辅助文件:

\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如果文档中有浮点数)。然后最后一页实际页面完成,并且您确定\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}

相关内容