18 X Window 系统 #
X Window 系统 (X11) 是 Unix 中图形用户界面的实际标准。X 是基于网络的,可以使在一个主机上启动的应用程序显示在通过任何类型的网络(LAN 或 Internet)连接的另一个主机上。本章提供 X 配置的基本信息,以及在 SUSE® Linux Enterprise Server 中使用字体的背景信息。
X Window 系统一般不需要进行任何配置。X 启动期间会动态检测硬件。因此,xorg.conf
已被弃用。如果您仍然需要指定自定义选项来更改 X 的行为方式,还是可以通过修改 /etc/X11/xorg.conf.d/
下的配置文件来实现。
IBM Z 没有 X.Org 所支持的输入或输出设备。因此,本节中所述的所有配置过程都不适用。有关 IBM Z 的更多信息,请参见第 4 章 “在 IBM Z 上安装”。
18.1 安装和配置字体 #
Linux 中的字体可分为两大类:
- 轮廓或矢量字体
包含作为字形组成相关绘图指导的数学描述。因此,每个字形都可以缩放为任意大小而无损质量。在可以使用此类字体(或字形)之前,需要将数学描述转换为光栅(网格)。此过程称为字体光栅化。字体微调(嵌入在字体中)可改进和优化特定大小的渲染效果。光栅化和微调通过 FreeType 库实现。
Linux 下的常用格式为 PostScript Type 1 和 Type 2、TrueType 及 OpenType。
- 位图或光栅字体
包含一个为特定字号设计的像素阵列。位图字体渲染速度极快,而且非常简单。然而,与矢量字体相比,位图字体无法在不损质量的情况下进行缩放。因此,这些字体通常以不同的大小发布。现在,Linux 控制台中仍然使用位图字体,有时终端中也会使用这些字体。
在 Linux 下,便携式编译格式 (PCF) 或字形位图分布格式 (BDF) 是最常用的格式。
这些字体的外观主要会受两个方面的影响:
选择合适的字体系列,
采用某种算法渲染字体,达到接收者眼睛最舒服的效果。
最后一点只与矢量字体相关。虽然上面两点都需要根据个人情况而定,但仍有一些默认值需要创建。
Linux 字体渲染系统由具有不同关系的几个库组成。基本字体渲染库是 FreeType,它会将支持的格式的字体字形转换为优化的位图字形。渲染过程由算法及其参数(可能受专利问题影响)控制。
使用 FreeType 的每个程序或库都应该参考 Fontconfig 库。此库会从用户及系统那里收集字体配置。用户修改其 Fontconfig 设置后,此更改将导致发生 Fontconfig 感知的应用。
Arabic、Han 或 Phags-Pa 等脚本所需的更复杂的 OpenType 成型以及其他更高级别的文本处理使用 Harfbuzz 或 Pango 进行。
18.1.1 显示安装的字体 #
要获得系统上安装了哪些字体的概观,请运行 rpm
或 fc-list
命令。这两个命令都可为您提供不错的答案,但有可能会因系统和用户配置不同而返回不同的列表。
rpm
调用
rpm
可查看系统上安装了哪些包含字体的软件包:rpm -qa '*fonts*'
每个字体包都应该满足此表达式。不过,命令可能会返回误报,例如
fonts-config
(它即不是字体,也不包含字体)。fc-list
调用
fc-list
可获得哪些字体系列可以访问、系统上或主目录中是否已安装这些字体的概观:fc-list ':' family
注意:命令fc-list
命令
fc-list
是 Fontconfig 库的封装程序。从 Fontconfig(更确切地说,从它的超速缓存)可以查询许多有趣的信息。有关更多细节,请参见man 1 fc-list
。
18.1.2 查看字体 #
如果想了解已安装字体系列的外观,请使用命令 ftview
(ft2demos
包)或访问 http://fontinfo.opensuse.org/。例如,要以 14 号字显示 FreeMono 字体,请按如下所示使用 ftview
:
ftview 14 /usr/share/fonts/truetype/FreeMono.ttf
如果需要更多信息,请访问 http://fontinfo.opensuse.org/ 了解支持哪些样式(标准、粗体、斜体等)和语言。
18.1.3 查询字体 #
要查询指定了某种模式时使用哪种字体,请使用 fc-match
命令。
例如,如果您的模式包含已安装字体,fc-match
会返回文件名、字体系列和样式:
tux >
fc-match 'Liberation Serif'
LiberationSerif-Regular.ttf: "Liberation Serif" "Regular"
如果所需字体在您的系统上不存在,Fontconfig 的匹配规则将会生效,并尝试找到最接近的可用字体。这意味着用另一种字体来替代了您要求的字体。
tux >
fc-match 'Foo Family'
DejaVuSans.ttf: "DejaVu Sans" "Book"
Fontconfig 支持别名:用另一个系列名称替代某个名称。通用名称就是一个典型的例子,例如 “sans-serif”、“serif” 和 “monospace”。这些别名可由实际的系列名称,甚至是系列名称的首选设置列表替代:
tux >
for font in serif sans mono; do fc-match "$font" ; done
DejaVuSerif.ttf: "DejaVu Serif" "Book"
DejaVuSans.ttf: "DejaVu Sans" "Book"
DejaVuSansMono.ttf: "DejaVu Sans Mono" "Book"
结果可能因系统而异,具体视当前安装的字体而定。
Fontconfig 总是根据具体请求返回最相似的实际系列(如果至少安装了一个系列)。“相似度”根据 Fontconfig 的内部度量以及用户或管理员的 Fontconfig 设置而定。
18.1.4 安装字体 #
安装新字体的方法主要有以下几种:
将
*.ttf
或*.otf
等字体文件手动安装到知道的一个字体目录。如果字体要用于整个系统,请使用标准目录/usr/share/fonts
。如果要安装在主目录中,请使用~/.config/fonts
。如果不想使用标准目录,Fontconfig 允许您选择其他目录。使用
<dir>
元素告知 Fontconfig 所用目录,有关细节,请参见第 18.1.5.2 节 “深入了解 Fontconfig XML”。使用
zypper
安装字体。大量字体已通过包提供,随附在 SUSE 分发包中或包含在 M17N:fonts 储存库中。请使用以下命令将储存库添加到您的列表中。例如,要为 SLE 12 添加储存库:sudo zypper ar http://download.opensuse.org/repositories/M17N:/fonts/SLE_12_SP5/
要搜索您的 FONT_FAMILY_NAME,请使用以下命令:
sudo zypper se 'FONT_FAMILY_NAME*fonts'
18.1.5 配置字体的外观 #
根据渲染媒体和字号的不同,结果可能并不令人满意。例如,现在的显示器分辨率一般为 100dpi,这导致像素太大,字形显得粗陋难看。
有几种算法可用来处理低分辨率,例如消除锯齿(灰度平滑)、微调(适合网格)或子像素渲染(在一个方向将分辨率增至三倍)。这些算法还可能因字体格式而异。
SUSE 发行套件中不使用子像素渲染。虽然 FreeType2 支持此算法,但有几项将于 2019 年底到期的专利涉及到了此算法。因此,除非系统中有 FreeType2 库并且该库中已编译子像素渲染,否则在 Fontconfig 中设置子像素渲染选项没有任何效果。
通过 Fontconfig,可单独为每种字体选择渲染算法,也可为一组字体选择渲染算法。
18.1.5.1 通过 sysconfig
配置字体 #
SUSE Linux Enterprise Server 在 Fontconfig 上提供一个 sysconfig
层。要尝试进行字体配置,这是一个不错的着手点。要更改默认设置,请编辑配置文件 /etc/sysconfig/fonts-config
。(或使用 YaST sysconfig 模块)。编辑该文件之后,请运行 fonts-config
。
sudo /usr/sbin/fonts-config
重启动该应用程序以显示成效。请牢记以下要点:
一些应用程序不需要重启动。例如,Firefox 会不时重新读取 Fontconfig 配置。新创建或重新装载的标签可在稍后获得新的字体配置。
每次发生包安装或去除操作之后,系统会自动调用
fonts-config
脚本(如未调用,则表示字体软件包有错误)。使用
fonts-config
命令行选项可以暂时覆盖每个 sysconfig 变量。有关细节,请参见fonts-config --help
。
有几个 sysconfig 变量可以更改。请参见 man 1 fonts-config
或 YaST sysconfig 模块的帮助页。以下是一些变量示例:
- 渲染算法的使用
考虑使用
FORCE_HINTSTYLE
、FORCE_AUTOHINT
、FORCE_BW
、FORCE_BW_MONOSPACE
、USE_EMBEDDED_BITMAPS
和EMBEDDED_BITMAP_LANGAGES
- 通用别名的首选项列表
使用
PREFER_SANS_FAMILIES
、PREFER_SERIF_FAMILIES
、PREFER_MONO_FAMILIES
和SEARCH_METRIC_COMPATIBLE
下面的列表提供了一些配置示例,按从“最清晰”字体(对比度较高)到“最漂亮”(较平滑)的顺序显示。
- 位图字体
通过
PREFER_*_FAMILIES
变量可指定首选位图字体。请按照帮助部分的示例使用这些变量。请注意,这些字体渲染为黑白色,不进行平滑处理,并且位图字体只有几种字号。考虑使用SEARCH_METRIC_COMPATIBLE="no"
来禁用基于度量兼容性的系列名称替代。
- 渲染为黑白色的可缩放字体
渲染时未消除锯齿的可缩放字体与位图字体的显示效果相似,同时又可保持字体可缩放性。请使用经过精细微调的字体,如 Liberation 系列。遗憾的是,系统中经过精细微调的字体并不充足。设置下面的变量可强制采用此方法:
FORCE_BW="yes"
- 渲染为黑白色的等宽字体
仅采用不消除锯齿的方式渲染等宽字体,否则,请使用默认设置:
FORCE_BW_MONOSPACE="yes"
- 默认设置
渲染所有字体时都消除锯齿。经过精细微调的字体将通过字节码解释器 (BCI) 渲染,其余字体将使用自动微调器 (
hintstyle=hintslight
) 渲染。让所有相关的 sysconfig 变量保持默认设置。- CFF 字体
以 CFF 格式使用字体。FreeType2 中有了当前的改进后,该字体应该也会比默认的 TrueType 字体更清晰。请按照
PREFER_*_FAMILIES
的示例尝试一下。可以使用以下选项将字体调得更黑更粗:SEARCH_METRIC_COMPATIBLE="no"
因为它们默认是通过
hintstyle=hintslight
来渲染的。还可以考虑使用:SEARCH_METRIC_COMPATIBLE="no"
- 专用自动微调器
即使对于精细微调的字体,也可以使用 FreeType2 的自动微调器。这可能会导致字形变得更粗,有时还会变得更模糊、对比度更低。设置下面的变量可激活此功能:
FORCE_AUTOHINTER="yes"
使用
FORCE_HINTSTYLE
可控制微调级别。
18.1.5.2 深入了解 Fontconfig XML #
Fontconfig 的配置格式是可扩展标记语言 (XML)。下面的几个示例不是完整参考,只是简要概述。细节及其他启示可在 man 5 fonts-conf
或 /etc/fonts/conf.d/
中找到。
中心 Fontconfig 配置文件是 /etc/fonts/fonts.conf
,它及其他作品包括整个 /etc/fonts/conf.d/
目录。要自定义 Fontconfig,可在两个位置插入您的更改:
系统范围的更改: 编辑文件
/etc/fonts/local.conf
(默认情况下,它包含空的fontconfig
元素)。用户特定的更改: 编辑文件
~/.config/fontconfig/fonts.conf
。将 Fontconfig 配置文件放在~/.config/fontconfig/conf.d/
目录中。
用户特定的更改会覆盖任何系统范围的设置。
文件 ~/.fonts.conf
标记为已弃用,不应该再使用。请改为使用 ~/.config/fontconfig/fonts.conf
。
每个配置文件都需要有一个 fontconfig
元素。因此,最精简的文件应如下所示:
<?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <fontconfig> <!-- Insert your changes here --> </fontconfig>
如果默认目录不够用,请插入 dir
元素及相应的目录:
<dir>/usr/share/fonts2</dir>
Fontconfig 会以递归方式搜索字体。
使用下面的 Fontconfig 片段可以选择字体渲染算法(请参见例 18.1 “指定渲染算法”):
<match target="font"> <test name="family"> <string>FAMILY_NAME</string> </test> <edit name="antialias" mode="assign"> <bool>true</bool> </edit> <edit name="hinting" mode="assign"> <bool>true</bool> </edit> <edit name="autohint" mode="assign"> <bool>false</bool> </edit> <edit name="hintstyle" mode="assign"> <const>hintfull</const> </edit> </match>
字体的各种属性都可以测试。例如,<test>
元素可测试字体系列(如该例中所示)、字体间隔、间距、字体格式以及其他。如果完全不使用 <test>
,所有 <edit>
元素都会应用于每个字体(全局更改)。
- 规则 1
<alias> <family>Alegreya SC</family> <default> <family>serif</family> </default> </alias>
- 规则 2
<alias> <family>serif</family> <prefer> <family>Droid Serif</family> </prefer> </alias>
- 规则 3
<alias> <family>serif</family> <accept> <family>STIXGeneral</family> </accept> </alias>
例 18.2 “别名和系列名称替代”中的规则会创建一份排定了优先级的系列列表 (PFL)。根据元素的不同,执行的操作也不同:
如果将这些片段按规则 1 - 规则 2 - 规则 3 的顺序组合起来,当用户请求 “Alegreya SC” 时,系统便会如创建如表 18.1 “基于 Fontconfig 规则生成 PFL”中所述的 PFL。
在 Fontconfig 的度量中,系列名称具有最高优先级,高于样式、大小等其他模式。Fontconfig 会检查系统上当前安装了哪个系列。如果安装了 “Alegreya SC”,Fontconfig 将会返回它。如果未安装,则会查找 “Droid Serif”,依次类推。
请小心。如果 Fontconfig 片段的顺序发生变化,Fontconfig 可能会返回不同的结果,如表 18.2 “基于更改了顺序的 Fontconfig 规则生成 PFL 的结果”中所述。
将 <default>
别名视为此组的分类或内含项(如果未安装)。如该例所示,<default>
应该一律优先于该组的 <prefer>
和 <accept>
别名。
<default>
分类不限于通用别名 serif、sans-serif 和 monospace。有关复杂示例,请参见 /usr/share/fontconfig/conf.avail/30-metric-aliases.conf
。
例 18.3 “别名和系列名称替代”中的以下 Fontconfig 片段会创建一个 serif
组。如果前一种字体未安装,此组中的每个系列可替代其他系列。
<alias> <family>Alegreya SC</family> <default> <family>serif</family> </default> </alias> <alias> <family>Droid Serif</family> <default> <family>serif</family> </default> </alias> <alias> <family>STIXGeneral</family> <default> <family>serif</family> </default> </alias> <alias> <family>serif</family> <accept> <family>Droid Serif</family> <family>STIXGeneral</family> <family>Alegreya SC</family> </accept> </alias>
优先级由 <accept>
别名中的顺序指定。类似地,可以使用更强的 <prefer>
别名。
例 18.4 “别名和系列名称替代”扩展了例 18.2 “别名和系列名称替代”。
- 规则 4
<alias> <family>serif</family> <accept> <family>Liberation Serif</family> </accept> </alias>
- 规则 5
<alias> <family>serif</family> <prefer> <family>DejaVu Serif</family> </prefer> </alias>
例 18.4 “别名和系列名称替代”中的扩展配置将导致下列 PFL 变化:
如果同一个通用名称存在多个
<accept>
声明,则最后分析的声明“胜出”。如有可能,创建系统范围的配置时,不要在用户 (/etc/fonts/conf.d/*-user.conf
) 之后使用<accept>
。如果同一个通用名称存在多个
<prefer>
声明,则最后分析的声明“胜出”。如有可能,在系统范围的配置中,不要在用户之前使用
<prefer>。同一个通用名称的每个
<prefer>
声明都会覆盖<accept>
声明。如果管理员不仅希望用户可使用<prefer>
,还想允许其使用<accept>
,就不应该在系统范围的配置中使用<prefer>
。另一方面,因为用户通常都是使用<prefer>
,这种做法应该不会产生任何不利影响。我们还发现存在在统范围的配置中使用<prefer>
的情况。
18.2 更多信息 #
您可安装 xorg-docs
包以更深入地了解 X11。man 5 xorg.conf
提供了有关手动配置(如果需要)的格式的详细信息。有关 X11 开发的更多信息,请参见该项目的主页:http://www.x.org。
驱动程序位于 xf86-video-*
包中,例如 xf86-video-nv
。相关手册页中详细说明了这些包附带的很多驱动程序。例如,如果使用 nv
驱动程序,在 man 4 nv
中可以找到有关此驱动程序的更多信息。
有关第三方驱动程序的信息位于 /usr/share/doc/packages/<package_name>
中。例如,x11-video-nvidiaG03
的文档在安装包之后位于 /usr/share/doc/packages/x11-video-nvidiaG03
中。