Font configuration (简体中文)

From ArchWiki
(Redirected from 字体配置)

Fontconfig 是一个库,用于为应用程序提供可用的字体列表,及配置字体如何渲染。FreeType 库依此配置渲染字体。Arch 上的 freetype2 渲染库使用了为 LCD 屏幕上渲染优化过的字节码解释器(bytecode interpreter,BCI)。可参见#预置示例

大多数 Unix 类系统现在使用 Fontconfig,但部分程序仍使用原始的字体选择、显示方法,X Logical Font Description

字体路径

Fontconfig 的默认路径包含/usr/share/fonts/usr/local/share/fonts/~/.local/share/fonts。fontconfig 将在这些路径下递归查找。在安装字体时,建议放在这些路径下。

以下命令列出 fontconfig 已知的字体文件:

$ fc-list : file

fc-list(1) 有更多的输出格式。

Xorg 已知的字体路径可通过其日志了解:

$ grep /fonts ~/.local/share/xorg/Xorg.0.log
提示:
  • 也可使用xset q命令。
  • 若 Xorg 以根用户权限运行,可查看/var/log/Xorg.0.log

注意,Xorg 不像 Fontconfig 一样递归查找 /usr/local/share/fonts,要添加路径必须添加完整的路径。

更多细节请阅读 Xorg 配置。如果要为用户单独配置字体路径,可以修改对应的~/.xinitrc

xset +fp /想要/添加的/字体/路径
xset -fp /想要/排除的/字体/路径

Fontconfig 配置

fonts-conf(5) 有 Fontconfig 的文档。

