11

我最近想出了如何fontconfig在 Linux 上为 serif、sans-serif 和等宽字体设置系统默认字体;基本上,您将 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"属性确保匹配规则优先于其他设置,并且字体名称的顺序确保在字体不包含给定代码点/字符的情况下,尝试列表中的下一个字体(此列表从顶部到-bottom;恕我直言,它确实应该是一个后期绑定更强的逻辑,但无论如何)。

这种配置的伟大之处在于它可以在文本编辑器和终端仿真器中运行。

但是,仍然存在问题:在许多情况下,给定字体确实包含给定字形,但对于该代码点,另一种字体会更可取;例如,Sun-ExtA它是 CJK 字符的一个很好的默认字体,但它也涵盖了很多非 CJK 字符,并且有一些有问题的字形。

假设我不喜欢〇 U+3007 IDEOGRAPHIC NUMBER ZEROin的外观Sun-ExtA并且宁愿使用HanaMinA它,我怎么能这样做fontconfig呢?显然,我不能只优先考虑HanaMinAover的条目Sun-ExtA,因为这会影响两种字体中包含的所有字形。

我的直觉是应该有一个涉及元素的解决方案<charset>(根据 fontconfig 用户文档,“这个元素至少包含一个 Unicode 代码点或更多元素”)和/或<range>(“这个元素包含一个范围的两个元素表示”——大概是表示一系列 Unicode 代码点)。不过,我找不到一个如何使用这些元素的示例。

是否可以将 fontconfig 配置为对单个 Unicode 代码点或一系列代码点使用特定字体?

4

2 回答 2

3

在扫描模式中,<minus>在标签中包含一个元素<edit>允许您从字符集中减去。

这主要是为从字体中删除“坏”或有问题的字符而设计的,但更进一步,您可以编写一个<test>匹配除您要使用的字体之外的所有字体的字体:

<match target="scan">
  <test name="family" compare="not_eq">
    <string>VL Gothic</string>
  </test>
  <edit name="charset" mode="assign">
    <minus>
      <name>charset</name>
      <range>
        <int>0x0021</int>
        <int>0x00FF</int>
      </range>
    </minus>
  </edit>
</match>

类似的配置也可用于lang从字体中删除整个 s。

据我所知,这在以前没有真正记录在案,我是从一个 redhat 错误中发现的

于 2017-12-03T01:14:42.427 回答
1

您可以使用以下方法在 fontconfig 中提升特定语言环境的字体:

   <match>
    <test name="lang">
      <string>[RFC-3066 language code]</string>
    </test>
    <test name="family">
      <string>[genericname]</string>
    </test>
    <edit name="family" mode="prepend">
      <string>[fontname]</string>
    </edit>
  </match>
   <alias>
    <family>[fontname]</family>
     <default>
      <family>[genericname]</family>
     </default>
   </alias>

需要仔细使用 fontconfig 优先级,以便在您不想要的字体之前和常见的拉丁/希腊/西里尔字体之后提升字体(因为 CJK 拉丁字形往往很糟糕)。

当然,这假设您的软件环境能够在您在需要此覆盖的语言环境中读/写时发出 fontconfig 信号。

于 2017-12-01T14:59:50.780 回答