教程 OpenType 分数
No.02 OpenType Fractions

使用反向链式替换 实现分数

使用 rsub 在 OpenType 字体中实现精准的分数排版,提升分数格式化质量,同时不影响非分数文本。

教程序号: 02-Fractions
官方原文: high-logic.com
内容状态: ✅ 基于完整内容创建

在 OpenType 字体中实现分数

分数在排版中对于显示数学表达式、测量值等至关重要。OpenType 字体中的 frac 功能用"常用"(对角线)分数替换由斜杠(U+002F)或分数斜杠(U+2044)分隔的数字(数字)。

实现分数的常用方法

实现 frac 功能的更常用方法之一如下:

@figures = [zero one two three four five six seven eight nine];
@figuresNumerator = [zero.numr one.numr two.numr three.numr four.numr five.numr six.numr seven.numr eight.numr nine.numr];
@figuresDenominator = [zero.dnom one.dnom two.dnom three.dnom four.dnom five.dnom six.dnom seven.dnom eight.dnom nine.dnom];
@slash = [slash fraction];

feature frac {
    sub @figures by @figuresNumerator;
    sub [@slash @figuresDenominator] @figuresNumerator' by @figuresDenominator;
    sub slash by fraction;
} frac;

常用方法的问题:

虽然这种方法有效地格式化分数,但它可能会无意中影响文本块中的非分数数字和斜杠。例如:

1/2 123/456 4 5/8 m/s
常用方法问题

潜在问题:

  • "m/s" 中的斜杠将被分数斜杠替换。
  • 不打算作为分数一部分的数字(如 "4")将被转换为分子形式。
  • 这会导致错误的渲染并影响可读性。

使用反向链式单个替换(rsub)的新方法

为了解决这些问题,我们可以使用更精确的方法,仅影响实际分数,而保持文本的其他部分不变。一种有效的方法是使用 GSUB LookupType 8(反向链式上下文单个替换),这是我们在 2021 年 6 月 开发的技术。

这是建议的解决方案:

@figures = [zero one two three four five six seven eight nine];
@figuresNumerator = [zero.numr one.numr two.numr three.numr four.numr five.numr six.numr seven.numr eight.numr nine.numr];
@figuresNumeratorEx = [fraction @figuresNumerator];
@figuresDenominator = [zero.dnom one.dnom two.dnom three.dnom four.dnom five.dnom six.dnom seven.dnom eight.dnom nine.dnom];
@figuresDenominatorEx = [fraction @figuresDenominator];

feature frac {
    sub @figures slash' @figures by fraction;
    rsub @figures' @figuresNumeratorEx by @figuresNumerator;
    sub @figuresDenominatorEx @figures' by @figuresDenominator;
    sub @figures space' @figuresNumerator by space.frac;
} frac;
新方法结果

新方法的优势:

  • 上下文精度:
    • 仅影响作为实际分数一部分的数字和斜杠。
    • 保持文本中的其他数字和斜杠不变。
  • 保留非分数内容:
    • 像 "m/s" 这样的单位保持正确格式。
    • 不打算作为分数的数学表达式或测量值按预期显示。

优势总结

  • 避免意外替换:
    • 常用方法会更改所有数字和斜杠,这在连续文本中可能有问题。
    • 新方法有选择地应用替换,提高排版准确性。
  • 增强可读性:
    • 读者可以正确解释测量值和单位而不会混淆。
    • 分数被适当格式化而不影响周围文本。
  • 改善用户体验:
    • 打字员和设计师可以输入文本而不必担心错误的字形替换。
    • 字体行为可预测,这对于专业排版至关重要。

最终思考

使用 rsub 实现 frac 功能在处理现实世界的文本场景方面提供了显著优势。通过仅在需要的地方应用替换,我们保持文本的完整性并增强字体的整体排版质量。