latex geometry 页面设置

资源

本文介绍如何使用 geometry 设置 LaTeX 文档页面。这里geometry 在 github 上的项目地址,本文仅对 geometry 常用的排版命令进行介绍,更多详情请参考最新的 官方手册

页面布局

我们知道在 LaTeX 中控制页面布局的原始命令有十个以上。如果我们使用这些命令来控制我们的页面布局的话会十分复杂且容易出错,且如果我们需要临时更改某些页面的布局的时候,必须要小心翼翼的重新计算。geometry 宏包提供的一系列命令可以将我们从这些复杂的设置中解救出来。

下图(官方手册中的图)给出了 geometry 包的布局图。页面布局包括 total body(可打印区域)和 margins(边距)。total bodybody (文字区)和可选的 headerfooter 以及边注区(\marginpar为边注命令)组成。margins由四部分组成:left,right,top,bottom。对于双面打印的文档,水平边距应该被称为 inner(靠近装订侧边距)和 outer

页面布局

组成关系如下:

  • paper : total bodymargins
  • total body : body(可打印区域)(可选的 head,footmarginpar
  • margins : left(inner), right(outer), topbottom

可以看到 geometry 定义的布局和 CSS 中的盒子模型差不多,甚至更加简单(没有 padding)。我们只需要直观的定义页面布局即可,具体的参数计算由 geometry 宏包提供。

每一个边距从纸张对应的边开始计算。例如,左边距(内边距)表示的是纸张左侧边(内部边)到 total body 左侧边(双面打印时根据奇偶页不同也可能为右侧)之间的水平间距。因此 geometry 宏包的左边距及上边距和原始的 \leftmargin,\topmargin 不同。body 的大小可以通过 \textwidth,\textheight修改。页面的 total body 和 margins 遵循如下关系:
paperwidth = left + width + right \\ paperheight = top + height + bottom
total body 的 widthheight 定义如下:
width := textwidth \: (+marginparsep+marginparwidth) \\ height := textheight \: (+headheight+headsep+footskip)

上述方程中,默认状态下 width := textwidth。当 includemp 参数被设置为 true 时(在选项中指定:\usepackage[includemp,...]{geometry},不设置值的时候默认为 true),marginparsepmarginparsep 将包含到 width 中。对应的,默认状态下 height := textheight 。当 includehead 设置为 true 时,headheightheadsep 包含到 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),但是我们这里指定的三个参数相加为 138+27+27=192 并不等于210.像这种参数设置出现矛盾的时候,geometry 宏包是如何处理的呢?处理的原则为:后面的参数会覆盖前面设置的参数。对于上面的例子来说 leftright 参数的设置是有效的,而 textwidth 的设置会被忽略。同样的这里的 textheight 参数也会被忽略,所以我们可以直接将这两个参数删除并不会影响我们的布局。

接下来的 headheight,headsep,footskip 参数是对页眉页脚的布局进行设置。由于我们这里并没有使用 includeheadincludefoot 参数,所以默认页面页脚是包含到 topbottom 之中的。页面页脚大小的设定并不会影响到文字的排版。

最后的 heightrounded 参数将 textheight 参数四舍五入到 \baselineskip 的整数倍加 \topskip\baselineskip 可以认为是行距,\topskip 为纸张可书写区域顶部空白。所以这个参数也很好理解:让文本区域的高度变成行距的整数倍防止可能出现的“underfull vbox”。如 \textheight 为 486pt,\baselineskip 为12pt,\topskip 为10pt,那么:
(39 \times 12pt + 10pt =) 478pt < 486pt < 490pt (= 40 \times 12pt + 10pt)
最终将会设置 \textheight 的值为 490pt。

可以看到通过使用 geometry 宏包,我们只需要使用简单的几条命令就可以直观的的设置我们的页面布局了。

在文档中改变页面布局

前面我们通过在导言区通过使用 \geometry{options} 参数可以轻松的设置全局的页面布局,有时候我们可能需要在我们的文档中间临时的修改某些页面的布局。在这种情况下,我们可能还会使用到的下面的命令:

\newgeometry{options} 在文档的中间改变页面布局。使用参数和 \geometry 相同,但它会禁止导言区中 \usepackage\geometry 指定的所有选项(跳过所有文档尺寸相关的选项,\negeometry命令不能设置文档尺寸相关参数)。\restoregeometry 命令则对应的恢复导言区指定的页面布局。这两个命令在调用时都会插入一个 \clearpage 命令来强制开始一个新的页面。

\savegeometry{<name>} 保留该命令所在页面的布局并命名为 <name>\loadgeometry{<name>} 加载名为 <name> 的页面布局。

上面这些命令在同一个文档多个页面布局以及多个页面布局交替复用时非常有用。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,080评论 19 139
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,827评论 1 92
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,824评论 1 45
  • 我的大学老师们 尊师重教是我们国家的优良传统,远在西周时期就有了“弟子事师,敬同于父...
    黄河歌者阅读 1,757评论 20 82
  • 时间在流逝,记忆在消退,唯有用笔将点点滴滴记录。 第一章 今天是开学第一天,佟佳诗一大早就起来开始收拾。 ...
    提心吊胆阅读 302评论 0 4