21.39. 英文字和中文字等寬?

Contributed by firefly

TrueType 字體分成兩種,一種是可變字距,也就是每個字符寬度不一樣, 比如 "x" 與 "i",這兩個字符就不等寬,它是在每個字符中紀錄該字符的寬度, 大多數的 TrueType 都是這種格式。

另一種就是固定字距。也就是每個字符寬度都一樣,這樣顯示或打印時, 會有對齊效果,比較美觀,在英語環境中,不會有任何問題,聰明的您, 知道問題所在了吧。

沒錯!CJK 的等寬字體,包含『半寬英數字符』與『全寬 CJK 字符』, 字型引擎會把全寬字寬度套用在半寬字上頭,造成半寬字看起來間距太大, 這就是問題所在。

這裡提供一個方法,讓字型引擎忽略 CJK 字體指定的寬度, 您可以將以下這段內容,複製到 ~/.fonts.conf 中:

<match target="font"> 
        <test target="pattern" name="lang" compare="contains"> 
                <string>zh-tw</string> 
                <string>zh-cn</string> 
                <string>ja</string> 
                <string>ko</string> 
        </test> 
        <test name="spacing" compare="eq"> 
                <const>mono</const> 
        </test> 
        <edit name="globaladvance" mode="assign"> 
                <bool>false</bool> 
        </edit> 
</match>

以上那段的意思是:當遇到 CJK 字型,又是等寬時, 忽略系統內定寬度,這樣,當系統使用 CJK 等寬字時, 便不會再有間距過大的問題。

因為 MingLiU 宣稱自己是 monospaced 字型,但實際上它有兩種寬度: 中文的全形以及英文的半形。

    <match target="font">
        <test name="family"><string>MingLiU</string></test>
        <edit name="globaladvance"><bool>false</bool></edit>
    </match>

還可以改 spacing,0 是 proportional 的 spacing,100 是 mono, 110 是 charcell。

    <match target="font">
        <test name="family"><string>MingLiU</string></test>
        <edit name="spacing"><int>0</int></edit>
    </match>

在 X11 Core Font 的部分則是必須修改 XLFD, 將 -m- 改成 -p-。