单用户配置文件在$XDG_CONFIG_HOME/fontconfig/fonts.conf(通常是$HOME/.config/fontconfig/fonts.conf。 全局配置在/etc/fonts/local.conf。 单用户配置优先级高于全局配置。两个文件使用相同的语法。

注意:
  • 需要启用50-user.conf预置才能让用户配置生效,51-local.conf预置让全局配置生效。参见#预置一节。
  • ~/.fonts.conf/~/.fonts.conf.d/~/.fontconfig/*.cache-*已过时,以后的包将不再读取这些位置。对应的新路径分别是$XDG_CONFIG_HOME/fontconfig/fonts.conf$XDG_CONFIG_HOME/fontconfig/conf.d/NN-name.conf$XDG_CACHE_HOME/fontconfig/*.cache-*。第二项的NN是从00到99的两位数字。

Fontconfig 把所有配置集中到一个单独的中心文件(/etc/fonts/fonts.conf)中。Fontconfig 自身升级的时候会改动这个文件,不建议直接修改它。对接 Fontconfig 的程序查看这个文件就知道可用的字体及如何渲染之。重启这类程序即可载入新的配置。该文件是全局配置(/etc/fonts/local.conf)、配置预置(/etc/fonts/conf.d/)、用户配置($XDG_CONFIG_HOME/fontconfig/fonts.conf)的合成。使用fc-cache命令重建 Fontconfig 的配置,但只有新运行的程序会使用新的配置。

注意: 某些桌面环境(如 GNOMEKDE)的字体设置界面会自动创建、覆盖用户的配置文件。对于此类桌面环境,最好让设置界面中的选项和配置文件相符合。同时请确定桌面的区域设置或 locale 受配置好的字体支持,否则字体配置可能被覆盖。

Fontconfig 配置文件使用 XML 格式,其需要的头部如下:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>

 <!-- 这里是设置 -->

</fontconfig>

本文将忽略这个部分。

预置

预置存放在 /usr/share/fontconfig/conf.avail。可以用创建符号链接到此处的形式来启用。这些预置会覆盖对应的配置。

以下命令启用全局的次像素 RGB 渲染:

$ cd /etc/fonts/conf.d
# ln -s /usr/share/fontconfig/conf.avail/10-sub-pixel-rgb.conf

以下命令启用用户的次像素 RGB 渲染:

$ mkdir $XDG_CONFIG_HOME/fontconfig/conf.d
$ ln -s /usr/share/fontconfig/conf.avail/10-sub-pixel-rgb.conf $XDG_CONFIG_HOME/fontconfig/conf.d


抗锯齿(antialias)

字体光栅化将文字从一个向量表示(比如一个TrueType字体)转化到光栅或者位图表示。因为混叠现象,结果可能会有锯齿状边缘。抗锯齿技术可以使边缘看起来更平滑。

Fontconfig 默认启用抗锯齿,如想禁用:

  <match target="font">
    <edit name="antialias" mode="assign">
      <bool>false</bool>
    </edit>
  </match>
注意: 某些程序可能会忽略这项设置。

字体微调(hinting)

字体微调使用数学指令来调整轮廓字体的显示,使其与光栅化网格对齐。在低屏幕分辨率下,微调对于生成清晰易读的文本至关重要。在高分辨率屏幕下,字体微调的必要性降低。

字节码解释器(BCI)

TrueType 字体的微调指令由 FreeType 的解释器使用 BCI 微调渲染。通常来说,微调指令完备的字体用这个选项效果不错。

默认启用,如要禁用:

  <match target="font">
    <edit name="hinting" mode="assign">
      <bool>false</bool>
    </edit>
  </match>

具体的 BCI 实现可以在脚本/etc/profile.d/freetype2.sh中切换,使用参数truetype:interpreter-version=NN修改。NN 对应脚本中的FREETYPE_PROPERTIES。一些选项如下:

  • 35 - 经典模式,模拟 Windows 98
  • 36 - 经典 Windows ClearType 模式,Windows XP 以前
  • 38 - “Infinality”模式,定制性高,性能较低,已不再开发
  • 40 - 最小模式(精简版 Infinality,默认值)

次像素渲染应该使用次像素 BCI。 详见https://freetype.org/freetype2/docs/reference/ft2-properties.html#tt_interpreter_version_xxx]。

自动微调(autohint)

自动微调依自己的算法尝试微调,无视所有的微调指令。以前这曾是默认启用的选项,因为 TrueType2 字体受专利保护,但现在专利已过期,基本不需要使用它。如果字体的微调指令很少或没有,效果尚可,否则效果是不如 BCI 的。常见字体都有完备的微调指令,因此自动微调用处不大,现在是默认关闭的。要启用:

  <match target="font">
    <edit name="autohint" mode="assign">
      <bool>true</bool>
    </edit>
  </match>

微调风格(hintstyle)

微调风格是对字体调整显示、使其与光栅化网格对齐的调整量。支持的值有hintnonehintslighthintmediumhintfull,微调程度依次加深,即字形更扭曲、更清晰。hintslight对于非 CFF(.otf)字体在竖直方向上隐式使用自动微调而非字体本身的微调指令。

默认选项是hintslight,要更改的话:

  <match target="font">
    <edit name="hintstyle" mode="assign">
      <const>hintnone</const>
    </edit>
  </match>
注意: 有些程序会无视默认微调设置。

像素排布(RGBA)

大多数显示器使用 RGB 排列像素,但也有例外。Fontconfig 需要知道显示器类型才能正确显示字体。这个选项的值有四个:RGB、BGR、V-RGB、V-BGR。如果你的显示器旋转使用,可修改这个值。如果找不到相应的资料,这个网站可协助测试。

  <match target="font">
    <edit name="rgba" mode="assign">
      <const>rgb</const>
    </edit>
  </match>

注意,如果不开启次像素渲染(见下),freetype 只关心是水平还是竖直,不关心像素排布。

次像素渲染

次像素渲染(英文维基百科页面)通过单独控制一个像素的三个分色,在一个方向上可获得三倍分辨率。

FreeType2 提供两种次像素渲染方式(FT_CONFIG_OPTION_SUBPIXEL_RENDERING),Harmony 和 ClearType。参见[1]

若使用 ClearType 次像素渲染,建议启用 LCD 滤镜(见下)。Harmony 次像素渲染不需要。

从 FreeType 2.10.3 起,Arch 默认启用 ClearType 次像素渲染。[2]

LCD 滤镜(lcdfilter)

LCD 滤镜是用来减轻 ClearType 次像素渲染的色边现象的。这是 FreeType 2 API 文档的描述,其中 FT_LcdFilter 一节解释了选项。这个网页展示了不同 LCD 滤镜的测试效果。

大多数用户可使用lcddefault。其他滤镜包括:太粗或模糊的字体可使用lcdlightlcdlegacy是原始的 Cairo 滤镜;lcdnone完全关闭。

  <match target="font">
    <edit name="lcdfilter" mode="assign">
      <const>lcddefault</const>
    </edit>
  </match>

高级 LCD 滤镜选项

为某些字体/字重单独设置

设置/替换默认字体

字体白名单/黑名单

禁用位图字体

禁用位图字体缩放

自动生成粗体和斜体

优先级规则

查看现有设置

无视 Fontconfig 设置的程序

疑难问题

某些字体(Calibri, Cambria, Monaco 等)不正常显示

程序无视微调或抗锯齿设置

程序不遵循GNOME的微调设置

GTK 程序中微调不正确

生成 PDF 中 Helvetica 不正常显示

FreeType 不正确显示位图字体

Dejavu Monospace 不渲染下划线

调试 FreeType 字体

参见