5. 排版样式设定

至此你已经基本学会排版内容丰富的文档,标题、目录、章节、公式、列表、图片、表格等等应有尽有。但是你可能已经有点不甘心了,因为似乎你排版出来的文档是千篇一律的模样——LaTeX 默认的字体、单调的页眉页脚、不太令你满意的页边距,等等。本章的内容将带你一览如何修改 LaTeX 的排版样式。

5.1 字体和字号

LaTeX 根据文档的逻辑结构(章节、脚注等)来选择默认的字体样式以及字号。需要更改字体样式或字号的话,可以使用表 5.1 和 表 5.2中列出的命令。

{\small The small and
\textbf{bold} Romans ruled}
{\Large all of great big
{\itshape Italy}.}

==LaTeX 2== 相比于较早的 LaTeX 版本(2.09 版或更早)在字体样式和字号的设定上有很大改进,令字体的各种属性相互独立(“正文”),用户可以改变字体的大小,而仍然保留字体原有的粗体或斜体的特性。

5.1.1 字体样式

LaTeX 提供了两组修改字体的命令,见表 5.1。其中诸如 \bfseries 形式的命令将会影响之后所有的字符,如果想要让它在局部生效,需要用花括号分组,也就是写成 {\bfseries<some text>} 这样的形式;对应的 \textbf 形式带一个参数,只改变参数内部的字体,更为常用。

在公式中,直接使用 \textbf 等命令不会起效,甚至报错。LaTeX 已有修改数学字体的命令,详见 4.7.1 小节。

5.1.2 字号

字号命令实际大小依赖于所使用的文档类及其选项。表 5.3 列出了这些命令在标准文档类中的绝对大小,单位为 pt。

He likes {\LARGE large and
{\small small} letters}.

LaTeX 还提供了一个基础的命令 \fontsize 用于设定任意大小的字号:

\fontsize{<size>}{<base line-skip>}

\fontsize 用到两个参数,<size> 为字号,<base line-skip> 为基础行距。表 5.3 中的命令也都各自设定了与字号对应的基础行距,大小为字号的 1.2 倍。如果不是在导言区,\fontsize 的设定需要 \selectfont 命令才能立即生效。而表 5.2 的字号设定都是立即生效的。

5.1.3 选用字体宏包

至此已经介绍了如何改变字体样式如粗体、斜体等等,以及如何改变字号,但你依然用着 LaTeX 默认的那套、由高德纳设计制作的 Computer Modern 字体。有的人可能很喜欢 Times、Palation,或者更好看的字体。这些字体样式的自由设置在 LaTeX 里还不太容易。

幸好大部分时候,许多字体宏包为我们完成了整套配置,我们可以在调用宏包之后,照常使用 \bfseries 或 \ttfamily 等我们熟悉的命令。表 5.4 列出了较为常用的字体宏包,其中相当多的宏包还配置了数学字体,或者文本、数学字体兼而有之。更多的字体配置参考 [18,19] 。

5.1.4 字体编码

字体编码对于 LaTeX 用户来讲是一个比较晦涩的概念。它规定了一个字体里包含的符号,并将若干符号用 LaTeX 命令定义。注意字体编码并不与我们在 2.1.1 等小节叙述的 ASCII 编码等一一对应。

常见的正文字体编码有 OT1 和 T1 等。LaTeX 默认使用兼容 plain TEX 的 OT1 编码,使用起来有诸多限制:高德纳在设计 Computer Modern 字体时认为一些符号,如大于号、小于号等,原则上都应该在公式里出现,所以在正文字体里这些符号所在的位置被其他符号所占据(OT1 字体编码、\rmfamily 和 \sffamly 字体族下,< 和 > 排版 ¡ 和 ¿ 两个倒立的标点符号,正常的大于号和小于号可用命令 \textgreater 和 \textless 输入;\ttfamily 字体族下是正常的大于号和小于号)。扩展的 T1 字体编码则更加靠近 ASCII 文本编码,不会出现上述的大于号、小于号的问题。

切换字体编码要用到 fontenc 宏包:

\usepackage[T1]{fontenc}

