每 16 个绝对页面的自定义页脚文本

每 16 个绝对页面的自定义页脚文本

对于一本书,一家印度出版商希望我在每个绝对页码 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需要计算模除法,如指出的那样这里

所以现在我需要两样东西

  1. 检查\arabic{abspage}mod 16 是否为 0(因为\arabic{abspage}以 0 开头而不是 1)。这应该是这样的\ifthenelse{\equal{\intcalcMod{\value{abspage}}{16}}{0}}。如果是,那么我会\intcalcDiv{\value{abspage}}{16}在页脚左侧打印和缩写。
  2. 这需要覆盖\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 页等等。

相关内容