Python字體

使用程式協助字體補字

為什麼要學這個?

原本純手工在做的事情,改用程式來幫忙,減少自行比對既有文字元件的時間。

透過程式自動補出來的字,大多都很醜,而且不太平衡,重複去使用的已有的部件,在使用上還是不太方便,因為多多少少,會略大或略小一點,不太合身。

目前的程式是還有很多可以改進的空間,應該是可以挑出較適合的部件,目前沒有計劃去改進這部份的程式,因為效益不大,對於實際補字的進度幫助是有,但不大。

在自動配對補字時,預設會產生一個 compose.log 的檔案,這個檔案的參考價值就比較高,會列出自動去配對的過程,這時手動(用人工的肉眼)去挑選適合大小的部件,就比較容易配對出平衡的新字。也可以服用 format_compose.py 的指令,來格式化 compose.log 檔,應該也會有助於補字。

最後還是比較建議使用 AI 去學習,對於在創作一個新字時,每個部件的位置及大小的微調,參考性佳!


使用限制

自動補字的限制很多。

  • 目前版本的程式無法處理筆畫相連的字,當然組合出來的字,也會因為無法筆畫相連,而造成中宮偏鬆。
  • 部件大小和位置的問題,以部首來來,筆畫較多時,部首會較小,筆畫較少時,部首會較大,目前版本的程式對這部份還沒有處理。

前置準備

使用前,需要先安裝FontForge,把要處理的字體先存成.sfdir 的資料夾格式。

FontForge執行檔下載:
https://fontforge.org/en-US/

Max腳本檔案,使用程式協助補字程式下載:
https://github.com/max32002/MaxFontScripts/blob/master/auto_compose_glyph.py

https://github.com/max32002/MaxFontScripts/blob/master/format_compose.py

簡易中文字典檔案下載:
https://github.com/max32002/chinese_dictionary
附註:我們使用的是 Dictionary_lite.json 簡易版的字典檔


文字集合範本 (import_chars_sample)

在github MaxFontScripts 專案的 import_chars_sample 目錄下,附上4個,以 Enter 為分隔符號用的常用字集合。

  • chars_4K_ROW.txt 台灣教育部設定的常見 4千字。
  • chars_5401_cht_ROW.txt Big5 常用漢字 5401字
  • chars_10K_ROW.txt 常見的繁體中文 1萬字。
  • chars_hakka_tw_ROW.txt 台灣的台語和客語用字。
  • chars_china_sc_ROW.txt 範圍較大一點的繁體和簡體中文字。

建議:補完前2個文字檔就好了,有多餘的時間,再補最後2個文字檔。


使用方法

把 source.ttf 轉換為 target.sfdir

auto_compose_glyph.py
--input source.sfdir
--output new.sfdir
--file glyphs_list.txt

主要使用這3個參數即可。

組字過程的記錄,放在 compose.log 檔案裡。

要微調組合參數,可以使在 glyphs_list.txt 檔案裡設定,glyphs_list.txt 每一個單字的分隔符號是 Enter, 參數微調分隔符號是空白。

上面的執行結果,預設會使用FontForge 去預覽組字結果的 new.sfdir,可以先把組字失敗的刪除後,再把調整完的放回去要處理的來源目錄。

附註:目前補字出來的寬度是從 FontForge 專案的 font.props 裡讀取屬性來自動設定。

在有了 compose.log 檔案後,直接使用 format_compose.py –input compose.log 檔案就可以取得另一個 format_compose.log 檔案。

在使用的經驗上,compose.log 檔案裡放的文字組合,適合拿來開啟原始補字用的字體專案檔,會顯示可以存取的既有文字清單。

format_compose.log 檔案裡放的文字組合,適合拿來開啟自動補字程式產生出來的補字用的字體專案檔,會顯示可以待補字針對同一個部件,等補字的清單。


進階的參數

  • –shake=False
    可以讓部件固定從筆畫少的先取得,預設是 shake=True
  • –add_extra_finetune_commands
    這個參數,可以微調部件出現的位置,預設是不啟用,套用了的效果會讓較大的部件被縮小,相對較容易失真,還有筆頭的寬度也會變的不太一致。

使用範例

auto_compose_glyph.py --input jason4.sfdir --output new.sfdir --file chars_4K_ROW.txt --dictionary_file ~/Documents/zi_parser/Dictionary_lite.json

說明:

  • 要處理的FontForge 專案是 jason4.sfdir,
  • 輸出結果的資料夾為:new.sfdir,
  • 補字清單從chars_4K_ROW.txt
  • 指定字典檔放在 ~/Documents/zi_parser/Dictionary_lite.json, 每次都要打這個path 的參數,很花時間,建議暫時 copy 一份 json 檔案到現行目錄下,或是使用 symbol link 產生連結檔,會方便些。

在執行完後,請使用文字編輯器開啟 compose.log 檔案,可以看到完整的缺字清單,可以使用「增加空白文字到字體檔」的方式,加空白的文字到字體檔裡:
https://codereview.max-everyday.com/new-glyph/

取得的 compose.log 範例:

idx:120 char:仱 (U+4EF1) is lost.
component: 亻 
+--chars length: 256 
+--source chars: 什仁仂仃仆仍仏化仔仕他仗付仙仞仟仡代仭仮仰仲仳件价任仼份仿伀伃伉伊伍伎伏伐休伕优伙伜伝㑁伯估伴伶伸伹伺似伽佃但佇位低住佐佑体佔何佖佗佚佛作佝你佢佣𪜶佫佬佮佯佰佳併佶佷佻佼佾使侄侈侊例侍侏侑侒侔侘侚供依侠価侫侭侮侵侶侷便係促俄俉俊俍俏俐俑俔俗俘俚俛保俟俠信俣俤俥𠊎俯俱俳俵俶俸俺俾俿倀倅倆倈個倌倍們倒倔倖倘倚倜倞借倡倢倣値倥倦倨倩倪倫倬倭倲倶倹值偀偂偃偆假偈偉偌偎偏偐偕偖做停健偬偰偲側偵偶偷偸偺偽傀傅傍傑傔傖傚傜傢催傭傯傲傳傴債傾僂僅働像僑僕僖僘僚僞僣僥僧僭僮僱僴僵價僻儀儁儂億儈儉儐儒儔儕儖儘儚償儡優儲儷儺儻儼 
component: 今 
+--chars length: 6 
+--source chars: 吟矜砛衿鈐黔

說明:仱,有2個部件組成,亻+今, 人部可以參考的有256個,今部可以參考6個 glyph.

取得的 format_compose.log 範例:

今: 仱坅妗岒庈忴扲昑枔棽笒紟耹肣芩蚙軡酓雂霒靲鳹

要等待補字的glyph, 使用到「今」部件,有22個glyph.


Q:補字清單,要如何取得?
A:先使用一個較完整的字型檔,例如市面上常見的6千字免費字型,透過「取得字體的包含文字」即可取得文字清單。或使用台灣教育部的 moeli 3.0 ,裡面有 4808 常用中文字。

Q:補字清單,檔案內容的格式為何?
A:整理一下上面的文字清單,去除中文字的部份,即可直接使用。


MaxCodeReview 影片:

大波浪圓體補字:2022-06-03
https://youtu.be/I_6l5KC_gu0

大波浪圓體補字:2022-06-01
https://youtu.be/ors3B1t9oBk


相關文章:

查「部首」、「筆畫」、「異體字」、「同義字」和「文字組件」的字典
https://max-everyday.com/2020/04/chinese-dictionary-radical/

AI造字經驗分享
https://max-everyday.com/2021/07/zi2zi-ai-font/

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。