对于一本书,一家印度出版商希望我在每个绝对页码 17 开始的每 16 个绝对页上添加他们所谓的“格式编号”(不确定标准术语是什么,如果有的话)和书名缩写,无论页面样式如何(例如,即使在空白页上有\thispagestyle{empty}
)。不用说,这些都是正面页,书的章节可以从这些页开始(因此页面可以没有页眉或页脚,因为我的章节的前几页有\thispagestyle{empty}
)。这就是我想要实现的。
- PDF 第 1 页:页脚左侧不打印任何内容
- PDF 第 17 页:“2 KKS”打印在页脚左侧
- PDF 第 33 页:“3 KKS”打印在页脚左侧
- PDF 第 49 页:“4 KKS”打印在页脚左侧
- 以此类推,每 16 页
在所有其他页面上,页脚的左侧将为空。
我发现我需要使用\usepackage{zref-user,zref-abspage}
和\arabic{abspage}
获取绝对页码(从零开始)。
我还发现我\intcalcMod
需要计算模除法,如指出的那样这里
所以现在我需要两样东西
- 检查
\arabic{abspage}
mod 16 是否为 0(因为\arabic{abspage}
以 0 开头而不是 1)。这应该是这样的\ifthenelse{\equal{\intcalcMod{\value{abspage}}{16}}{0}}
。如果是,那么我会\intcalcDiv{\value{abspage}}{16}
在页脚左侧打印和缩写。 - 这需要覆盖
\thispagestyle{empty}
对于章节开始的页面有效的内容。
我如何实现上述(1)和(2)?
对于(1),以下内容有效,但给出绝对页码(这不是我想要的)
\fancyfoot[L]{
\ifthenelse{\equal{\intcalcMod{\value{abspage}}{16}}{0}}{\arabic{abspage} KKS}{}
}
我尝试使用以下方法进行整数除法,但失败了
\fancyfoot[L]{
\ifthenelse{\equal{\intcalcMod{\value{abspage}}{16}}{0}}{\arabic{\intcalcDiv{\value{abspage}}{16}} KKS}{}
}
对于 (2),我大概可以重新定义pagestyle{empty}
以包含 (1) 中的解决方案。
答案1
可能类似于下面的代码。代码计算abspage
和 16的模数\fpeval{}
。提供了必需的数学函数。leftfooter{}
是一个辅助宏,根据页面的不同,它显示注释(由参数提供)或不显示任何内容。然后宏被输入到\fancyfoot[L]{}
\documentclass[12pt]{article}
\usepackage{zref-user,zref-abspage}
\usepackage{xfp} % Required only before 2022-06-01 latex release
\usepackage{fancyhdr}
\fancyhf{}
\fancyfoot[C]{\thepage}
\fancyfoot[L]{\leftfooter{Comment something here}}
\renewcommand{\headrulewidth}{0pt}
\pagestyle{fancy}
\usepackage{blindtext}
\NewDocumentCommand\leftfooter{m}{%
\ifnum\theabspage>15
\ifnum\numexpr\fpeval{floor(\theabspage/16)=(\theabspage/16) ? 1 : -1}=1%
#1\fi\fi}
\begin{document}
\Blinddocument
\Blinddocument
\end{document}
答案2
我建议采取这样的方法:
\documentclass{article}
\usepackage{blindtext}
\usepackage{zref-abspage}
\usepackage{fancyhdr}
\pagestyle{fancy}
\lfoot{\signaturemark}
\makeatletter
\newcommand\signaturemark{%
\makebox[0pt][l]{%
\ifnum
\numexpr((\zref@getcurrent{abspage}/16)*16 -1)\relax=
\numexpr(\zref@getcurrent{abspage}-1)\relax
\tiny\the\numexpr ((\zref@getcurrent{abspage}/16)+1)\relax ~KKS%
\fi
}%
}
\makeatother
\begin{document}
\Blinddocument
\Blinddocument
\Blinddocument
\end{document}
答案3
我定义了一个\specialfooter
命令来检查是否abspage
为正数(如文档中所述,zref
该计数器从 0 开始);在这种情况下,该命令检查是否abspage
是 16 的倍数,并且在这种情况下,它打印 16 加 1 的商。
fancyhdr
根据您的喜好修复参数。
\documentclass[12pt]{book}
\usepackage[a6paper,heightrounded]{geometry} % just for more pages with less text
\usepackage{zref-user,zref-abspage}
\usepackage{fancyhdr}
\usepackage{kantlipsum} % for mock text
\fancyhf{}
\fancyfoot[C]{\thepage}
\fancyfoot[L]{\specialfooter}
\renewcommand{\headrulewidth}{0pt}
% in case a chapter page is special
\fancypagestyle{plain}{%
\fancyhf{}%
\fancyfoot[C]{\thepage}%
\fancyfoot[L]{\specialfooter}%
\renewcommand{\headrulewidth}{0pt}%
}
% for safety also the page style empty is redefined
\fancypagestyle{empty}{%
\fancyhf{}%
\fancyfoot[L]{\specialfooter}%
\renewcommand{\headrulewidth}{0pt}%
}
\pagestyle{fancy}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\specialfooter}{}
{
\int_compare:nT { \value{abspage} > 0 }
{
\int_compare:nT { \int_mod:nn { \value{abspage} } { 16 } = 0 }
{
\int_eval:n { \int_div_truncate:nn { \value{abspage} } { 16 } + 1 }~KKS
}
}
}
\ExplSyntaxOff
\begin{document}
\sloppy % just for the example
%\frontmatter
%\tableofcontents
\mainmatter
\chapter{First}
\kant[1-26]
\chapter{Second}
\kant[1-22]
\end{document}
您可以检查在章节开始的第 33 页上是否也存在特殊页脚(因为\fancypagesyle{plain}
)。
如果取消注释该\frontmatter\tableofcontents
部分,您会看到目录占用了两页,因此特殊页脚将位于第 15 页、第 31 页等等。