GSUB表格

GSUB

GSUB表處理字符的替換,最常用來建立歐文連字。

現代OpenType建議定義完整的字符對應關係,例如全半形之間的切換。另外,當字型備有多組數字(如等寬、比例寬、老式),也應定義相關GSUB功能來切換。

對中文處理來說,最重要的是直排形式(vert、vrt2)的設定。

主要的GSUB功能

功能名InDesign選單名稱(補充)Lookup方式(例)備註
ccmp字符組合與拆解4, 2強制性套用
liga連字4預設開啟但可關閉的連字
dlig任意連字4預設不開啟,使用者選用的連字
hlig歷史上的連字4
rlig強制連字4強制套用,阿拉伯文為主
tnum等寬表格數字1
pnum比例寬數字1
onum老式數字1
lnum等高數字1
afrc預組的分數字4如1/2切換成½
frac斜線任意分數4→6
dnom分母1與frac併用
numr分子1與frac併用
zero帶有斜線的數字零1
sups上標用字符1
subs下標用字符1
sinf科學用途下標字符1
ordn上標序數1
fwid等寬全形字符1
hwid等寬半形字符1
pwid比例寬字符1
qwid等寬四分字符1
twid等寬三分字符1
ital歐文義大利體1
nalt裝飾字符1, 3
swsh曲飾線字符1
titl標題用字符1
smcp小字大寫1
aalt所有異體字3, 7
salt預設異體字1通常建議等於ss01
ss01-ss20樣式集1
cv01-cv99異體字集1
case大寫替換字符6例如大寫用的連字號等
calt隨前後關係變化造型的字符6
vert直排用全形字符1直排
vrt2直排用旋轉字符1直排
trad繁體字 或 日文舊字體1, 3
smpl簡體字 或 日文新字體1, 3
hkna橫排用假名1
vkna直排用假名1
pkna比例寬假名1
ruby注音用字符1
expt專家字形1日文漢字規格
hojo輔助漢字1日文漢字規格
jp04JIS2004字形1日文漢字規格
jp78JIS78字形1日文漢字規格
jp83JIS83字形1日文漢字規格
jp90JIS90字形1日文漢字規格
nlck印刷標準字體1日文漢字規格
init語頭形1, 6, 8阿拉伯文
medi語中形1, 6, 8阿拉伯文
fina語尾形1, 6, 8阿拉伯文
isol孤立形1, 6, 8阿拉伯文

Lookup方式

編號名稱說明
1Single將1個字符替換成1個字符
2Multiple將1個字符替換成n個字符
3Alternate將1個字符替換成n個字符選項之一
4Ligature將n個字符替換成1個字符
5Context根據前後文替換多個字符
6Chaining Context根據連續前後文替換多個字符
7Extension Substitution擴充其他超過64K以上的替換表
8Reverse chaining context single根據連續前後文反方向替換多個字符

AFDKO語法

在AFDKO編寫GSUB語法時,要寫在 feature 區塊。並使用 substitute 指令,可簡寫為 sub。如:

feature liga {
    sub f i by f_i;
} feature liga;

LookupType 1 一對一

sub a by A.sc;                                           # 將 a 切換成 A.sc
sub [one.fitted one.oldstyle one.tab.oldstyle] by one;   # 各種 one.xxx 字符都切換成 one
sub [a - z] by [A.sc - Z.sc];                            # a 切換成 A.sc, b 切換成 B.sc, 依此類推

LookupType 2 一對多

sub i by idotless dotabove;            # 解開連字(通常用在ccmp)

LookupType 3 多選一

sub ampersand from [ampersand.ss01 ampersand.ss02 ampersand.ss03];   # 讓使用者手動選的異體字

LookupType 4 多對一

最一般的連字行為。

sub f i by f_i;

注意雖然規格上AFDKO建議字型軟體自動處理理想的排序,但實際上AFDKO與Glyphs本身不會自動排序,所以編寫時必須考慮指定執行的順序。

sub f f i by f_f_i;   # 這行要放在前面,不然下面兩個可能會優先生效
sub f f by f_f;
sub f i by f_i;

LookupType 6 前後文連鎖

只有在符合特定前後文時進行取代,要被取代的字符後方應加上 ' 符號以茲識別。

sub [a e n] d' by d.alt;    # ad, ed, nd 時的 d 顯示成 d.alt 字符

被取代的字可以不只一個,例如:

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

前後文連鎖取代的語法相當複雜,還可以配合lookup使用定義出更具彈性的取代行為。或是使用 ignore 指令忽略部分項目。請參考官方文件

LookupType 7 擴充

當區塊可能會超過64K時,加上 useExtension 字樣。

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

LookupType 8 反向前後文連鎖

指令改用 reversesubrsub,其他與LookupType 6相通。排版引擎會從最後方開始往前比對。

reversesub [a e n] d' by d.alt;

常見功能說明

vert, vrt2 直排

請參閱直排

分數

TBD