如何确保文档总页数是四的倍数?

如何确保文档总页数是四的倍数?

我正在制作一份文档(书籍类),最终将使用胶版印刷制作。因此,通过在末尾添加尽可能多的空白页来确保总页数是四的倍数很有用。

这个答案如果需要,可以添加一页以使总数均匀。我不知道如何调整它以处理四的倍数。有办法吗?

答案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}

相关内容