fontnec 宏包是用来配合传统的 LaTeX 字体的,如表 5.4 中的一些传统字体宏包。如果使用 xelatex 编译方式,并使用 fontspec 宏包调用 ttf 或 otf 格式字体,就不要再使用 fontenc 宏包。使用表 5.4 中的字体宏包之前最好查看一下宏包的帮助文档,了解使用方法和注意事项。

5.1.5 使用 fontspec 宏包更改字体(xelatex)

xelatex 编译命令能够支持直接调用系统和 TEX 发行版中的 .ttf 或 .otf 格式字体。相比于上一节,我们有了解更多修改字体的余地。

xelatex 命令下支持用户调用字体的宏包是 fontspec。宏包提供了几个设置全局字体的命令,设置 \rmfamily 等对于命令的默认字体:

\setmainfont[<font features>]{<font name>}
\setsansfont[<font features>]{<font name>}
\setmonofont[<font features>]{<font name>}

其中 使用字体的文件名(带扩展名)或者字体的英文名称。 用来手动配置对应的粗体或斜体,比如为 Windows 下的无衬线字体 Arial 配置粗体和斜体(通常情况下自动检测并设置对应的粗体和斜体,无需手动指定):

\setsansfont[BoldFonr={Arial Bold},ItalicFont={Arial Italic}]{Arial}

还能配置字体本身的各种特性,这里不再赘述,感兴趣的读者请参考 fontspec 宏包的帮助文档。

需要注意的是:fontspec 宏包会覆盖数学字体设置。需要调用表 5.4 中列出的一些数学字体宏包时,应当在调用 fontspec 宏包时指定 no-math 选项。fontspec 宏包可能被其他宏包或文档类(如 xeCJK、ctex 文档类)自动调用时,则在文档开头的 \documentclass 命令里指定 no-math 选项。

5.1.6 使用 xeCJK 宏包更改中文字体

前文已经介绍过的 xeCJK 宏包使用了和 fontspec 宏包非常类似的语法设置中文字体:

\setCJKmainfont[<font features>]{<font name>}
\setCJKsansfont[<font features>]{<font name>}
\setCJKmonofont[<font features>]{<font name>}

由于中文字体少有对应的粗体或斜体, 里多用其他字体来配置,比如将宋体对应的 BoldFont 配置为黑体,而 ItalicFont 配置为楷体。

5.2 段落格式和间距

5.2.1 长度和长度变量

在前面的一些章节,我们已经见到一些长度和长度变量的用法。本节首先统一介绍长度和长度变量。

长度的数值 由数字和单位组成。常用的单位见表 5.5

在一些情况下还会用到可伸缩的“弹性长度”,如 12pt plus 2pt minus 3pt 表示基础长度为 12pt,可以伸展到 14pt,也可以收缩到 9pt。也可以定义 plus 或者 minus 的部分,如 0pt plus 5pt。

长度的数值还可以用长度变量本身或其倍数来表达,如 2.5 \parindent 等。

LaTeX 预定义了大量的长度变量用于控制版面格式。如页面宽度和高度、首行缩进、段落间距等。如果需要自定义长度变量,需使用如下命令:

\newlength{<length command>}

长度变量可以用 \setlength 赋值,或用 \addtolength 增加长度:

\setlength{\<length command>}{<length>}
\addtolength{\<length command>}{<length>}

5.2.2 行距

前文我们提到过 \fontsize 命令可以为字号设定对应的行距,但我们很少那么用。更常用的办法是在导言区使用 \linespread 命令。

\linespread{<factor>}

其中 作用于基础行距而不是字号。缺省的基础行距是 1.2 倍字号大小(参考 \fontsize 命令),因此使用 \linespread{1.5} 意味着最终行距为 1.8 倍的字号大小。

如果不是在导言区全局修改,而想要局部的改变某个段落的行距,需要用 \selectfont 命令使 \linespread 命令的改动立即生效:

{\linespread{2. 0}\selectfont
The baseline skip is set to be
twice the normal baseline skip.
Pay attention to the \verb | \par |
command at the end. \par}

In comparison, after the
curly brace has been closed,
everything is back to normal.

字号的改变是即时生效的,而行距的改变知道文字分段时才生效。如果需要改变某一部分文字的间距,那么不能简单地将文字包含在花括号内。注意下面两个例子中 \par 命令的位置,包括上一个例子的写法(\par 相当于分段,见 2.3.1 小节);

