页眉和页脚:fancyhdr宏包

fancyhdr是自定义页眉和页脚的“神器”。fancyhdr把页眉和页脚划分为6个区域,因此也相应的提供了6个基本的命令:\lhead{}、\chead{}、\rhead{}、\lfoot{}、\cfoot{}、\rfoot{}来设置这6个区域的内容。通常,页眉和页脚通过横线和正文隔开,\headrule{}和\footrule{}分别用来定义横线的样式,\headrulewidth{}、\footrulewidth{}可以用来设置横线的宽度。

模拟plain页面样式

使用fancyhdr模拟LaTeX默认的plain page style,即页眉为空,页脚显示居中的页码,其代码如下:

 

\usepackage{fancyhdr}
\pagestyle{fancy}
\lhead{} \chead{} \rhead{}
\lfoot{} \cfoot{\thepage} \rfoot{}
\renewcommand\headrulewidth{0pt}%隐藏页眉横线
如果页码要显示为“-5-”的样子,只需要定义\cfoot{-\thepage-}即可。

多行的页眉和页脚

默认的页眉和页脚是为一行文本设计的,高度一般为12pt(10号字体时)。如果要在页眉和页脚中使用多行字体,要记得修改页眉、页脚的高度,一般为12pt的倍数,即有几行就设置12pt的几倍,比如下例:

 

\usepackage{fancyhdr}
\pagestyle{fancy}
\setlength\headheight{23pt}
\lhead{From: Frank\\ To: Michel}
\rhead{Page: \thepage\\ \today}
\chead{} \lfoot{} \cfoot{} \rfoot{}
其结果如1
image: http://softlab.sdut.edu.cn/blog/subaochen/wp-content/uploads/sites/4/2017/07/0_home_subaochen_git_blog_imgs_latex_multi-line-header-1.png
图 1: 多行页眉效果

多行页眉的文本对齐

在页眉中使用多行文本时,文本的对齐方式并非总是居左对齐的:\lhead和\lfoot中的文本居左对齐,\chead和\cfoot中的文本居中对齐,而\rhead和\rfoot中的文本居右对齐。如果此种默认设置不满足要求,可以借助于tabular实现任意的文本对齐,比如上例中,可以将rhead重新定义为:

 

\rhead{
\begin{tabular}[b]{l@{}}
Page: \thepage\\
\today
\end{tabular}
}
这里,巧妙的使用tabular环境实现了rhead的左对齐。当然,也可以实现居中对齐。注意到,tabular的选项b保证了表格是 bottom align的,即表格的底部和页眉的基线对齐,否则表格和页眉的其他部分会存在错位现象。另外,@{}帮助“吃掉”在表格一行后面可能的任何空格,使得页眉的rhead部分紧贴页面的右边界。

\fancyhead和\fancyfoot

\lhead、\rhead等命令虽然简单直接,但是无法应对单双页的情形,于是fancyhdr宏包提供了更高层的封装\fancyhead和\fancyfoot来设置页眉和页脚,使用L/C/R指定页眉/页脚的三个区域,使用O表示奇数页(Odd page),E表示偶数页(Even page),于是\fancyhead[LO]{…}表示设置奇数页页眉的左部,\fancyhead[L]表示设置所有页面页眉的左部。
\fancyhead{}和\fancyfoot{}默认清除所有的页眉和页脚设置,因此在设置页眉和页脚之前,一般应该先调用\fancyhead{}和\fancyfoot{}。
下面是常见的book类中设置页眉和页脚的方法:

 

\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}%清空页眉页脚
\fancyhead[LE,RO]{\thepage}%页码位置:偶数页居左,奇数页居右
\fancyhead[RE]{\leftmark}%在偶数页显示\leftmark,通常为章标题
\fancyhead[LO]{\rightmark}%在奇数页左边显示\rightmark,通常为节标题
\fancypagestyle{plain}{%重新定义plain样式,在章的首页使用plain样式
\fancyhf{}
\cfoot{\thepage}
\renewcommand\headrulewidth{0pt}
}
具体显示效果,可参考本文的pdf文档。2是从本人编写的《Java程序设计教程》的页眉截图,可以看出,偶数页显示了章的标题,奇数页显示了节的标题。
image: http://softlab.sdut.edu.cn/blog/subaochen/wp-content/uploads/sites/4/2017/07/1_home_subaochen_git_blog_imgs_latex_latex-two-side-header-1.png
图 2: 图书页眉设置效果
注意到,在章节或者文章的首页,LaTeX会自动采用plain页面样式,即清空页眉,页脚只显示居中的页码,这是合理的设置,因此为了安全起见,一般在导言区中也重新定义plain页面样式。当然,如果要设置“特别”的文章或者章节首页样式,也可以定义“特别”的plain样式。
上面的定义中使用了\fancyhf,这是比\fancyhead和\fancyfoot更底层一些的命令,即\fancyhead{}等于\fancyhf{H},\fancyfoot{}等于\fancyhf{F},当调用\fancyhead[RO],相当于调用\fancyhf[FRO]。

