我想确保我的页数是四的倍数。如果不是四的倍数,我想添加,\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}