资源
本文介绍如何使用 geometry 设置 LaTeX 文档页面。这里 是 geometry 在 github 上的项目地址,本文仅对 geometry 常用的排版命令进行介绍,更多详情请参考最新的 官方手册。
页面布局
我们知道在 LaTeX 中控制页面布局的原始命令有十个以上。如果我们使用这些命令来控制我们的页面布局的话会十分复杂且容易出错,且如果我们需要临时更改某些页面的布局的时候,必须要小心翼翼的重新计算。geometry 宏包提供的一系列命令可以将我们从这些复杂的设置中解救出来。
下图(官方手册中的图)给出了 geometry 包的布局图。页面布局包括 total body(可打印区域)和 margins(边距)。total body由 body (文字区)和可选的 header,footer 以及边注区(\marginpar
为边注命令)组成。margins由四部分组成:left,right,top,bottom。对于双面打印的文档,水平边距应该被称为 inner(靠近装订侧边距)和 outer。
组成关系如下:
- paper : total body 和 margins
- total body : body(可打印区域)(可选的 head,foot 和 marginpar)
- margins : left(inner), right(outer), top 和 bottom
可以看到 geometry 定义的布局和 CSS 中的盒子模型差不多,甚至更加简单(没有 padding)。我们只需要直观的定义页面布局即可,具体的参数计算由 geometry 宏包提供。
每一个边距从纸张对应的边开始计算。例如,左边距(内边距)表示的是纸张左侧边(内部边)到 total body 左侧边(双面打印时根据奇偶页不同也可能为右侧)之间的水平间距。因此 geometry 宏包的左边距及上边距和原始的 \leftmargin
,\topmargin
不同。body 的大小可以通过 \textwidth
,\textheight
修改。页面的 total body 和 margins 遵循如下关系:
total body 的 width 和 height 定义如下:
上述方程中,默认状态下 。当 includemp 参数被设置为 true 时(在选项中指定:\usepackage[includemp,...]{geometry}
,不设置值的时候默认为 true
),marginparsep 和 marginparsep 将包含到 width 中。对应的,默认状态下 。当 includehead 设置为 true 时,headheight 和 headsep 包含到 height 中,同样,includefoot 将会使 footskip 包含到 height 中。下图显示了这些参数如何在垂直方向影响布局的:
因此,页面布局在两个方向上一共由三部分组成:一个 body 和两个 margins。如果它们中的两个被指定了,则另一个无需指定(假定页面大小确定),geometry 宏包的自动补全机制(具体请参考其手册第6.5节)会帮助我们进行计算。
常用参数设置
前面我们介绍了 geometry 包的页面布局,下面我们介绍常用的参数设置。这里通过举例的方式对常用的参数进行介绍,这些参数应该可以覆盖85%以上的应用场合,更多选项可以参考官方手册。页面布局的设置方法有两种,一种方法是在加载 geometry 包的时候在选项中指定参数,如 \usepackage[options]{geometry}
,另一种方式是在加载包之后使用 \geometry{options}
设置参数。 一个比较常用的参数示例如下:
\RequirePackage[a4paper]{geometry}
\geometry{
textwidth=138mm,
textheight=215mm,
left=27mm,
right=27mm,
top=25.4mm,
bottom=25.4mm,
headheight=2.17cm,
headsep=4mm,
footskip=12mm,
heightrounded,
}
上面的代码应该放置到导言区(preamble,\begin{document}
之前)。第一行是加载宏包,我们在编写自己的包或者文档类的时候使用 \ReeuirePackage
命令,如果是在文档写作中,对应的使用 \usepackage
即可。
直到 bottom
之前的参数我们都是在设置页面布局。前面我们说过页面布局在两个方向上有三个部分组成,某个方向上确定其中两个参数第三个会自动计算。但是这里我们却指定了三个参数。以水平方向上距离,这里我们 textwidth,left,right
的参数都指定了。另外,如果细心的话会发现 A4 纸张的宽度为210mm(长297mm),但是我们这里指定的三个参数相加为 并不等于210.像这种参数设置出现矛盾的时候,geometry 宏包是如何处理的呢?处理的原则为:后面的参数会覆盖前面设置的参数。对于上面的例子来说 left
和 right
参数的设置是有效的,而 textwidth
的设置会被忽略。同样的这里的 textheight
参数也会被忽略,所以我们可以直接将这两个参数删除并不会影响我们的布局。
接下来的 headheight,headsep,footskip
参数是对页眉页脚的布局进行设置。由于我们这里并没有使用 includehead
和 includefoot
参数,所以默认页面页脚是包含到 top
和 bottom
之中的。页面页脚大小的设定并不会影响到文字的排版。
最后的 heightrounded
参数将 textheight
参数四舍五入到 \baselineskip
的整数倍加 \topskip
。\baselineskip
可以认为是行距,\topskip
为纸张可书写区域顶部空白。所以这个参数也很好理解:让文本区域的高度变成行距的整数倍防止可能出现的“underfull vbox”。如 \textheight
为 486pt,\baselineskip
为12pt,\topskip
为10pt,那么:
最终将会设置 \textheight
的值为 490pt。
可以看到通过使用 geometry 宏包,我们只需要使用简单的几条命令就可以直观的的设置我们的页面布局了。
在文档中改变页面布局
前面我们通过在导言区通过使用 \geometry{options}
参数可以轻松的设置全局的页面布局,有时候我们可能需要在我们的文档中间临时的修改某些页面的布局。在这种情况下,我们可能还会使用到的下面的命令:
\newgeometry{options}
在文档的中间改变页面布局。使用参数和 \geometry
相同,但它会禁止导言区中 \usepackage
和 \geometry
指定的所有选项(跳过所有文档尺寸相关的选项,\negeometry
命令不能设置文档尺寸相关参数)。\restoregeometry
命令则对应的恢复导言区指定的页面布局。这两个命令在调用时都会插入一个 \clearpage
命令来强制开始一个新的页面。
\savegeometry{<name>}
保留该命令所在页面的布局并命名为 <name>。\loadgeometry{<name>}
加载名为 <name> 的页面布局。
上面这些命令在同一个文档多个页面布局以及多个页面布局交替复用时非常有用。