字母间距到底发生了哪些变化?

字母间距到底发生了哪些变化?

所有主流引擎(pdfTeX、XeTeX 和 LuaTeX)都支持字母间距,当然原始 TeX 除外。LaTeX 用户可以通过更高级别的接口访问字母间距。例如,包microtype(pdfLaTeX) 和fontspec包 (XeLaTeX、LuaLaTeX)。

但是字母间距到底发生了哪些变化?此外,这些变化似乎依赖于引擎:pdfTeX、XeTeX 和 LuaTeX 都在做自己的事情。


为了说明,我将使用 XeTeX 下的一个例子。在原始级别,通过为键指定数值来添加字母间距letterspace

\font\1="[texgyretermes-regular.otf]" at 10pt % no letterspace
\font\2="[texgyretermes-regular.otf]:letterspace=5" at 10pt % add 5% em of letterspace

fontspec用户将会做类似的事情\setmainfont{TeX Gyre Termes}[LetterSpace=5]

给定一个单词(连续的字形),XeTeX 将在字形之间插入字母空格之内单词(同时尊重字距和连字),但不会在两个边界(该单词的两端)插入字母空格。但是,XeTeX 也会改变常规空格的宽度,这样单词之间的粘合项就增加了字母间距量(更准确地说,自然宽度组件也增加了这个量)。考虑以下文本字符串VAT fire

On input:
  <char V> <char A> <char T> <space> <char f> <char i> <char r> <char e>

Rendered via font and XeTeX:
  <glyph V> <implicit kern> <glyph A> <implicit kern> <glyph T>
  <glue with natural width, stretch, and shrink>
  <glyph ligature f_i> <glyph r> <glyph e>

What do letterspace change?
  <glyph V> <implicit kern> <glyph A> <implicit kern> <glyph T>
                   ↑                         ↑
               add 5% em                 add 5% em
  <glue with natural width, stretch, and shrink>
                   ↑           ↑           ↑
               add 5% em, and proportionally here
  <glyph ligature f_i> <glyph r> <glyph e>
                      ↑         ↑
                  add 5% em, and here

但是,如果我们将空格视为字符/字形而不是粘合剂,那么在空格中添加两倍的字母空间就更有意义了,对吗?

Should space get one extra letterspace amount, or twice the amount?
  ... <glyph T> <space> <glyph ligature f_i> ...
               add 5% em
versus
  ... <glyph T> <space> <glyph ligature f_i> ...
               ↑       ↑
           add 5% em, and here

以下是支持我观察的纯 XeTeX 代码

\font\1="[texgyretermes-regular.otf]" at 10pt % no letterspace
\font\2="[texgyretermes-regular.otf]:letterspace=5" at 10pt % add 5% em of letterspace

\hbox{\1VAT fire (no letterspace)}
\hbox{\2VAT fire\1 (add 5\%\,em letterspace)}

% The effect of letterspace on words (glyph runs)
\setbox0\hbox{\1fire}
\setbox2\hbox{\2fire}
\hbox{\1\unhcopy2 \ is wider than \unhcopy0,
\the\numexpr(\wd2-\wd0)*100/\dimexpr1em\relax\relax\%\,em wider;
since there are two spots to add letterspace.}

% The effect of letterspace on space
\setbox0\hbox{\1 }
\setbox2\hbox{\2 }
\hbox{\1\vrule\unhcopy2\vrule\ is wider than \vrule\unhcopy0\vrule,
\the\numexpr(\wd2-\wd0)*100/\dimexpr1em\relax\relax\%\,em wider.}

\bye

字母空间


对于 LuaTeX(我不熟悉),用户通过 访问字体luaotfload。之前luaotfload v2.96, letterspace 是不是改变字间距的宽度。 之后luaotfload v2.96, letterspace 改变字间距:

这与 XeTeX 的行为一致(并且拉伸量应该相似)。——§ kernfactor 和 letterspace,luaotfload 文档

相关内容