![Fancyhdr 无法处理长度超过 10 页的文章](https://linux22.com/image/439898/Fancyhdr%20%E6%97%A0%E6%B3%95%E5%A4%84%E7%90%86%E9%95%BF%E5%BA%A6%E8%B6%85%E8%BF%87%2010%20%E9%A1%B5%E7%9A%84%E6%96%87%E7%AB%A0.png)
我正在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}}
您可以在文档的最后一页获得特殊格式。⁴
虽然值得注意的是,这两种情况下使用的机制略有不同,并且不能保证
\thepage
会给出阿拉伯数字——例如,如果你打开\pagenumbering{roman}
它会给出i
,ii
等等,而\getpagerefnumber
会尽某种努力确保它总是给出一个数字答案。我们可以使用,
\thepage
只是没有通用的保证\thepage
可以扩展为数字(页码可能打印为 i、ii、iii、... 或 1-1、1-2、1-3、... 或任意数量的非数字字符串)。或者
\cleardoublepage
视具体情况而定。但有一个限制,对于您的用例来说,这可能是也可能不是问题 — 如果在文档末尾打印任何延迟浮动,则此页面样式将应用于最后一个文本页面,但不适用于后面带有浮动的页面。不过,我怀疑,如果发生这种情况,这实际上可能是您的文档的首选行为。
针对这种情况的另一种可能的解决方案可能是使用
\pagestyle{lastpage}
而不是\thispagestyle{lastpage}
(这在您切换到空白页的情况下最有意义)。