{\Large Don't read this!
    It is not true.
    You can believe me! \par }

{\Large This is not true either.
But remember I am a liar.} \par

5.2.3 段落格式

以下长度分别为段落的左缩进、由缩进和首行缩进:

\setlength{\leftskip}{<length>}
\setlength{\rightskip}{<length>}
\setlength{\parindent}{<length>}

它们和设置行距的命令一样,在分段时生效。

\indent
\noindent

LaTeX 默认在段落开始时缩进,长度为用上述命令设置 \parindent。如果你在某一段不想使用缩进,可使用某某一段开头使用 \noindent 命令。相反地,\ indent 命令强制开启一段首行缩进的段落。多个 \indent 命令可以累加缩进量。

LaTeX 还默认在\chapter、\section 等章节标题命令之后的第一段不缩进。如果不习惯这种设定,可以调用 indentfirst 宏包,令第一段的首行缩进照常。

段落间的垂直间距为 \parskip,如设置段落间距在 0.8ex 到 1.5ex 变动:

\setlength{\parskip}{lex plus 0.5ex minus 0.2ex}

LaTeX 默认为将单词之间的“空格”转化为水平间距。如果需要在文中手动插入额外的水平间距,可使用 \hspace 命令:

This\hspace{1.5cm}is a space
of 1.5 cm.

\hspace 命令生成的水平间距如果位于一行的开头或末尾,则有可能因为断行而被“吞掉”。可使用 \hspace* 命令代替 \hspace 命令得到不会因断行而消失的水平间距。

命令 \stretch{ <n> } 生成一个特殊弹性长度,参数 <n> 为权重。它的基础长度为 0pt,但可以无限延伸,直到占满可用的空间。如果同一行内出现多个 \stretch {<n>},这一行的所有可用空间将按每个 \stretch 命令给定的权重 <n> 进行分配。

命令 \fill 相当于 \stretch{1}。

x\hspace{\stretch{1}}
x\hspace{\stretch{3}}
x\hspace{\fill}x

在正文中用 \hspace 命令生成水平间距时,往往使用 em 作为单位,生成的间距随字号大小而变。我们在数学公式中见过 \quad 和 \qquad 命令,它们也可以用于文本中,分别相当于 \hspace{1em} 和 \hspace{2em}:

{\Large big\hspace{1em}y}\\
{\Large big\quad y}\\
nor\hspace{2em}mal\\
nor\qquad mal\\
{\tiny tin\hspace{1em}y}\\
{\tiny tin\quad y}

在页面中,段落、章节标题、行间公式、列表、浮动体等元素之间的间距是 LaTeX 预设的。比如 \parskip,默认设置为 0pt plus 1pt。

如果我们想要人为的增加段落之间的垂直间距,可以在两个段落之间的位置使用 \vspace 命令:

A paragraph.

\vspace{2ex}
Another paragragh.

\vspace 命令生成的垂直间距在一页的顶端或底端可能被“吞掉”,类似 \hspace 在一行的开头和末尾那样。对应地,\vspace* 命令产生不会因断行命令而消失的垂直间距。\vspace 也可以用 \stretch 设置无限延伸的垂直长度。

在段落内的两行之间增加垂直间距,一般通过给断行命令 \ \ 加可选参数,如 \ \ [6pt] 或 \ \ * [6pt]。\vspace 也可以在段落内使用,区别在于 \vspace 只引入垂直间距而不断行:

Use command \verb|\vspace{12pt}|
to add \vspace{12pt} some spaces
between lines in a  paragraph.

Or you can use \verb|\\[12pt]|
to \\[12pt] add vertical space,
but it also breaks the paragraph.

另外 LaTeX 还提供了 \bigskip,\medskip,\smallskip 来增加与定义长度的垂直间距。

\parbox[t]{3em}{TeX\par TeX}
\parbox[t]{3em}{TeX\par\smallskip TeX}
\parbox[t]{3em}{TeX\par\medskip TeX}
\parbox[t]{3em}{TeX\par\bigskip TeX}

5.2.4 水平间距

LaTeX 默认为将单词之间的“空格”转化为水平间距。如果需要在文中手动插入额外的水平间距,可使用 \hspace 命令:

