iT邦幫忙

2023 iThome 鐵人賽

DAY 17
1

LookupType 6: Contextual substitution

由於 LookupType 5 算是 LookupType 6 的子集功能,因此這裡一起講解。Contextual substitution 可以說是最複雜的替換類別。

對於像是 calt 這類只在符合特定前後文時進行取代的 feature,我們必須枚舉所有的可能性,並在要「被取代」的字符後方加上 ' 符號,讓 OpenType 知道該字符是要被替換的對象。舉例來説,以上次我們提到的 gj 字符對,便需要枚舉,並且指定後面的 j 進行替換:

feature calt {
    sub g j' by j.alt;    # 出現 gj 時,將後面 j 顯示成 j.alt 字符
} clat;

而被取代的字也可以不只一個,例如將 etc 替換成 &c

feature calt {
    sub e' t' c by ampersand;   # etc 連續出現時,將 et 取代成 ampersand 字符
} calt;

Ignore 例外處理

上下文取代的語法可以組合成相當複雜的樣子,還可以配合 ignore ,針對某些特例的上下文,選擇性的忽視某些通則。

以上次提到的將錯字「尋(uni5C0B)問(uni554F)」轉成「詢(uni8A62)問」來說,我們先寫出規則,指定當「尋問」二字連續出現時,將前面的 替換成 ,但同時,我們又必須避開「千尋問鍋爐爺爺...」這樣的規則,因此我們再次枚舉出「千(uni5343)尋(uni5C0B)問(uni554F)」這樣的省略規則:

feature calt {
    ignore substitute uni5343 uni5C0B' uni554F;
    substitute uni5C0B' uni554F by uni8A62;
} calt;

如此一來,尋問 二字就會替換成 詢問,但如果前面出現 字時,feature 就會省略掉這串字符,讓文字保持著原本的樣子。

LookupType 7 擴充

當使用的規則可能會超過 64K 時,可以加上 useExtension 字樣進行擴充。

feature aalt useExtension {
    feature salt;
    feature smcp;
    substitute d by d.alt;
   
    # ... other rules
} aalt;

LookupType 8 反向前後文連鎖

將原本的 substitute (sub) 指令改用 reversesubrsub,其他的觀念都和 LookupType 6 相通。

對排版渲染引擎來說,會從一個詞的最後方開始往前比對。通常用於處理阿拉伯文的 initmedifinaisol 特性——同一個字在一個詞的不同位置,會有不同的樣子,置於詞首、詞中、詞尾、或是單獨存在時都長得不一樣,這部分是漢字文化圈的我們比較難以想像的。


上一篇
DAY 16|AFKDO (2):LookupType 4
下一篇
DAY 18|OpenType Color Font:宗教組織
系列文
一起成為新世紀文字藝術師:深入玩轉 Unicode 和 OpenType30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言