電子媒介字體子集化的方法

本貼的靈感來自於 《教育部重編國語辭典修訂本》mdx版 - #20,来自 douglarek

字體子集化的現實意義:

  • 電子書(也包括其他的電子媒介如辭典)的一些特殊字非常規字體所涵蓋,需要內嵌字體,而這些字體往往很大;

  • 在移動設備上不像在PC上那麼易於安裝全局字體。

本貼無所謂教程,因爲過程太簡單。

但是本教程不是無門檻教程,需要具備以下技能

  • 知道什麼是終端(下文中凡是以 $ 開頭的都是需要在終端下執行的命令);
  • 知道怎麼安裝 python 環境,有使用 pip 安裝軟件的經驗;
  • 知道在終端執行命令;

拿 epub 電子書來說,一般的目錄爲:

$ tree -L 2
.
├── bitbucket-pipelines.yml
├── index.html
├── LICENSE
├── META-INF
│   ├── calibre_bookmarks.txt
│   └── container.xml
├── mimetype
├── OEBPS
│   ├── content.opf
│   ├── Fonts
│   ├── Images
│   ├── Styles
│   ├── Text
│   └── toc.ncx
└── README.md

6 directories, 9 files

我們的文本無外乎在幾個常規的模式文件下,那麼第一步就是提取需要子集化的文本

$ cat index.html OEBPS/content.opf OEBPS/toc.ncx OEBPS/Text/* > all.txt

第二步便是使用 fonttools 的 pyftsubset 進行字體子集化

  1. 安裝 pyftsubset

    $ pip install fonttools
    
  2. 子集化

    $ pyftsubset OEBPS/Fonts/NotoSerifTC-Medium.otf --text-file=all.txt --output-file=NotoSerifTC-Medium-min.otf
    

    解釋一下上面的參數:

    • OEBPS/Fonts/NotoSerifTC-Medium.otf 即爲你的原字體(可以不限於 otf、ttf、woff);
    • –text-file=all.txt 這裏的 all.txt 即第一步得到的需要子集化的文本;
    • –output-file=NotoSerifTC-Medium-min.otf 即爲子集化後的字體,也是本教程需要的產物。

Q&A:

  1. 子集化好是好,如果我需要的字在子集化後的字體裏沒有了怎麼辦呢?

    答:這個問題其實很簡單,藉助工具就好了,寫一個腳本,在腳本裏面做你的電子書或者辭典的打包即可,原字體還是你本身的字體,只是打包的時候用子集化的字體即可,即你的產出字體應該是子集化後的字體。

5 Likes