This\hspace{1.5cm}is a space
of 1.5 cm.

\hspace 命令生成的水平间距如果位于一行的开头或末尾,则有可能因为断行而被“吞掉”。可使用 \hspace* 命令代替 \hspace 命令得到不会因断行而消失的水平间距。

命令 \stretch{ <n> } 生成一个特殊弹性长度,参数 <n> 为权重。它的基础长度为 0pt,但可以无限延伸,直到占满可用的空间。如果同一行内出现多个 \stretch {<n>},这一行的所有可用空间将按每个 \stretch 命令给定的权重 <n> 进行分配。

命令 \fill 相当于 \stretch{1}。

x\hspace{\stretch{1}}
x\hspace{\stretch{3}}
x\hspace{\fill}x

在正文中用 \hspace 命令生成水平间距时,往往使用 em 作为单位,生成的间距随字号大小而变。我们在数学公式中见过 \quad 和 \qquad 命令,它们也可以用于文本中,分别相当于 \hspace{1em} 和 \hspace{2em}:

{\Large big\hspace{1em}y}\\
{\Large big\quad y}\\
nor\hspace{2em}mal\\
nor\qquad mal\\
{\tiny tin\hspace{1em}y}\\
{\tiny tin\quad y}

5.2.5 垂直间距

在页面中,段落、章节标题、行间公式、列表、浮动体等元素之间的间距是 LaTeX 预设的。比如 \parskip,默认设置为 0pt plus 1pt。

如果我们想要人为的增加段落之间的垂直间距,可以在两个段落之间的位置使用 \vspace 命令:

A paragraph.

\vspace{2ex}
Another paragragh.

\vspace 命令生成的垂直间距在一页的顶端或底端可能被“吞掉”,类似 \hspace 在一行的开头和末尾那样。对应地,\vspace* 命令产生不会因断行命令而消失的垂直间距。\vspace 也可以用 \stretch 设置无限延伸的垂直长度。

在段落内的两行之间增加垂直间距,一般通过给断行命令 \ \ 加可选参数,如 \ \ [6pt] 或 \ \ * [6pt]。\vspace 也可以在段落内使用,区别在于 \vspace 只引入垂直间距而不断行:

Use command \verb|\vspace{12pt}|
to add \vspace{12pt} some spaces
between lines in a  paragraph.

Or you can use \verb|\\[12pt]|
to \\[12pt] add vertical space,
but it also breaks the paragraph.

另外 LaTeX 还提供了 \bigskip,\medskip,\smallskip 来增加与定义长度的垂直间距。

\parbox[t]{3em}{TeX\par TeX}
\parbox[t]{3em}{TeX\par\smallskip TeX}
\parbox[t]{3em}{TeX\par\medskip TeX}
\parbox[t]{3em}{TeX\par\bigskip TeX}

5.3 页面和分栏

我们不妨回顾一下第一章介绍的文档属性。LaTeX 允许用户通过为文档类指定选项来控制纸张大小(见 1.4.1 小节),包括 a4paper、letterpaper 等等,并配合字号设置了适合的页边距。

控制页边距的参数由图 5.1 里给出的各种长度变量控制。可以用 \setlength 命令修改这些长度变量,以达到调节页面尺寸和边距的作用;反之也可以利用这些长度变量来决定排版内容的尺寸,如在 tabularx 环境或 \includegraphics 命令的参数里,设置图片或表格的宽度为 0.8 \textwidth。

页边距等比较直观的参数则必须间接设置。我们根据图 5.1 将各个方向的页边距计算公式给出(以奇数页为例):

<left-margin>=1in+\hoffset+\oddsidemargin <right-margin>=\paperwidth—<left-margin>-\textwidth <topmargin>=1in+\voffset+\topmargin+\headheight+\headsep <bottom-margin>=\paperheight-<top-margin>-\textheight 如果需要设置合适的 ,就要通过上述方程组把 \oddsidemargin 和 \textwidth 等参数解出来!

幸好 geometry 宏包提供了设置页边距等参数的简单方法,能够帮我们完成背后繁杂的计算。

5.3.1 利用 geometry 宏包设置页面参数