\leftmark和\rightmark

打开一本书,偶数页总是在左边,奇数页总是在右边。一般的,偶数页即左边页的页眉显示当前页所在的章标题,奇数页即右边页的页眉显示当前页所在节的标题,以便读者能够清楚的了解自己阅读的进度,\leftmark和\rightmark两个命令即为此设计,即\leftmark能够获取当前页所在章的标题,\rightmark能够获取当前页所在的节的标题。这两个命令中的left和right也暗合偶数页和奇数页的页眉内容来源。那么,LaTeX是如何做到这一点的呢?
LaTeX提供了两个命令可以用来帮助完成这个任务:

 

\markboth{main-mark}{sub-mark}
在当前位置设置两个mark,一个是main-mark,一个是sub-mark。main-mark和sub-mark一般具有某种“主从”的关系,比如章和节中,在章出现的地方设置main-mark,在节出现的地方设置sub-mark。
\markright{sub-mark}
在当前位置设置一个sub-mark。
有了\markboth和\markright这两个命令,我们很容易想到,每当执行\chapter命令时,就执行\makeboth命令设置章的标题为main-mark,每当执行\section或者\subsection命令时执行\markright设置节的标题为sub-mark等。实际上,LaTeX也定义了\chaptermark和\sectionmark命令来辅助完成这个任务,比如在book类中这两个命令的定义为:

 

\renewcommand\chaptermark[1]{\markboth{\chaptername\ \thechapter. #1}{}}
\renewcommand\sectionmark[1]{\markright{\thesection. #1}}
也就是说,每当执行\chapter命令时,也执行\chaptermark;每当执行\section命令时,也同时执行\sectionmark。
于是,\leftmark可以定义为:取当前页最后定义的main-mark,如果不存在则取最近定义的main-mark;\rightmark定义为:取当前页最先定义的sub-mark,如果不存在则取最近定义的sub-mark。用章和节的观点来看就是,在当前页查找章的定义,如果存在多个章,则去最后定义的章为\leftmark;如果当前页不存在章的定义,则往前查找,直到找到最近定义的一个章作为\leftmark;\rightmark的过程类似,只是针对“节”而言:在当前页查找“节”的定义,如果存在多个,则去最先定义的“节”作为\rightmark;如果当前页不存在“节”的定义,则往前查找,直到找到最近定义的一个“节”为止作为\rightmark。

1

1

此表格取自《LaTeX Compannion》第二版,P219并略做改动。

可以作为考验是否理解\leftmark和\rightmark的“试金石”。

 

命令
marker pair
获取的markers
\leftmark
\rightmark
\makeboth{L1}{}
{L1}{}
\newpage
L1
\markright{R1.1}
{L1}{R1.1}
\markboth{L2}{}
{L2}{}
\markright{R2.1}
{L2}{R2.1}
\newpage
L2
R1.1
\markright{R2.2}
{L2}{R2.2}
\markright{R2.3}
{L2}{R2.3}
\markright{R2.4}
{L2}{R2.4}
\newpage
L2
R2.2
\markboth{L3}{}
{L3}{}
\markright{R3.1}
{L3}{R3.1}
\newpage
L3
\newpage
L3
R3.1
\markright{R3.2}
{L3}{R3.2}
\markboth{L4}{}
{L4}{}
\markboth{L5}{}
{L5}{}
\newpage
L5
R3.2
markright{R5.1}
{L5}{R5.1}
\end{document}
L5
R5.1
表 1: \leftmark和\rightmark的产生过程
0

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据