微排版 (microtype)

microtype 是让两端对齐段落明显更美观的宏包。作者是 R. Schlicht。它做的事并不张扬:把标点稍稍伸出页边,把字形宽度按百分之零点几伸缩。这些调整乍看几乎不可见,但放到整页上,右边缘会更齐,词间距更均匀,白色“河流”和溢出行也会减少。通常只需加一行 \usepackage{microtype}。本页依次介绍 protrusion、expansion、tracking 和其他功能,并说明关键点:可用功能取决于引擎。

microtype 是什么

TeX 本来就能排出好看的版面,但 microtype 在其上再加一层微观排版(micro-typography):作用在单个字符和字符间隙层面的细部修饰。这些功能最初由 pdfTeX 引入,后来部分扩展到 LuaTeXXeTeXmicrotype 是它们的统一 LaTeX 接口,用来提升西文(拉丁文字)文本的观感。

它提供的主要功能如下。前两个——protrusionfont expansion——是核心;只要能安全使用,就会默认启用。其余功能按需要通过选项开启。

  • 字符 protrusion(margin kerning):把标点和部分字母稍稍推出页边,使文本边缘在视觉上变直。
  • 字体 expansion:把每行的字形宽度略微伸缩,减少词间距伸缩,使段落“颜色”更均匀。
  • Tracking / letterspacing(\textls):均匀拉开一个词或一段文字的字母间距,适合大写字母和小型大写。
  • 禁用连字(\DisableLigatures):按字体关闭连字;对打字机字体等很有用。
  • 词间距和额外 kerning 调整:spacing / kerning 选项(仅 pdfTeX)。

注意,这些是针对西文(拉丁文字)的精修。日文有自己的排版模型,例如行首/行尾禁则、日西文间距等,与 protrusion 和 expansion 不同,由 luatexja 等工具处理。更基础的西文自动处理,如连字和 kerning,另见姊妹页面“Writing Western text”。

字符 protrusion

Protrusion(也叫 margin kerning)会让行首或行末字符稍稍越过页边。原因是视觉错觉。句号、逗号、连字符,或像 oAv 这样具有圆形或倾斜轮廓的字母,如果精确贴齐文本边缘,字形两侧的留白会让边缘看起来向内凹。让这些字符略微突出,文本块边缘在视觉上就会显得笔直。

把行末标点完全推入页边,是熟知的 hanging punctuation。可以把 microtype 的 protrusion 理解为按字符选择合适幅度、更克制地做同一件事。它对标点以及面积较小或轮廓不平直的字母最明显。Protrusion 可用于三大主要引擎:pdfTeX、LuaTeX 和 XeTeX 都支持。

Protrusion 会自然作用于连续段落,但在 TeX 不认为有“页边”的地方不起作用,例如 itemizetabular 内部。若要让这些位置的首尾字形突出,microtype 提供了 \leftprotrusion / \rightprotrusion(这种精细控制需要 e-TeX 扩展)。

字体伸缩(font expansion)

Font expansion 会把每行字形在水平方向上极小幅度拉伸或压缩(通常从百分之零点几到几个百分点),以配合行宽。在两端对齐中,通常靠伸缩词间胶(interword glue)来达到行宽;如果字形宽度本身分担一部分调整,词间距的伸缩就可以更小。结果是各行词间距差异减少,段落整体的“颜色”更均匀。

实际好处之一是 overfull / underfull box(溢出和间距过松警告)会减少,版面会更顺滑一档。可以用 stretch / shrink 选项调上限,用 step 调粒度,但先用默认值通常没有问题。

关键是,expansion 只在 pdfTeX 和 LuaTeX 中可用,在 XeTeX 中不可用。 在 XeTeX 下加载 microtype 时,protrusion 和 tracking 仍会生效,但 expansion 会自动关闭(不会报错,因为包只启用能安全运行的功能)。如果想要包含 expansion 的完整效果,正确做法是改用 LuaTeX。

Tracking 与 letterspacing

Tracking(letterspacing)是均匀扩大字母间距的调整。microtype 的 tracking 不是在字符之间插入空白,而是通过扩展字体自身的字形间距实现,因此不会破坏断词。这样就避免了手动在词中散布 \kern 的传统做法的弱点(那会阻止该词断开)。