geometry 宏包的调用方式类似于 graphicx,在 latex+dvipdfmx 命令下需要指定选项 dvipdfm (注意这里不是 dvipdfmx);pdflatex 和 xelatex 编译命令下不需要。

你既可以调用 geometry 宏包然后用其提供的 \geometey 命令设置页面参数:

\usepackage{geometry} \geometry{<geometry-settings>}

也可以将参数指定为宏包的选项:

\usepackage[<geometry-settings>]{geometry}

其中 多以 = 的形式组织。

比如,符合 Microsoft Word 习惯的页面设定是 A4智障,上下边距 1 英尺,左右边距 1.25 英尺,于是我们可以通过如下两种等效的方式之一设定页边距:

\usepackage[left=1.25in,right=1.25in,% top=1in,bottom=1in]{geometry} % or like this: \usepackage[hmargin=1.25in,vmargin=1in]{geometry}

又比如,需要设定周围的边距一致为 1.25 英寸,可以用更简单的语法:

\usepackage[margin=1.25in]{geometry}

对于书籍等双面文档,习惯上奇数页右边、偶数页左边留出较多的页边距,而书脊一侧的奇数页左边、偶数页右边页边距较少。我们可以这样设定:

\usepackage[inner=1in,outer=1.25in]{geometry}

geometry 宏包本身也能够修改纸张大小、页眉页脚高度、边注宽度等等参数。更详细的用法不再赘述,感兴趣的用户可查阅 geometry 宏包的帮助文档。

5.3.2 页面内容的垂直对齐

LaTeX 默认将页面内容在垂直方向分散对齐。对于有大量图表的文档,许多时候想要做到排版匀称的页面很困难,垂直分散对齐会造成某些页面的垂直间距过宽,还可能报大量的 Underfull \vbox 消息。LaTeX 还提供了另一种策略:将页面内容向顶部对齐,给底部留出高度不一的空白。

以下命令分别令页面在垂直方向向顶部对齐 / 分散对齐:

\raggedbottom \flushbottom

5.3.3 分栏

LaTeX 支持简单的单栏或双栏排版。标准文档类的全局选项 onecolumn、twocolumn 可控制全文分单栏或双栏排版。LaTeX 也提供了切换单 / 双栏排版的命令:

\onecolumn \twocolumn[<one-column top matterial>]

\ twocolumn 支持带一个可选参数,用于排版双栏之上的一部分单栏内容。

切换单 / 双栏排版时总是会另起一页( \clearpage )。在双栏模式下使用 \newpage 会换栏而不是换页:\clearpage 则能够换页。

双栏排版时每一栏的宽度为 \columnwidth,它由 \textwidth 减去 \columnsep 的差除以 2 得到。两栏之间还有一道竖线,宽度为 \columnseprule,默认为零,也就是看不到竖线。

一个比较好用的分栏解决方案是 multicol,它提供了简单的 multicols 环境(注意不要写成 muticol 环境)自动产生分栏,如以下环境将内容分为 3 栏:

\begin{multicols}{3}\\end{multicols}

multicol 宏包能够在一页之中切换单栏 / 多栏,也能处理跨页的分栏 ,且各栏的高度分布平衡。但代价是在 multicols 环境中无法正常使用 table 和 figure 等浮动体环境,它会直接让浮动体丢失。multicols 环境中只能用跨栏的 table* 和 figure* 环境,或者用 float 宏包提供的 H 参数固定浮动体的位置。

5.4 页眉页脚

5.4.1 基本的页眉页脚样式

LaTeX 中提供了命令 \pagestyle 来修改页眉页脚的样式:

\pagestyle{<page-style>}

命令 \thispagestyle 只影响当页的页眉页脚样式:

\thispagestyle{<page-style>}

< page-style > 参数为样式的名称,在 LaTeX 里预定义了四类样式,见表 5.6

其中 headings 的情况较为复杂:

article 文档类,twoside 选项 偶数页为页码和节标题,奇数页为小节标题和页码;

article 文档类,oneside 选项 页眉为节标题和页码;

book / report 文档类,twoside 选项 偶数页为页码和章标题,奇数页为节标题和页码;

book / report 文档类,oneside 选项 页眉为章标题和页码。

\pagenumbering 命令令我们能够改变页眉页脚的页码样式:

\pagenumbering{<style>}