斜体字形文字中的数学间距调整
强迫症患者的福音。

问题背景 

在 LaTeX 中,有时为了强调某段话,我们会使用意大利字形 (italic shape) 或倾斜字形 (slanted shape) 用以区分其他文字,再如定理类环境默认使用意大利字形。意大利体当然是一种美妙的字形,但是和数学环境混用会带来一个问题,即正文部分和数学环境间的间距会变得糟糕,这无疑会破坏文档的排版美观性。

以下是一个示例。第一行中的 U 和 V 是包裹在数学环境中的,第二行中的 U 和 V 则没有。可以很明显看到,第一行中的 U 和前面的 If 之间的间距太小,而和后面的 of 之间间距过大,同理 V 也是如此。但第二行看起来就正常很多。

给文字加上框之后我们可以更清楚地看到 LaTeX 分配给每个字符的空白空间,如下图所示。在第一行,数学环境中的 U 和 V 安分守己地待在框里,此时 LaTeX 没有对间距做任何调整。而在第二行,文字环境中的 U 和 V 则被放在了框的最右边,几乎都要挤出去了,此时 LaTeX 实际上给它们前面加了一些空间,后面则压缩了一些空间,这个操作被称为「字距微调」,英文叫做 kerning,是排版中的一项重要技术。

那么,为什么 LaTeX 没有对数学环境的前后间距做调整呢?这其实是数学字体本身的问题。数学字体是独立于正文字体的,它的 kerning 规则与正文字体不同,而且也不会考虑到和正文字体互动的情况。当用在意大利字形的正文字体中,由于正文字体的 kerning 变了,所以数学环境在其中会显得很不协调。

解决方案 

第一种也是最直接的方法,手动调整。这适用于需要调整的地方不多的时候。例如我们可以手动在数学环境前加上一些正间距,在其后加上一些负间距。我们用 \/ 取消正文中的倾斜校正 (italic correction) 所引入的间距,然后用 \! 在数学符号后添加一些负间距(等于 –0.16667em):

If\/ $U$\! of\/ $V$\! and \dots

得到的效果如下。这个看着就舒服多了。

但是,当需要调整的地方很多时,这种方法就显得过于繁琐。有没有什么自动化的调整办法呢?

有,是由 stackexchange 上的回答 给出的。这个解决方案相当技术化,它对每一个数学字体的英文字母都设计了 kerning。不过,这个解决方案也有局限性。首先,它只适用于 Computer Modern 字体,其次,它只适用于单个的英文字母,当数学环境中出现多个英文字母或其他的数学符号时,它就无能为力了。

第三种方案是我在咨询了 AI 之后得到的,也是目前我个人最满意的解决方案。这个方案的思路也很简单,将意大利体中出现的数学环境同意在前面加入一些正间距,在后面加入一些负间距。代码如下:

\let\math@org=$
\def\itinlinemath#1{%
  \math@org%
  \mkern+2mu\relax%     左间距调整
  #1%
  \mkern-2.5mu\relax%   右间距调整
  \math@org%
}

\begingroup
  \catcode`\$=13
  \gdef\activateitalicmath{%
    \catcode`\$=13%
    \def${\math@org}%
    \def$##1${\itinlinemath{##1}}%
  }
\endgroup

以下是解释。在第一段中,我们用 \let\math@org=$ 把行内公式切换符号 $ 保存到控制序列 \math@org 里。然后定义一个控制序列 \itinlinemath,它接受一个参数,在参数前面加上正间距,在参数后面加上负间距,最后再调用 \math@org 恢复原来的数学切换符。在第二段中,我们在一个局部分组里临时改 catcode 并定义宏 \activateitalicmath(定义本身用 \gdef 变成全局)。宏 \activateitalicmath 将临时改写 catcode 为 13 的 $ 为行内公式切换符,然后定义 $ 的替换为 \itinlinemath,即加了 kerning 的数学环境。注意,第一个 \catcode`\$=13 的作用是让 $ 变成一个 active character,这样我们才能写出 \def${...} 这样的定义。第二个 \catcode`\$=13 的作用是在正文里调用 \activateitalicmath 之后,从那一刻起后续文本中的 $...$ 都按 \itinlinemath 被解析。

随后,在任何我们想要调整字距的地方,我们都可以使用 \activateitalicmath 来激活这个 kerning 机制。得到的效果如下。

还是很不错的。感觉世界又更和谐了一些~


最后修改于 2026-01-14