我正在制作一份文档(书籍类),最终将使用胶版印刷制作。因此,通过在末尾添加尽可能多的空白页来确保总页数是四的倍数很有用。
这个答案如果需要,可以添加一页以使总数均匀。我不知道如何调整它以处理四的倍数。有办法吗?
答案1
\numexpr
因此在这种情况下它们并不是那么好:
\documentclass{article}
\usepackage{refcount,lastpage}
\usepackage{kantlipsum}
\makeatletter
\newcommand{\checkmultipleoffour}{%
\count@=\getpagerefnumber{LastPage}%
\@tempcnta=\count@
\divide\@tempcnta by 4
\multiply\@tempcnta by 4
\count@=\numexpr\count@-\@tempcnta\relax
\ifnum\count@>0
\pagestyle{empty}
\loop\ifnum\count@<4
\null\clearpage
\advance\count@\@ne
\repeat
\fi
}
\makeatother
\AtEndDocument{\checkmultipleoffour}
\begin{document}
\kant[1-11] % for a 4 page document
% \kant[1-15] % for a 5 page document
\end{document}
语法上相同expl3
:
\documentclass{article}
\usepackage{xparse}
\usepackage{refcount,lastpage}
\usepackage{kantlipsum}
\ExplSyntaxOn
\NewDocumentCommand{\checkmultipleoffour} { }
{
\prg_replicate:nn
{ \int_mod:nn { 4 - \int_mod:nn { \getpagerefnumber{LastPage} } { 4 } } { 4 } }
{ \thispagestyle{empty}\null\clearpage }
}
\ExplSyntaxOff
\AtEndDocument{\checkmultipleoffour}
\begin{document}
\kant[1-11] % for a 4 page document
% \kant[1-15] % for a 5 page document
\end{document}
而情况\frontmatter
则\mainmatter
稍微复杂一些。
\documentclass{book}
\usepackage{xparse}
\usepackage{refcount,lastpage,etoolbox}
\usepackage{kantlipsum}
\makeatletter
\patchcmd\mainmatter{\cleardoublepage}
{%
\clearpage\edef\@currentlabel{\number\numexpr\arabic{page}\ifodd\arabic{page}+1\fi\relax}%
\label{LastFrontmatterPage}%
\cleardoublepage
}{}{}
\makeatother
\ExplSyntaxOn
\cs_new:Npn \egreg_int_coremainder:nn #1 #2
{
\int_mod:nn { #2 - \int_mod:nn { #1 } { #2 } } { #2 }
}
\NewDocumentCommand{\checkmultipleoffour} { O{0} }
{
\prg_replicate:nn
{
\egreg_int_coremainder:nn { #1 + \getrefnumber{LastFrontmatterPage} + \getpagerefnumber{LastPage} } { 4 }
}
{ \thispagestyle{empty}\null\clearpage }
}
\ExplSyntaxOff
\AtEndDocument{\checkmultipleoffour}
\begin{document}
\frontmatter
\tableofcontents
\mainmatter
\chapter{A}
\kant[1-11]
\end{document}
还有\checkmultipleoffour
一个可选参数,指定可能的页面前 \frontmatter
(例如,未编号的扉页)。
请注意,可能需要运行几次 LaTeX,因为这些宏需要\label
-\ref
系统来同步。
答案2
我意识到这个目标可能是实现一个 TeX 解决方案,但在文档完成后它真的变得更容易了。
file=UITutorial.pdf; pdftk A=$file B=blank.pdf cat A1-end $(repeat $(( (4-(${$(pdfinfo $file| grep '^Pages:'):s/Pages://:s/ /})%4)%4 )) print -n "B1 ") output ${file:r}_4pgs.pdf
或者如果你喜欢间隔开一点:
file=UITutorial.pdf; \
pdftk A=$file B=blank.pdf \
cat A1-end \
$(repeat $(( (4-(${$(pdfinfo $file| grep '^Pages:'):s/Pages://:s/ /})%4)%4 )) print -n "B1 ")\
output ${file:r}_4pgs.pdf
适用zsh
于 Unix(Linux、MacOSX 等),不知道是否适用于其他 shell。需要是blank.pdf
包含单个空白页的 PDF。
解释:
file=UITutorial.pdf; \
设置我们将使用的文件,以便我们只需引用一次
pdftk A=$file B=blank.pdf \
我们的输入将是给定的文件和空白 PDF。
cat A1-end \
该cat
命令表示“将以下页面连接到我们的输出中”,并且第一组页面都是来自主文件的页面。
$(repeat $(( (4-(${$(pdfinfo $file| grep '^Pages:'):s/Pages://:s/ /})%4)%4 )) print -n "B1 ")\
第二组稍微复杂一些。我们通过命令找出 PDF 有多少页pdfinfo
。然后我们取模 4。我们想要四舍五入到最接近 4 的倍数,所以我们想要取,4 - <this number>
但如果<this number>
已经是 4 的倍数,我们不想添加任何值。所以我们算出(4 - <pages>%4)%4
。然后我们将该次数插入页面规范中B1
。这表示“从源 B(即空白页)获取第 1 页”,我们执行正确的次数。
output ${file:r}_4pgs.pdf
现在我们将输出定向到<filename>_4pgs.pdf
,其中<filename>
是我们最初指定的,但是扩展被去掉了。
答案3
劫持David的代码,尝试
\makeatletter
\def\emptyclearquadpage
{%
\clearpage
\@emptyclearquadpage
}
\def\@emptyclearquadpage
{%
\ifnum\numexpr((\c@page+1)/4-1)*4+1\relax=\c@page
\else
\thispagestyle{empty}%
\hbox{}\newpage\if@twocolumn\hbox{}\newpage\fi
\expandafter
\@emptyclearquadpage
\fi
}
\makeatother
这基本上会产生空白页,以将页面计数器填满为 4 的倍数。根据需要进行调整。
抱歉,numexpr 太笨拙了,整数除法的完全不合理的舍入让我抓狂了......
编辑
感谢 Ulrike 指出这\pagenumbering
会重置页面计数器,因此依赖它是不安全的 ;-)
令人着迷的是,这\cleardoublepage
也仅通过巧合和行为良好的文档类别才能起作用......
尝试
\documentclass{book}
\usepackage{etoolbox}
\makeatletter
\def\emptyclearquadpage
{%
\clearpage
\@emptyclearquadpage
}
\def\@emptyclearquadpage
{%
\@tempcnta=\numexpr\c@page+\totalpages-\@ne\relax
\ifnum\numexpr((\@tempcnta+2)/4-1)*4\relax=\@tempcnta
\else
\thispagestyle{empty}%
\hbox{}\newpage\if@twocolumn\hbox{}\newpage\fi
\expandafter
\@emptyclearquadpage
\fi
}
\newcount\totalpages
\pretocmd{\pagenumbering}
{\global\advance\totalpages\numexpr\c@page-\@ne\relax}{}{}
\makeatother
\begin{document}
\frontmatter
\clearpage foo
\clearpage foo
\mainmatter
\clearpage foo
\clearpage foo
\clearpage foo
\emptyclearquadpage
\end{document}