LaTeX
LaTeX 和文档类
LaTeX 和文档类通常会为你处理页面布局问题。在学术出版物的提交中,这些内容通常超出了你的控制范围,因为出版商希望控制排版。但是,对于你自己的文档,有一些显而易见的设置你可能希望更改:例如页边距、页面方向和列数等。本教程的目的是向你展示如何配置你的页面。
在本章中,我们将经常处理 TeX 长度。你可以参考《Lengths》以获取该主题的详细信息。
双面文档
文档可以是单面或者双面的。文章默认是单面的,书籍是双面的。双面文档区分左右(偶数和奇数)页,而单面文档则没有这种区分。最显著的效果可以在页边距中看到。如果你想将文章类设置为双面文档,可以使用 \documentclass[twoside]{article}
。
许多 LaTeX 命令和变量会考虑这一概念。它们被称为偶数页和奇数页。对于单面文档,只有奇数页的命令和变量会生效。
页面尺寸
LaTeX 中的页面是由许多内部参数定义的。每个参数对应页面元素的长度。例如,
\paperheight
是页面的物理高度。这里你可以看到一个图表,显示了定义页面的所有变量。所有的尺寸单位都是 TeX 点(pt),1 英寸等于 72.27pt,1pt ≈ 0.3515mm。
one inch + \hoffset
one inch + \voffset
\oddsidemargin = 31pt
\topmargin = 20pt
\headheight = 12pt
\headsep = 25pt
\textheight = 592pt
\textwidth = 390pt
\marginparsep = 10pt
\marginparwidth = 35pt
\footskip = 30pt
\marginparpush = 7pt (not shown)
\hoffset = 0pt
\voffset = 0pt
\paperwidth = 597pt
\paperheight = 845pt
这些当前的详细信息以及布局形状可以通过 LaTeX 文档本身打印出来。使用 layout
包和同名命令:
\usepackage{layout}
...
\layout{}
显示页面边框
为了在当前文档中渲染一个标记页面边距的框,可以在文档中添加:
\usepackage{showframe}
页面大小
这可能并不立即显现出来——因为它并不会造成严重的问题——所有标准文档类的默认页面大小是 US Letter。这比 A4 短 18 毫米(约 3/4 英寸),宽 8 毫米(约 1/4 英寸)。A4 是世界大部分地区的标准格式,虽然这不是一个严重问题(大多数打印机能顺利打印此文档),但你可以在类选项中指定其他页面大小。例如,A4 格式:
\documentclass[a4paper]{article}
请注意,标准的 LaTeX 类默认使用 US Letter,而不管你的 TeX 配置是什么。如果你的 TeX Live 配置为使用 A4 纸,它仅会对 plainTeX 和没有指定纸张尺寸的类起作用。
a4paper
选项仅对 article
类有效,不会自动改变页面大小,除非你使用了合适的包,例如 geometry
或 hyperref
包。
使用 geometry
设置页面大小
geometry
是一个非常强大的页面布局包。这个包的直接优势是它可以让你即使在不支持这些选项的类中,也能自定义页面大小。例如,设置页面大小可以将以下内容添加到你的前导部分:
\usepackage[a4paper]{geometry}
geometry
包内置了许多预定义的页面尺寸,例如:a4paper
。其他选项包括:
-
a0paper, a1paper, ..., a6paper
-
b0paper, b1paper, ..., b6paper
-
letterpaper
-
legalpaper
-
executivepaper
要显式改变纸张尺寸,可以使用 geometry
包的 paperwidth
和 paperheight
选项。例如:
\usepackage[paperwidth=5.5in, paperheight=8.5in]{geometry}
此包提供了许多灵活的页面布局设置,包括使用:
\newgeometry{ key=val // package options }
\restoregeometry
尽管非常灵活,geometry
包也有一些限制。例如,页面大小不能针对单独的页面进行设置,解决此问题需要其他方法。
页面尺寸问题
如果你最终希望得到一个 PDF,通常有三种方式:
-
TeX → PDF
pdflatex myfile # TeX → PDF
-
TeX → DVI → PDF
latex myfile # TeX → DVI dvipdf myfile # DVI → PDF
-
TeX → DVI → PS → PDF
latex myfile # TeX → DVI dvips myfile -o myfile.ps # DVI → PS ps2pdf myfile.ps myfile.pdf # PS → PDF
遗憾的是,PDF 输出的页面大小可能不会完全遵守你的设置。有些工具对 DVI、PS 和 PDF 规范的解释不同,最终生成的 PDF 页面大小可能不完全符合要求。幸运的是,有解决方案:\special
命令允许用户传递 PostScript 或 PDF 参数,这可以用来适当设置页面大小。
对于 pdflatex
,使用 geometry
包通常可以正常工作。对于 DVI 和 PS 方法,确保在最终得到正确纸张大小的最安全方法是:
\documentclass[...,a4paper,...]{...}
\special{papersize=210mm,297mm}
然后在输出生成过程中为处理器添加相应的参数:
dvips -t a4 ...
ps2pdf -sPAPERSIZE=a4 ... # 在 Windows 上使用:ps2pdf -sPAPERSIZE#a4 ...
如果你想使用 US Letter 页面,则将 210mm, 297mm 替换为 8.5in, 11in,并将 a4paper
替换为 letter
。同时在命令行参数中也将 a4
替换为 letter
。
平板设备的页面大小
那些希望在平板或其他手持设备上阅读的人需要创建没有多余空白的文档。为了创建适合手持设备查看的 PDF 文档,不仅要调整文本区域和页边距,还需要调整页面大小。如果你需要一个合理的尺寸,可以考虑采用美国最高法院使用的纸张尺寸:441pt × 666pt(或 6.125 英寸 × 9.25 英寸),在平板上看起来非常好。你也可以使用最高法院的文本区域大小:297pt × 513pt,但对于非世纪教科书字体的字体来说,这个尺寸太宽了。
页边距
习惯于阅读常规物理文献的读者可能会问,为什么文档周围有这么多空白。例如,在 A4 纸上,文档的左右页边距通常为 44 毫米,页面约有 60% 的宽度用于排版文本。这样设置的原因是为了提高可读性。研究表明,当每行有 60-70 个字符时,阅读更加轻松,而 66 字符似乎是最理想的数字。因此,页面边距的设置是为了确保最佳的可读性,过多的边距空白被视为可以接受的后果。有时,这些空白会留在内侧边距中,假设文档会被装订。
如果你希望避免过多的空白空间,而不是改变边距,可以考虑使用双栏(或更多)布局。这是大多数印刷杂志采用的方法,因为它既能保证可读的行长,又能更好地利用页面。另一种减少页面空白的方法是通过使用 12pt 选项增加字体大小。
改变文档的边距
有许多方法可以改变文档的边距:
一种较老的方法是使用 fullpage
包,提供稍微标准化的较小边距(大约为 1 英寸),但使用 10pt 默认字体时,会导致每行字符数超过 100 个(如果使用 12pt 文档类选项,则大约为 90 个):
\usepackage{fullpage}
对于更窄的边距,fullpage
包有一个 cm
选项(约 1.5 厘米),其结果是每行大约 120 个字符,远超可读的范围:
\usepackage[cm]{fullpage}
更现代和灵活的方法是使用 geometry
包。这个包可以让你在不需要记住特定页面尺寸命令的情况下,自定义四个边距。你可以使用厘米和英寸来设置尺寸,每个值后使用 cm
或 in
单位(例如 1.0in 或 2.54cm)。
\usepackage[top=1in, bottom=1.25in, left=1.25in, right=1.25in]{geometry}
如果你希望 fullpage
包的行为,可以使用以下命令:
\usepackage[margin=1in]{geometry}
你还可以将边距选项与页面大小选项结合使用。
对于 A4 页面大小,你可以使用 layaureo
包,该选项会进一步缩小边距。
如果你使用的是 A4 页面大小,不应使用 a4wide
包,它已经过时且存在问题。相反,应该使用 geometry
包:
\usepackage[a4paper,includeheadfoot,margin=2.54cm]{geometry}
奇偶页边距
使用 geometry
包时,left
和 right
分别用于设置内侧和外侧边距。它们也有别名 inner
和 outer
。因此,处理奇偶页不同边距的最简单方法是,在文档类命令中使用 twoside
选项,并照常指定边距。
\documentclass[twoside]{report}
\usepackage[inner=4cm,outer=2cm]{geometry} % left=4cm,right=2cm would be equivalent
这将使所有内侧边距为 4 厘米(奇数页的左边距和偶数页的右边距),外侧边距为 2 厘米。
设置 geometry
的 inner
和 outer
相同值会去除奇偶页之间的边距差异。另一种快速消除奇偶页位置差异的方法是将 evensidemargin
和 oddsidemargin
的值设置为奇数默认值的一半:
\setlength{\oddsidemargin}{15.5pt}
\setlength{\evensidemargin}{15.5pt}
章节顶部边距
可以使用 titlesec
包来更改章节上方的顶部边距。例如:
\usepackage{titlesec}
\titlespacing*{\chapter}{0pt}{-50pt}{20pt}
\titleformat{\chapter}[display]{\normalfont\huge\bfseries}{\chaptertitlename\ \thechapter}{20pt}{\Huge}
当更改章节的间距时,必须使用 \titleformat
命令。如果是章节以外的部分,可以省略该命令。
页面方向
当你谈论更改页面方向时,通常是指更改为横向模式,因为纵向模式是默认的。我们将介绍两种稍有不同的方式来更改方向。
更改整个文档的方向
如果你希望整个文档从一开始就使用横向模式,几种包可以实现这一点,其中我们推荐使用 geometry
包。只需在导言中调用该包,并将 landscape
作为选项:
\usepackage[landscape]{geometry}
如果你打算使用 geometry
设置纸张大小,请不要重复添加 \usepackage
命令,只需将所有选项合并并用逗号分隔:
\usepackage[a4paper,landscape]{geometry}
使用标准的 LaTeX 类时,也可以使用相同的类选项:
\documentclass[a4paper,landscape]{article}
更改特定部分的方向
第二种方法适用于当你正在写一篇纵向文档,但某些内容(如大图或表格)最好在横向页面上显示时。然而,你仍然希望保持标题和页脚一致,显示在与其他页面相同的位置。
lscape
包就是为此而设计的。它提供了一个横向环境,任何在其中的内容都会被旋转。页面尺寸不会改变。这种方法更适用于书籍或报告,而不太适用于典型的学术出版物。使用 pdflscape
包而不是 lscape
来生成 PDF 文档时,将使页面在查看时显示正确的方向:唯一一页横向页面将被旋转,其他页面将保持纵向方向。
此外,要使表格正确地居中显示在横向页面上,必须将 tabular
环境放在 table
环境中,而 table
环境又应该放在 landscape
环境中。例如,代码应如下所示:
\usepackage{pdflscape}
% ...
\begin{landscape}
\begin{table}
\centering % 可选,可能会让表格在页面上居中显示,看起来更好
\begin{tabular}{....}
% ...
\end{tabular}
\end{table}
\end{landscape}
对于书籍(以及一般使用 twoside
选项的文档),landscape
环境无法正确处理奇偶页的不同布局。可以通过在导言区添加几行额外代码来修复这个问题[4]。
更改浮动环境的方向
如果你使用上述代码,你会看到表格被插入到代码中的位置,但它不会浮动!为了解决这个问题,你需要使用 rotating
包。请参见旋转章节。
页边距、页面大小和单独页面的旋转
如果你需要旋转页面以适配图形,可能还需要调整页边距和字体大小。再次,geometry
包非常方便,可以为单独的页面指定新的边距。
\usepackage{geometry}
\usepackage{pdflscape}
% ...
\newgeometry{margin=1cm}
\begin{landscape}
\thispagestyle{empty} %% 删除页眉和页脚。
\begin{table}
\begin{center}
\footnotesize %% 较小的字体大小。
\begin{tabular}{....}
% ...
\end{tabular}
\end{center}
\end{table}
\end{landscape}
\restoregeometry
注意: 顺序很重要!
页面背景
实现页面背景有多种方法。以下是常用的包:
-
eso-pic 包:允许你在每个页面或单独的页面中打印背景内容。
\usepackage{tikz} % 用于下面的 \gradientbox
\usepackage{eso-pic}
\newcommand{\gradientbox}[3]{%
\begin{tikzpicture}
\node[left color=#1,right color=#2] {#3};
\end{tikzpicture}%
}
\AddToShipoutPicture*{%
\AtPageLowerLeft{%
\rotatebox{90}{
\gradientbox{blue!20}{white}{%
\begin{minipage}{\paperheight}%
\hspace*{ \stretch{1} }\textcopyright~2013 \makeatletter\@author\makeatother.\hspace*{ \stretch{1} }
\end{minipage}%
}
}%
}%
}
AddToShipoutPicture
命令的星号版本只对当前页面有效。
-
background 包:允许用户在背景中加入水印和图片。
\usepackage{background}
\backgroundsetup{
opacity = 0.5,
angle = 0,
contents = {\includegraphics{example.pdf} }
}
多栏页面
使用 twocolumn
可选类参数
使用标准的 LaTeX 文档类(如 article
),你可以简单地将 twocolumn
作为可选参数传递给文档类:
\documentclass[twocolumn]{article}
这将达到所需的效果。
多栏页面
使用 twocolumn
可选类参数
使用标准的 LaTeX 文档类,例如 article
,可以通过传递可选参数 twocolumn
来创建双栏布局:
\documentclass[twocolumn]{article}
这将会产生期望的效果。
虽然这种方法很有用,但它也有一些局限性。multicol
包提供了以下优点:
-
可以支持最多十列。
-
实现了
multicols
环境,因此可以在一个文档中混合使用不同数量的列。 -
此外,该环境可以嵌套在其他环境中,例如
figure
。 -
multicol
输出平衡的列,最后一页的列将大致相等。 -
使用
multicols*
环境来生成不平衡的列,其中每一列在开始下一列之前完全填满。 -
列之间的垂直规则可以自定义。
-
列环境可以轻松地局部或全局自定义。
使用 multicol
包
multicol
包克服了 twocolumn
的一些缺点,并提供了 multicol
环境。要创建一个典型的两栏布局:
\begin{multicols}{2}
lots of text
\end{multicols}
这个环境不完全支持浮动。它只能处理使用浮动命令的星号形式(例如,\begin{figure*}
),这将使浮动跨越所有列。虽然这并不是特别有问题,因为与列宽相同的浮动可能会太小,而且你可能还是希望它们跨列。有关更详细的讨论,请参见本节。
multicol
包有两个重要的参数,可以通过 \setlength
来设置:
-
\columnseprule
:设置列之间垂直规则的宽度,默认值是0pt
。 -
\columnsep
:设置列之间的水平间距,默认值是10pt
,这相当窄。
要强制在列中换行,使用命令 \columnbreak
。
手动页面格式化
在非常长的文档中(例如书籍),LaTeX 有时不会正确处理所有的页面断开,因此可能需要手动调整页面格式。理想情况下,应该在文档内容完全完成后才进行这一步。LaTeX 提供了以下命令:
-
\newpage
:结束当前页面并开始新的一页。 -
\pagebreak[number]
:在命令所在位置断开当前页面。可选的数字参数设置优先级,范围从 0 到 4。 -
\nopagebreak[number]
:阻止在命令所在位置断开页面。可选的数字参数设置优先级,范围从 0 到 4。 -
\clearpage
:结束当前页面,并将所有遇到的但尚未显示的浮动元素打印出来。
寡头与孤儿
在专业书籍中,通常不希望页面的开头或结尾只有一行文本。排版中这种情况称为 "寡头" 和 "孤儿"。通常在 LaTeX 文档中可能会出现寡头和孤儿。你可以尝试使用手动页面格式化来解决这些问题,但也有自动解决方案。
LaTeX 有一个关于 "penalty"(惩罚) 的参数,用于控制寡头和孤儿的出现。增加惩罚值,LaTeX 会更努力地避免这些情况。你可以尝试通过在文档导言中加入以下命令来增加惩罚值:
\widowpenalty=300
\clubpenalty=300
如果这不起作用,你可以尝试进一步增加这些值,最大值为 10000。然而,不推荐将其设置得太高,因为将其设置为 10000 会完全禁止 LaTeX 进行此类操作,这可能会导致一些奇怪的行为。
此外,使用橡皮带值(rubber band values)来调整段落之间的间距也是有帮助的:
\setlength{\parskip}{3ex plus 2ex minus 2ex}
或者,你可以使用 needspace
包来保留一些行,从而防止那些行的分页。
\needspace{5\baselineskip}
Some
text
on
5
lines.
故障排除/调试
一个非常有用的故障排除和设计技巧是启用 geometry
包中的 showframe
选项(它与上面描述的 showframe
包效果相同)。它会在页面的主要元素周围绘制边框,这非常有帮助,因为各种区域的边界通常是不可见的,并且被填充空白干扰。
\usepackage[showframe]{geometry}
检查 tex
的日志也很有帮助,它应该提供许多有用的信息。此外,以下包有助于可视化调试布局:
%\usepackage{layout}
%\usepackage{showframe}
% \layout % - 将它放在 "document" 部分中,以便更方便地查看需要的布局
这些语句可以放在源文件的顶部,并在需要时取消注释。
注释与参考
本页使用了 Andy Roberts 的《Getting to grips with LaTeX》中的材料,并得到了作者的许可。