关键字 sub 用于声明替换(substitute)字形。正如所支持的替换类型章节所述,有几种不同的字形替换类型。替换字形只能在查询(lookup)中声明,不能在特征(feature)中直接声明替换。每个查询只能有一种类型的替换,这意味着如果您想在单个特征中使用几种替换类型,必须声明多个查询。
声明单个(类型 1)替换
lookup MyLookupTable {
sub A -> a.smcp;
}
声明多个(类型 2)替换
lookup MyLookupTable {
sub ffi -> f f i;
}
声明替代式(类型 3)替换
lookup MyLookupTable {
sub asterisk -> [asterisk asteriskmath uni2051 uni2042 uni203B uni273B];
}
声明连字(类型 4)替换
lookup MyLookupTable {
sub f f i -> ffi;
}
声明链式上下文(类型 6)替换
lookup MyLookupTable {
context (@<backtrackclasses>) @<inputclasses (@<lookaheadclasses);
sub 0 <substitution table>;
}
替换声明出现的顺序,也是支持 OpenType 布局特征的应用程序对其进行处理的顺序。这意味着在连字替换情况下:
lookup MyLookupTable {
sub f i -> fi;
sub f f i -> ffi;
}
上面语法与下面语法的效果不一样:
lookup MyLookupTable {
sub f f i -> ffi;
sub f i -> fi;
}
并且,后者的声明将得到正确的结果。为什么呢?在前者示例中,当遇到“f i”序列时,就先行以“fi”字符进行了替换,不再匹配“f f i”序列。在后者的示例中,“f f i”在“f i”之前进行匹配,结果与预期相一致。FontCreator 会自动处理正确的顺序,因此也无需担心。