X的字体问题说来话长。Google一下有很多术语:FreeType, xft, fontconfig…还能经常见到-misc-dejavu sans-----17------iso10646-这样一坨。都是干什么的呢?

首先,什么是字体系统?当应用程序(以编码的方式)要一个字,你能找到这个字并以合适的方式画出来,你就是个字体系统。X有两套字体系统:X11核心字体系统(core X11 font system)和xft。就先从原始的X11核心字体系统说起吧。

提到X11核心字体系统,就不得不说一下-misc-dejavu sans-----17------iso10646-这坨东西。这坨东西有个术语叫X local font description(XLFD),分成14块,每一块都描述了字体在一个方面的特性,具体可参见http://en.wikipedia.org/wiki/X_logical_font_description。总之,就是个字体的描述。

那么如何添加字体呢?假设字体文件是/usr/share/fonts/foo/foo.ttf,那么执行:

# make index
mkfontscale /usr/share/fonts/foo/
mkfontdir /usr/share/fonts/foo/
# set font path
xset fp+ /usr/share/fonts/foo/
xset rehash

即完成字体的添加。前两行会生成fonts.scale和fonts.dir,自己打开看看就知道是什么了。但是这种方法不是持久的,重新启动之后就没了。持久的方法 有二:

  • 将后两行写在~/.xinitrc里

  • 在/etc/X11/xorg.conf里加入

    Section "Files"
    FontPath "/usr/share/fonts/foo/" EndSection
    

在第二种方法里xset的两行就不需要了。

关于X11核心字体系统如何选择应用程序所要求的字体,可以运行一下xfontsel这个程序。xfontsel可以用来查看一个XLFD在你的机器上会被如何显示。

另外xlsfonts可以列出满足指定XLFD的字体:

xlsfonts -fn "-urw-nimbus sans l-*-r-condensed-*-17-*-*-*-*-0-iso10646-*"

不加-fn选项时列出所有字体。

X11核心字体系统就说这么多,下面轮到xft字体系统了。xft其实没多少东西(yaourt -Ql libxft看看)。它更像是一个接口,调用fontconfig和FreeType完成大部分工作。fontconfig用来选字,FreeType用来画字。

重点说fontconfig吧。XLFD在这里就没什么用了,fontconfig对字体有自己的内部描述。还是从添加字体说起吧。最核心的配置文件是/etc/fonts/fonts.conf,是个XML文件。打开看看,里面用

包围的,就是字体目录;用包围的 ,就是缓存目录。别的先不用管,看~/.fonts在字体目录里吧,把foo.ttf往~/.fonts里一丢,运行一下:

# update cache
fc-cache -vf

这个字体就添加进去了。用下面命令看一下就知道了:

fc-list

但是若想要让字体有好的显示效果,还需要好好配置一番。/etc/fonts/fonts.conf会包含/etc/fonts/conf.d目录下的所有文件,而/etc/fonts/conf.d下的文件都是/etc/fonts/conf.avail下的文件的软链接,方便随时添加删除。常用的格式无非就两种

  • <match><test></test><edit></edit></match>,意思是对满足test的东西执行edit操作。test和edit都可以有多个。如果test有多个,仅当所有test都满足时才执行edit。

  • <alias><family></family><prefer or accept or default><family></family></prefer or accept or default>。这个是说,如果给定字体是前面family标签里的内容,就以后面family里的内容执行prefer或accept或default。prefer是说插在前面,accept是说跟在后面,default是说放在最后,都是字体匹配时用的。

具体如何配置有很多例子,看置底链接吧,不在这里写了。

当fontconfig选好字体后还要利用FreeType画出来。FreeType是个文字转图片的东西。当然转成图片后还是要用X来画。

写得乱七八糟的,也许改天有空refine一下。

Links: