我最近学会了如何在Linux上使用fontconfig
来设置系统默认的衬线字体、无衬线字体和等宽字体;基本上,你需要将以下内容保存为XML配置文件到~/.config/fontconfig/fonts.conf
中:
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<match>
<test qual="any" name="family"><string>serif</string></test>
<edit name="family" binding="strong" mode="prepend_first">
<string>Gentium</string>
<string>Sun-ExtA</string>
<string>HanaMinA</string>
<string>HanaMinB</string>
</edit>
</match>
</fontconfig>
binding="strong" mode="prepend_first"
属性确保匹配规则优先于其他设置,并且字体名称的顺序确保在一个字体不包含给定代码点/字符时,将尝试列表中的下一个字体(此列表从上到下应用;在我看来,它应该是后绑定更强的逻辑,但无论如何)。这种配置之所以好用,是因为它可以在文本编辑器和终端仿真器中使用。
然而,仍有一个问题:许多情况下,一个给定的字体确实包含了一个给定的字形,但另一种字体对于该代码点更合适;例如,
Sun-ExtA
是CJK字符的默认字体,但它也涵盖了很多非CJK字符,并且有一些问题字形。如果我不喜欢
Sun-ExtA
中〇 U+3007 IDEOGRAPHIC NUMBER ZERO
的外观,并希望改用HanaMinA
,那么我应该如何使用fontconfig
来实现呢?显然,我不能仅仅将HanaMinA
的条目置于Sun-ExtA
之前,因为那会影响到两个字体都包含的所有字形。我的直觉是,应该存在一种解决方案,涉及元素
<charset>
(根据fontconfig用户文档,"此元素至少包含一个Unicode代码点或多个元素")和/或<range>
("此元素包含范围表示的两个元素"——可能用于表示一系列Unicode代码点)。不过,我找不到任何使用这些元素的示例。
是否可以配置fontconfig以在单个Unicode代码点或代码点范围内使用特定字体?
target="font"
而不是"scan"
来使其工作。 - nialv7