解决 Linux 安装宋体后 UI 字体也变成宋体的问题

Posted by 王灿辉 on 2020-06-29

引子

现如今,有很多人选择使用 Linux 作为自己工作的主要操作系统,但是在 Linux 上使用 Office 软件时,如果没有微软 Word 上常见的几款字体的话,无论是在写作时还是排版时总会觉得有些别扭,因为诸如宋体、黑体、楷体、仿宋等等 Winsows 自带的字体实在是太常用了,几乎绝大多数 Word 文档所用的全部字体不外乎这几个。

所以我决定将 Windows 上的几个常用字体安装到 Linux 上。可不料,安装好之后另一个问题却浮现出来:怎么我 UI 的字体也变成宋体了?

字体族

要搞清楚这个问题首先要了解一下关于计算机字体族的知识。目前主要的字体族共有 5 个:serif,sans-serif,monospace,cursive 和 fantasy,最常用的是前 3 个。他们的中文名分别是:衬线、无衬线和等宽字体族。

serif 衬线字体族

特点:

  • 具有修饰过的笔画,向外展开的或者尖细的末端,或者是带有实际衬线的末端
  • 一笔一划末端(两头)都带点变化装饰,比如宋体笔画末端有毛笔字的感觉
  • 文字末端有差异,在小字号下仍然容易辨认。但在大字号下笔画装饰部分可能会显得模糊或带有锯齿

示例:

  • Times New Roman、MS Georgia
  • 宋体、仿宋

sans-serif 无衬线字体族

sans-前缀是法语,发音为/san/,意为“无”。

特点:

  • 具有笔画清晰的末端–带有一点或者没有向外展开的,交错笔画,或者其它装饰
  • 与“衬线字体”相比,如果字号比较小,看起来就会有些难以分辨,尤其段落阅读时容易串行

示例:

  • MS Trebuchet、MS Arial、MS Verdana
  • 黑体、幼圆、隶书、楷体

monospace 等宽字体族

特点:

  • 每个字形都等宽,主要用于英文,中文方块字本来就等宽

示例:

  • Courier、Consolas、Droid Sans Mono
  • 大多数编程字体
  • 大多数中文字体

问题分析

于是我开始在系统上寻找蛛丝马迹。首先我设置的 UI 默认字体是 Ubuntu Mono,Ubuntu Mono 是一个等宽的西文字体,其中并不含我需要显示的中文字体部分。在需要显示西文字体中没有的中文字体时,系统会找到某个中文字体代替。

在原本系统中不存在宋体(simsun)时,这个承担顶替工作的中文字体具体是谁可以在 /etc/fonts/conf.d/ 目录下的配置文件中寻找答案。

无论如何,当我安装了宋体之后,系统就将原字体缺失情况下的顶替工作交给了这个新来的宋体。但这不是我愿意看到的。

解决方法

知道问题所在,那么解决的方法就很容易想出来了。我们只要通过配置文件显式地指定一下这个顶替工作到底要交给那个字体来做就行了。

具体来说,就是在 ~/.config/fontconfig/fonts.conf 中添加下面的内容,... 省略了一些无关的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<fontconfig>
  ...
  <!-- 指定 monospace 族默认字体为 Ubuntu Mono -->
  <match target="pattern">
    <test qual="any" name="family">
      <string>monospace</string></test>
    <edit name="family" mode="assign" binding="same">
      <string>Ubuntu Mono</string>
    </edit>
  </match>

  <!-- 指定当 Ubuntu Mono 中字体缺失时用 Noto Sans CJK SC 替换 -->
  <alias>
    <family>Ubuntu Mono</family>
    <prefer>
      <family>Noto Sans CJK SC</family>
    </prefer>
    <default>
      <family>fixed</family>
    </default>
  </alias>
  ...
</fontconfig>

参考资料



赞赏支持
微信赞赏
微信赞赏
支付宝
支付宝