符号条带：如何对齐 Oʻ 和 Gʻ · Ipak

> 为什么 GʻALLA 一词里会出现窟窿，以及我们如何教会字体只在符号所在的位置测量间距。

[Oʻzbekcha](https://ipak.xronocode.com/jarayon/mark-band/index.md) · [English](https://ipak.xronocode.com/en/jarayon/mark-band/index.md) · [Русский](https://ipak.xronocode.com/ru/jarayon/mark-band/index.md) · [Español](https://ipak.xronocode.com/es/jarayon/mark-band/index.md) · [Português](https://ipak.xronocode.com/pt/jarayon/mark-band/index.md) · [中文](https://ipak.xronocode.com/zh/jarayon/mark-band/index.md)

[制作过程]

# 符号条带：如何对齐 Oʻ 和 Gʻ

为什么 GʻALLA 一词里会出现窟窿，以及我们如何教会字体只在符号所在的位置测量间距。

符号 ʻ 很小。它立在上方，处于大写字母上部三分之一的高度，而它下面直到行线全是空白。只要符号被圆形字母围着，这几乎看不出来。但把它放到 G 和 A 之间——**GʻALLA** 一词里就出现窟窿。

这篇文章讲我们在工作字体 Ipak Davlat 里如何解决它，以及为什么常用的对齐方法在这里不起作用。针对单个字母对的间距修正称为紧排。

![GʻALLA MAʼNO：未加我们的紧排与加上之后](https://ipak.xronocode.com/images/p/mark-band/kern-before-after.png)

*Ipak Davlat Regular 中的 GʻALLA MAʼNO：未加我们的紧排与加上之后。 Ipak；用 HarfBuzz（hb-view）排出：未加我们紧排的 Ipak Davlat Regular 构建与最终构建；字体——SIL OFL 1.1 · CC BY 4.0 · Ipak*

## 窟窿从哪里来

看图片的上一行。符号 ʻ 离 G 有一段距离，然后到 A 还有另一个空隙。A 上部尖细，也放出很多空气。三片空白叠成一片，词就断成“G”和“ʻALLA”。

MAʼNO 里的图提克符号 ʼ 也一样：A 的右上开放，ʼ 很窄，N 以竖笔画开头。A 与 N 之间形成的缝，比这个词里任何两个字母之间都宽。

type.today 的综述警告过乌兹别克排版中的这个问题：O 或 G 与符号 ʻ 之间的间距不能太大，否则文本里会出现窟窿。

**说明.** 图提克符号（tutuq belgisi，ʼ，U+02BC）是乌兹别克拉丁字母的分隔符号。按1995年正字法规则（第32条），它表示前面的元音读得长，或者它后面的元音与前面的辅音分开读：maʼno、taʼlim、sanʼat。符号 ʻ（U+02BB）是字母 Oʻ 和 Gʻ 的组成部分。按 Unicode，两者都是修饰字母，不是引号。

## 通常怎么定间距

我们为 Ipak 写的字对检验程序，工作方式与自动“间距器”——排边距的程序——相同。把一对字母从基线到大写顶切成一条条水平的行。在每一行里量左字母右缘到右字母左缘的空白距离。所有行的平均值就是这对的视觉间距。说“视觉”，是因为这是眼睛的评价，而不是尺子的。

深的凹处，比如 L 的内部或 A 的横梁下方，会被截掉：眼睛不会把它们看到底。

基准是 HH 这一对的间距。两根笔直的竖笔画是最简单的情况，而基础字体的边距我们认为是正确的。

## 为什么这对符号不起作用

符号只占行高的上部。它下面什么都没有。如果按整个高度量，平均值里会混进符号下方的大片空白。算法看到“巨大的间距”，就把符号死死推近，甚至推到相邻字母底下。

我们的第一个版本就是这样：符号压到了 A 上。我们放松规则——符号又“跳”了过去：紧贴 A，被读成 A 的一部分，而不是 G 的一部分。读者看到的是“G ʻA”。

两个错误出于同一个原因：间距是在符号不在的地方量的。

## 符号条带

解决办法是只在符号确实所在的那条带里测量。Ipak Davlat 的符号 ʻ 占大写高度最上面的38%。我们就取这条带。

![符号条带：大写高度最上面的38%](https://ipak.xronocode.com/images/p/mark-band/band-diagram.png)

*符号条带：大写高度最上面的38%。字母与符号之间的间距只在这条带里测量。 Ipak；Ipak Davlat Regular，按字体度量标注；字体——SIL OFL 1.1 · CC BY 4.0 · Ipak*

在这条带里看到的就是眼睛在符号高度上看到的：G 的右缘、符号本身、A 的左缘。符号下方的空白不进入计算。

对小写字母，条带更宽：从小写 x 高度的一半到大写顶。小写更低，符号在它们上方探出更多。

## 不对称的规则

第二个发现：符号两侧需要不同的间距。

**ʻ 属于 O 和 G。**它不是独立的字符，而是字母的一部分。所以对着它们符号要放得紧：目标是 HH 常规间距的0.45。而到下一个字母——常规间距，1.0。这样 Gʻ 读作一个字母，符号不会“跳”向 A。

**ʼ 分隔音节。**它不属于谁：既不是左边字母的，也不是右边的。所以它站在正中，两侧各为0.8的间距。

还有两个限制防止极端情况。在最窄处，符号与邻居不小于0.4的 HH 间距。而字体里任何一对都不小于字号的5%，这是防触碰保护。字号是字体的大小；字号的5%，对10厘米高的字母来说就是5毫米。

我们在符号条带内、以 HH 间距为单位测得的修改前后数值（Ipak Davlat Regular）：

| 字对 | 未加我们的紧排 | 加了以后 |
| --- | --- | --- |
| G → ʻ | 1.16 | 0.69 |
| ʻ → A | 1.12 | 0.99 |
| A → ʼ | 1.21 | 0.80 |
| ʼ → N | 1.10 | 0.81 |

G 和符号没有达到0.45的目标——防触碰保护拦住了。这是有意的：宁可略松，也不要小字号下的粘连。

**说明.** 紧排是针对具体字符对的间距修正。它存在字体文件内部、在 GPOS 服务表（它负责字符的位置）里，并自动生效：排版程序不需要做任何设置。我们的修正作为单独的块加在基础字体的紧排上，不改动 Overpass 原有的字对。

## 西里尔字母：同样的逻辑，另一个基准

工作的另一半是西里尔字母。在 Overpass 里它几乎没做过紧排：ГЛ、ТЛ、УА 排得松散，Қ Ғ Ҳ 则根本没有修正。

这里我们把 Ipak Davlat 与五款专业开放字体比较：Fira Sans、Inter、Noto Sans、Onest 和 IBM Plex Sans。重要的声明：它们的紧排数值我们没有照搬。我们测量的是每款字体把一个字对排得相对于自己的 HH 有多紧，取中位数，再把 Ipak Davlat 调到它。中位数是数列的中间：一半字体排得紧，一半排得松。它不让一款与众不同的字体带偏结果。

![西里尔字母的乌兹别克语词：基础字体的紧排与我们的](https://ipak.xronocode.com/images/p/mark-band/cyrillic-before-after.png)

*西里尔字母的乌兹别克语词：基础字体的紧排与我们的。 Ipak；用 HarfBuzz（hb-view）排出；字体——SIL OFL 1.1 · CC BY 4.0 · Ipak*

两条规则简化了工作。

**双胞胎。**与拉丁字母同形的西里尔字母（А、В、Е、К、М、Н、О、Р、С、Т、Х）的排法与拉丁字母相同。КА 这一对等于 KA 这一对。否则同一个词在两种文字里会显得不一样。

**尾巴。**带行线下方尾巴的字母——Қ、Ҳ、Ц、Щ——按它的基础字母排：Қ 按 К，Ҳ 按 Х。尾巴躺在行线以下，不进入间距。

这里出了一个错，是在检验时发现的。防触碰保护起初只量行线以上，Қ 和 Ҳ 的尾巴几乎碰到旁边的 А。测量范围向下扩到尾巴，问题就消失了。

结果：Regular 里784对，Bold 里802对。详细的“前/后”试印在下面。

![装配产出的“前/后”工作试印](https://ipak.xronocode.com/images/p/mark-band/davlat-proof-regular.png)

*装配产出的“前/后”工作试印：带符号的拉丁字母和西里尔字母，大写与小写。 Ipak；装配的工作试印；字体——SIL OFL 1.1 · CC BY 4.0 · Ipak*

## 关于触碰的争论

检验时有一条意见：Gʻ 中的符号几乎贴住 G，约1%字号。如果这被证实，字体就不能发布。

我们按轮廓核对：把这一对渲染成点阵图，字号等于2000点，测量 G 与符号“墨迹”之间的最短距离。结果是 Regular 145单位、Bold 119单位——即字号的7.3%和6.0%。用另一种方式做的独立测量给出了7.8%和7.0%。意见本身提出的阈值是60—80单位，结果富余地满足。意见被用数字驳回。符号靠近 G 在这里不是错误：这是有意的，为的是让 Gʻ 读作一个字母。

## 由此得出什么

符号 ʻ 不是引号，也不能按引号对齐。三条结论，任何为乌兹别克语做字体的人都会用到：

间距要在符号所在的地方量，而不是在整个行高上量。

ʻ 靠向自己的字母，ʼ 站在正中：规则是不对称的。

防触碰保护比好看的数字重要：小字号下，粘连比多余的空白更糟。

## 来源

关于 O/G 与 ʻ 之间空隙的建议——А. Шайдуллина，type.today，04.12.2023。

U+02BB 和 U+02BC 的名称与编号——Unicode 表 Spacing Modifier Letters。

kern 特性的说明——OpenType 规范，Microsoft Typography。

方法与数字是我们的：测量经 HarfBuzz 和 FreeType 在 Ipak Davlat v0.1 构建上完成，2026年10月。

参照字体：Fira Sans、Inter、Noto Sans、Onest、IBM Plex Sans（均为 SIL OFL 1.1）。

链接：

А. Шайдуллина. Uzbek. type.today, 04.12.2023. [https://type.today/en/journal/uzbek](https://type.today/en/journal/uzbek)

Unicode: Spacing Modifier Letters (U+02B0–U+02FF). [https://www.unicode.org/charts/PDF/U02B0.pdf](https://www.unicode.org/charts/PDF/U02B0.pdf)

OpenType：kern 特性（Microsoft Typography）。 [https://learn.microsoft.com/en-us/typography/opentype/spec/features_ko](https://learn.microsoft.com/en-us/typography/opentype/spec/features_ko)

HarfBuzz——文本排版引擎。 [https://harfbuzz.github.io/](https://harfbuzz.github.io/)

Fira Sans. [https://github.com/mozilla/Fira](https://github.com/mozilla/Fira)

Inter. [https://github.com/rsms/inter](https://github.com/rsms/inter)

Noto Sans. [https://github.com/notofonts/latin-greek-cyrillic](https://github.com/notofonts/latin-greek-cyrillic)

Onest. [https://github.com/simpals/onest](https://github.com/simpals/onest)

IBM Plex. [https://github.com/IBM/plex](https://github.com/IBM/plex)

---
页面: https://ipak.xronocode.com/zh/jarayon/mark-band/ · SIL Open Font License 1.1 · avenex@xronocode.com
