首页 产品价格 LaTeX 模板
5. 排版样式设定

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>}