Linux 下的字体调校指南

Linux 下的字体可以很漂亮! 当然,这里是 Linux,你需要一点小小的配置。

很长时间以来,Linux上的中文字体一直…不容乐观。但是随着 FreeType2 由于专利过期默认开启了高质量的 LCD 优化,以及一批高质量的开源字体的公布,Linux上的中文字体渲染已经可以和 macOS 扳扳手腕了。

当然,这里是 Linux,你需要一点小小的配置。

(Windows 的字体渲染从技术上来说是相当先进的,问题是在中文字体的选择上实在是不忍直视…)

(其实 macOS 的糊成一片的渲染方式也有它的问题… 但这就不在本文讨论范围之内了。)

太长不看版

安装字体 (archlinuxcn required):

1
sudo pacman -S noto-fonts noto-fonts-cjk noto-fonts-emoji ttf-sarasa-gothic

下载 fonts.conf 并扔进你的 ~/.config/fontconfig 里面, 重新登录,结束。1

选择字体

Arch Linux 提供了成吨的字体可供选择。完整的列表可以在 这里 找到,找自己看得顺眼的就是,具体不再赘述。

这是我选择字体:

  • 拉丁字体

    • Noto Sans - 无衬线

    • Noto Serif - 衬线

    • Sarasa Term SC - 等宽(直接使用 Iosevka Term 会导致 emacs 中的蜜汁bug)

  • 中文字体

    • Noto Sans CJK SC (又称 思源黑体)

    • Noto Serif CJK SC (又称 思源宋体)

安装字体

  • noto-fonts Noto Sans, Noto Serif

  • noto-fonts-cjk Noto Sans CJK SC, Noto Serif CJK SC

  • noto-fonts-emoji Emoji

  • ttf-sarasa-gothic AUR Sarasa Term SC

配置

现在,什么也不用做,打开一个中文页面,应该已经不会存在豆腐块了2

然而…

默认配置下的 Installation Guide
默认配置下的 Installation Guide

看上去不大对劲,不是么?

破 案 了
破 案 了

…怎么默认到日语字形上去了.

这就是为什么我们需要 Fontconfig.

一些基础

Fontconfig 是一个用来 配置 字体渲染的程序。也就是说,fontconfig 本身没有将字体渲染成位图的能力(真正执行这个工作的是 FreeType),但是它能向程序提供可用字体列表并指导 FreeType 引擎将字体正确地渲染出来。

默认情况下,Fontconfig 的用户配置文件位于 ~/.config/fontconfig/fonts.conf. 它使用 XML 格式,一个最简单配置文件长这样:

1
2
3
4
5
6
7
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>

  <!-- 具体设置在这里 -->

</fontconfig>

我们要做的就是往里面填写具体的配置.

渲染相关参数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  <!-- 显示器使用的像素排列方式. 现代显示器基本都是用rgb排列. -->
  <match target="font">
    <edit mode="assign" name="rgba">
      <const>rgb</const>
    </edit>
  </match>

  <!-- 字体微调的程度, 可选为 hintnone, hintslight (默认), hintmedium, hintfull. -->
  <!-- 简单来说,更高的 hinting 等级可以使字体更锐利,但同时也会损失更多的细节. -->
  <!-- 如果你的显示器的 DPI 高得不像话 (>=300), 那么就可以关闭 hinting, 因为字体会自然对齐像素. -->
  <match target="font">
    <edit mode="assign" name="hintstyle">
      <const>hintslight</const>
    </edit>
  </match>

  <!-- 抗锯齿. 除非你的屏幕DPI奇高否则建议开启. -->
  <match target="font">
    <edit mode="assign" name="antialias">
      <bool>true</bool>
    </edit>
  </match>
  
  <!-- 关于lcdfilter, 因为我们在使用 FreeType2 自带的 Harmony 子像素渲染, 应该是不需要设置的. -->

这只是一小部分,但是对于普通使用而言调整这些已经足够。如果还是不满意,可以继续查看 ArchWiki.

设置首选字体

依照自己的选则替换即可.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<!-- 全局默认字体 -->
<!-- Default font (no fc-match pattern) -->
  <match>
    <edit mode="prepend" name="family">
      <string>Noto Sans</string>
    </edit>
  </match>

<!-- 全局默认中文字体 -->
<!-- Default font for the zh_CN locale (no fc-match pattern) -->
  <match>
    <test compare="contains" name="lang">
      <string>zh_CN</string>
    </test>
    <edit mode="prepend" name="family">
      <!-- 更改下一行即可, 以下同理 -->
      <string>Noto Sans CJK SC</string>
    </edit>
  </match>

<!-- 默认无衬线字体 -->
<!-- Default sans-serif font -->
  <match target="pattern">
    <test qual="any" name="family">
      <string>sans-serif</string></test>
    <edit name="family" mode="prepend" binding="same">
      <string>Noto Sans</string>
    </edit>
  </match>

<!-- 默认衬线字体 -->
<!-- Default serif fonts -->
  <match target="pattern">
    <test qual="any" name="family">
      <string>serif</string>
    </test>
    <edit name="family" mode="prepend" binding="same">
      <string>Noto Serif</string>
    </edit>
  </match>

<!-- 默认等宽字体 -->
<!-- Default monospace fonts -->
  <match target="pattern">
    <test qual="any" name="family">
      <string>monospace</string>
    </test>
    <edit name="family" mode="prepend" binding="same">
      <string>Sarasa Term SC</string>
    </edit>
  </match>

设置备用字体

因为我们也会遇到其他语种的文字,需要告诉 Fontconfig 如果特定字符在默认字库里找不到应该去哪里找备用字形.

至于如何查找字体的具体名字,可以使用 fc-list | grep $fontName 查询.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!-- Fallback fonts preference order -->
  <alias>
    <family>sans-serif</family>
    <prefer>
      <family>Noto Sans</family>
      <family>Noto Sans CJK SC</family>
      <family>Noto Sans CJK TC</family>
      <family>Noto Sans CJK JP</family>
      <family>Noto Sans CJK KR</family>
      <family>Noto Color Emoji</family>
      <family>Noto Emoji</family>
    </prefer>
  </alias>
  <alias>
    <family>serif</family>
    <prefer>
      <family>Noto Serif</family>
      <family>Noto Serif CJK SC</family>
      <family>Noto Serif CJK TC</family>
      <family>Noto Serif CJK JP</family>
      <family>Noto Serif CJK KR</family>
      <family>Noto Color Emoji</family>
      <family>Noto Emoji</family>
    </prefer>
  </alias>
  <alias>
    <family>monospace</family>
    <prefer>
      <family>Sarasa Term SC</family>
      <family>Sarasa Term TC</family>
      <family>Sarasa Term J</family>
      <family>Noto Color Emoji</family>
      <family>Noto Emoji</family>
    </prefer>
  </alias>

大功告成!

把配置文件保存,打开一个程序(比如浏览器),应该就可以看到变化了!

还有几点需要注意:

  • 有一些(老顽固)程序会忽略 Fontconfig 的设置,需要修改 Xresources. ArchWiki 上提供的事例配置应该足够了.

  • 很多程序有自己的字体配置. 一般而言,将无衬线字体设置成 sans-serif, 将衬线字体设置成 serif, 将等宽字体设置成 monospace, 就会遵循 fontconfig 的设置了.


1

这份 font.conf 基于 Michael Yang 的 Linux下终极字体配置方案. 本文很多内容也基于这篇文章, 感谢!

2

Noto 字体家族正是得名于此. Noto -> No Toufu -> 没有豆腐块.

发表于 2019-09-23
JS
Arrow Up