临时 letterspacing 可用 \textls{...}。无论是否开启 tracking 选项都能使用,甚至在数学模式中也可用。间距量以千分比表示(默认约为 100/1000),可像 \textls[200]{...} 一样在可选参数中指定。若要应用到后续一段连续字符,可用 \lsstyle,直到当前分组结束都会保持 letterspacing。对于标题等不想在前后额外加 kerning 的地方,带星号的 \textls*{...} 很方便。

若要对整个字体集合统一设置,可在导言区写类似 \SetTracking{encoding=*, shape=sc}{40}(此例把小型大写拉开 40/1000)。需要注意:小写字母 letterspacing 传统上被认为不好看microtype 手册本身也说,原则上只应对大写字母或小型大写做 letterspacing。Tracking 可用于 pdfTeX、LuaTeX 和 XeTeX。

document.tex
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{microtype}
% space out small caps by 40/1000 wherever they appear
\SetTracking{encoding = *, shape = sc}{40}
\begin{document}
\textsc{Small Caps}, and ad-hoc \textls[200]{LETTERSPACED} capitals.
\end{document}

其他功能与设置

除此之外,microtype 还能控制连字、额外 kerning 和词间距。要禁用连字,使用 \DisableLigatures。例如 \DisableLigatures{encoding = T1, family = tt*} 会关闭 T1 编码中打字机字体族的连字,适合展示代码时不希望 -- 合成为 en dash 的场景。不过要注意,禁用某个字体的全部连字也会同时关闭该字体的 kerning。 若在可选参数中列出连字起始字符,如 [?,!],则只禁用所选连字。此命令只能在导言区使用一次

kerningspacing 选项分别启用额外 kerning词间距微调,但它们仅限 pdfTeX(在 LuaTeX 或 XeTeX 中不起作用)。二者默认关闭,只在需要时像 \usepackage[kerning=true,spacing=true]{microtype} 这样显式启用。

加载后若要改变设置,使用 \microtypesetup{...}。例如只在生成目录时关闭 protrusion,可前后分别写 \microtypesetup{protrusion=false}\microtypesetup{protrusion=true}。若要让文档某一部分使用不同设置,可用 \microtypecontext{...}(或 microtypecontext 环境)切换上下文。传入 draft 选项会整体禁用微观排版,便于前后对比。

各引擎支持情况

能使用哪些功能取决于 TeX 引擎microtype 会自动只启用在当前引擎上能安全运行的功能,所以无选项加载不会报错;但知道哪些生效、哪些不生效很有帮助。需要记住两点:XeTeX 不支持 expansion词间距和额外 kerning 仅限 pdfTeX

功能pdfTeXLuaTeXXeTeX
protrusionProtrusion
expansionFont expansion
trackingTracking(letterspacing)
ligatures禁用连字
kerning额外 kerning
spacing词间距调整

总之,功能最全的是 pdfTeX(protrusion + expansion + tracking + kerning + spacing);其次是 LuaTeX(protrusion + expansion + tracking,但无 kerning / spacing);XeTeX 只有 protrusion 和 tracking(无 expansion)。

用法与示例

基本用法只是一行 \usepackage{microtype}。这会默认启用 protrusion 和 expansion(如果引擎支持),多数文档都会因此明显变好。microtype 稳定且几乎没有副作用,加入它很少会带来麻烦。认真排西文时,它事实上是标准动作,几乎是必需的质量提升。通常会与 fontenc 搭配使用(pdfTeX 系列中用 [T1])。

下面是稍微进阶的导言区示例。它显式启用 protrusion 和 expansion(activate),用 \SetTracking 轻微拉开小型大写,并只对显示代码用的打字机字体族禁用连字。顺着注释看,就能明白各选项的作用。

document.tex
\documentclass{article}
\usepackage[T1]{fontenc}
% protrusion + expansion explicitly on; "final" forces them in draft mode too
\usepackage[activate={true,nocompatibility},final]{microtype}
% letterspace small caps a little (40/1000)
\SetTracking{encoding = *, shape = sc}{40}
% in code, keep "--" as two hyphens (also turns off kerning for this font)
\DisableLigatures{encoding = T1, family = tt*}
\begin{document}
Justified paragraphs look more even, \textsc{small caps} are gently
letterspaced, and \texttt{a--b} stays as two hyphens in code.
\end{document}

这些微调很克制,第一眼可能看不出来。但翻过几页,你会发现右边缘更稳定,词间距更平静,断词和溢出也更少。作为最后一道润色,microtype 很值得放进工具箱。