字型裡符號橫排直排自動轉換的方法

如果把字型檔案裡的 kerning info 都拿掉,會造成在直書時,字是橫的。

說明:第一行是原本的字型;第二行是Max修改的,無法直書和符號轉向。


修改好之後,就變直的了:

說明:右邊是Noto Sans CJK TC,左邊是 Swei Sans CJK TC。


直書的解法好像有滿多個,首先是要在 font.props 裡設定HasVMetrics屬性:

HasVMetrics: 1

直接加上面一行,就支援直書了,但部份的符號,在直書時轉換的位置可能不是符合我們預期的結果,需要在 glyph 檔案裡,針對個別的字做位置調整。

font.props 沒有加入HasVMetrics的設定時,會變成符號有設定 Position2 的都有轉換位置到,但其他的沒設定的字會維持在橫書,沒有套成直書。


解法1:使用指令做符號轉向

首先是 font.props 裡有相關的設定,例如:

Lookup: 257 0 0 "'vhal' Alternate Vertical Half Metrics lookup 8" { "'vhal' Alternate Vertical Half Metrics lookup 8 per glyph data 0" "'vhal' Alternate Vertical Half Metrics lookup 8 per glyph data 1" "'vhal' Alternate Vertical Half Metrics lookup 8 per glyph data 2" } ['vhal' ('DFLT' <'dflt' > 'cyrl' <'JAN ' 'KOR ' 'ZHH ' 'ZHS ' 'ZHT ' 'dflt' > 'grek' <'JAN ' 'KOR ' 'ZHH ' 'ZHS ' 'ZHT ' 'dflt' > 'hang' <'JAN ' 'KOR ' 'ZHH ' 'ZHS ' 'ZHT ' 'dflt' > 'hani' <'JAN ' 'KOR ' 'ZHH ' 'ZHS ' 'ZHT ' 'dflt' > 'kana' <'JAN ' 'KOR ' 'ZHH ' 'ZHS ' 'ZHT ' 'dflt' > 'latn' <'JAN ' 'KOR ' 'ZHH ' 'ZHS ' 'ZHT ' 'dflt' > ) ]
Lookup: 257 0 0 "'halt' Alternative Half Widths lookup 5" { "'halt' Alternative Half Widths lookup 5 per glyph data 0" "'halt' Alternative Half Widths lookup 5 per glyph data 1" "'halt' Alternative Half Widths lookup 5 per glyph data 2" } ['halt' ('DFLT' <'dflt' > 'cyrl' <'JAN ' 'KOR ' 'ZHH ' 'ZHS ' 'ZHT ' 'dflt' > 'grek' <'JAN ' 'KOR ' 'ZHH ' 'ZHS ' 'ZHT ' 'dflt' > 'hang' <'JAN ' 'KOR ' 'ZHH ' 'ZHS ' 'ZHT ' 'dflt' > 'hani' <'JAN ' 'KOR ' 'ZHH ' 'ZHS ' 'ZHT ' 'dflt' > 'kana' <'JAN ' 'KOR ' 'ZHH ' 'ZHS ' 'ZHT ' 'dflt' > 'latn' <'JAN ' 'KOR ' 'ZHH ' 'ZHS ' 'ZHT ' 'dflt' > ) ]

接著,是 glyph 檔案裡,要設定 Position2 欄位處理直排時的位置轉換:

Position2: "'vhal' Alternate Vertical Half Metrics lookup 8 per glyph data 1" dx=0 dy=250 dh=0 dv=-500
Position2: "'halt' Alternative Half Widths lookup 5 per glyph data 1" dx=-250 dy=0 dh=-500 dv=0

附註: font.props 裡 coverage 裡的名稱,需要和 glyph 檔裡裡 Position2 裡第一個欄位名稱一致,不然「可能」會套用不到效果。


有些日文符號,在直書時需要順時針旋轉90度,例如:日文的長音符號「ー」(U+30FC),使用的 code:

Kerns2: 1732 -50 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1714 -40 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1713 -30 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1704 -60 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1703 -60 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1702 -60 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1698 -10 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1697 -10 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1696 -20 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1695 -60 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1686 -20 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1685 -20 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1675 -50 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1674 -50 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1673 -20 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1672 -20 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1671 -20 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1670 -20 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1652 -40 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1651 -40 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1610 -40 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1609 -40 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1608 -40 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1594 -60 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1593 -60 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1496 -10 "'kern' Horizontal Kerning lookup 2 per glyph data 0" 1495 -10 "'kern' Horizontal Kerning lookup 2 per glyph data 0"
Position2: "'palt' Proportional Alternate Metrics lookup 3 per glyph data 8" dx=-7 dy=0 dh=-15 dv=0

解法2號:另外在其他的字先轉好方向。

這個解法需要先本的 .glyph 另存一新檔為 .vert.glyph 檔案。

修改 .vert.glyph 檔案內容的 StartChar: 為原本值 + .vert

修改 Encoding: 欄位第 2 欄為 -1

在 .glyph 檔案裡,增加下面的語法,召換 .vert.glyph 檔案。

Substitution2: "'vrt2' Vertical Rotation & Alternates lookup 4 subtable" uni30FC.vert
Substitution2: "'vert' Vertical Alternates lookup 3 subtable" uni30FC.vert

常見的符號有:bracketleft, bracketright, ellipsis, uni301C, uni30FC, uniFF08, uniFF09.


Q&A

Q:font.props / .vert.glyph 這些我都不知道在哪?
A:請先把要處理的字型,透過 FontForge 開啟,並另存 FontForge 的專案為資料夾格式(.sfdir),就可以看到 font.props 和 一堆的 .glyph 檔案。

關閉 FontForge 後,去修改那些檔案,再透過 FontForge 開啟該專案。就可以產生出轉向效果的字型。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *