Fancyhdr 无法处理长度超过 10 页的文章

Fancyhdr 无法处理长度超过 10 页的文章

我正在article课堂上写一章。请考虑以下 MWE:

\documentclass{article}
\usepackage{lipsum}
\usepackage{lastpage,refcount}
\usepackage[english]{babel}
\usepackage{fancyhdr}
\pagestyle{fancy}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0.4pt}
\fancyhf{}
\fancyfoot[L]{\if\thepage\getpagerefnumber{LastPage}\small\emph{Compiled by:} XYZ
    \else \relax
    \fi}
\fancyfoot[R]{\if\thepage\getpagerefnumber{LastPage}\small Page \thepage~of \getpagerefnumber{LastPage}
    \else \relax
    \fi}
\fancyfoot[C]{\if\thepage\getpagerefnumber{LastPage} \relax
    \else \small Page \thepage~of \getpagerefnumber{LastPage}
    \fi}
\title{Title}
\author{ABC}
\begin{document}
    \begin{titlepage}
        Title
    \end{titlepage}
    \tableofcontents
    \thispagestyle{empty}
    \cleardoublepage
    \setcounter{page}{1}
    \section{Objectives}
%   \lipsum[1-40] %Toggle this and the following length of the document
    \lipsum[1-100]
\end{document}

我的目标:除最后一页外,在所有页面的中心页脚处打印Page # of #(last page)。在最后一页中,左页脚将包含消息Compiled by: XYZ,右页脚将包含Page # of #(last page),而中心页脚将为空白。

只要文档页面长度Contents少于 10 页,它就可以正常工作。但对于较长的文档,第 10 页之后就会出现问题。请帮忙。

答案1

用于\ifnum比较数字:

\documentclass{article}
\usepackage{lipsum}
\usepackage{lastpage,refcount}
\usepackage[english]{babel}
\usepackage{fancyhdr}
\pagestyle{fancy}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0.4pt}
\fancyhf{}
\fancyfoot[L]{\ifnum\value{page}=\getpagerefnumber{LastPage}\small\emph{Compiled by:} XYZ  \fi}
\fancyfoot[R]{\ifnum\value{page}=\getpagerefnumber{LastPage}\small Page \thepage~of \getpagerefnumber{LastPage}\fi}
\fancyfoot[C]{\ifnum\value{page}=\getpagerefnumber{LastPage} \relax
    \else \small Page \thepage~of \getpagerefnumber{LastPage}\fi}
\title{Title}
\author{ABC}
\begin{document}
    \begin{titlepage}
        Title
    \end{titlepage}
    \tableofcontents
    \thispagestyle{empty}
    \cleardoublepage
    \setcounter{page}{1}
    \section{Objectives}
%   \lipsum[1-40] %Toggle this and the following length of the document
    \lipsum[1-100]
\end{document}

答案2

尽管对此有一个可接受的答案,但还有几件事毫无价值。

(La)TeX 中的条件语句

\ifXXX由于TeX 中的命令非常丰富,这很容易让人产生困惑。

该命令\if通常不是我们想要的。它将扩展其后的内容,直到得到两个不可扩展的标记。因此\if\thepage\getpagerefnumber{LastPage}...\fi将首先扩展\thepage,这将扩展为页码的数字。如果它是一位数字,它将扩展,\getpagerefnumber{LastPage}然后再次扩展为数字。¹但如果它是两位数,那么它将在比较中停止并比较页码的前两位数字,因此\if对于第 11、22、33、...、110-119、220-229 等页,将是正确的。

正如 Ulrike 所说,解决方案是使用\ifnum² \value{page}

我建议你看一下第 20 章TeXbook深入探讨原始层面上可用的不同类型的比较。

但这真的是你想要的吗?

问题是,当前的解决方案不一定是在最后一页上获得不同页眉的正确方法。与其将一些逻辑放入必须在每一页上执行的页面样式中,不如只更改最后一页的页面样式更有意义。请记住,LaTeX 有一个命令可以\thispagestyle更改当前页面的页面样式。它最常用于章节或文章的第一页,但它可以在任何地方使用。一本书在每一页的底部都有页码,除了章节的最后一页。在 LaTeX 中实现这一点只需执行\thispagestyle{empty} \clearpage打开章节的³命令。

类似地,通过执行以下操作

\fancyhf{}
\fancyfoot[C]{\small Page \thepage~of \getpagerefnumber{LastPage}}

\fancypagestyle{lastpage}{%
  \fancyfoot[L]{\small\emph{Compiled by:}}%
  \fancyfoot[R]{\small Page \thepage~of \getpagerefnumber{LastPage}}
}

\AddToHook{enddocument}{\thispagestyle{lastpage}}

您可以在文档的最后一页获得特殊格式。⁴


  1. 虽然值得注意的是,这两种情况下使用的机制略有不同,并且不能保证\thepage会给出阿拉伯数字——例如,如果你打开\pagenumbering{roman}它会给出iii等等,而\getpagerefnumber会尽某种努力确保它总是给出一个数字答案。

  2. 我们可以使用,\thepage只是没有通用的保证\thepage可以扩展为数字(页码可能打印为 i、ii、iii、... 或 1-1、1-2、1-3、... 或任意数量的非数字字符串)。

  3. 或者\cleardoublepage视具体情况而定。

  4. 但有一个限制,对于您的用例来说,这可能是也可能不是问题 — 如果在文档末尾打印任何延迟浮动,则此页面样式将应用于最后一个文本页面,但不适用于后面带有浮动的页面。不过,我怀疑,如果发生这种情况,这实际上可能是您的文档的首选行为。

    针对这种情况的另一种可能的解决方案可能是使用\pagestyle{lastpage}而不是\thispagestyle{lastpage}(这在您切换到空白页的情况下最有意义)。

相关内容