用METAFONT做字體的一些感受(2022/06/14)
最近在做的一個(gè)字體項(xiàng)目里面用了METAPOST畫圖。這東西的核心算法和METAFONT是一樣的,區(qū)別只在于METAPOST出的是矢量圖,且去掉了一些輸出字體相關(guān)的代碼。
使用METAPOST的感覺就是,這東西上來直接學(xué)會(huì)非常難受。但是如果用過字體編輯軟件,就會(huì)發(fā)現(xiàn)METAPOST非常好用。這個(gè)好用,雖然大部分是邏輯上的,但是在琢磨透了之后,會(huì)發(fā)現(xiàn)邏輯想象和最后等視覺呈現(xiàn),差異不大。這在LaTeX中都很難做到。
字體的數(shù)字化呈現(xiàn),最早是點(diǎn)陣(bitmap)。后來隨著PostScript和TrueType的出現(xiàn),變成了矢量描述形式的。
但是,套用一下編譯原理的術(shù)語體系,設(shè)計(jì)層面的東西,屬于前端,PostScript/TrueType屬于中端,bitmap屬于后端。
而METAFONT體系的東西,屬于前端和中端的復(fù)合體。
前幾年,OpenType更新specification,把AAT中的Variable Font加進(jìn)去了。當(dāng)時(shí)有幾篇英語的文章就提了METAFONT幾次。中文的文章,也亦步亦趨地翻譯過來。
但是呢,在互聯(lián)網(wǎng)上寫博客的,說這倆都沒說明白。
當(dāng)然,我在這也說不明白,因?yàn)檫@倆東西的細(xì)節(jié),需要寫50張以上的A4紙。我能說的只是感覺和一些體會(huì)。
感覺的第一個(gè),就是Variable Font不是什么復(fù)雜的技術(shù),就是圖形學(xué)中常見的插值算法。這些個(gè)算法可以通過METAFONT定義宏來模擬出來。
更重要的區(qū)別,也是本質(zhì)的區(qū)別,就是METAFONT可以定義pen結(jié)構(gòu),這是一種凸多邊形的描述結(jié)構(gòu)。這個(gè)pen可以沿著貝塞爾曲線移動(dòng),進(jìn)而填充出包絡(luò)(envelop)。這個(gè)包絡(luò)相當(dāng)于現(xiàn)在的字體中填充了的contour的概念。
第三點(diǎn),就是METAFONT中的向量和標(biāo)量運(yùn)算功能十分豐富。雖然,我依然不太滿意,寫了一些新函數(shù)(中間使用了maxima運(yùn)算)。這一點(diǎn)就導(dǎo)致了,在設(shè)計(jì)字形的時(shí)候,向量運(yùn)算非常重要。這些運(yùn)算功能,也不完全是聲明式的,能用等式推導(dǎo)出來。這個(gè)特性在設(shè)計(jì)字形的時(shí)候,可以聚焦于局部的特征。
第四點(diǎn),就是METAPOST中存在貝塞爾曲線的自動(dòng)推導(dǎo)。這個(gè)算法,形象一點(diǎn),就像吹氣球一樣,把輪廓填充得很圓滑。不過,這個(gè)算法是半自動(dòng)的,比如說可以通過角度控制(畢竟對(duì)于設(shè)計(jì)師來說,具體的參數(shù)點(diǎn)對(duì)他們來說屬于無意義的)。當(dāng)然,直接丟控制點(diǎn)進(jìn)去也可以出曲線。這個(gè)算法的推導(dǎo),需要做一些練習(xí)才能理解。
雖然在TeX社區(qū)里面,METAFONT的用戶并不多,甚至METAPOST是定義為畫圖的,但是這個(gè)東西確實(shí)很重要。學(xué)習(xí)起來難度是不小,但是還是可以學(xué),學(xué)起來大有好處。學(xué)不起來,那就很可能是方法和場(chǎng)景不匹配。