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