42.12.11 字体集

字体集(fontset) 是一组字体的列表,每一种字体分配给一段字符编码范围。 单个字体无法显示 Emacs 支持的全部字符,但字体集可以。 字体集与字体一样拥有名称,在为框架或文本视觉样式指定字体时, 可用字体集名称替代字体名称。 以下介绍在 Lisp 程序控制下定义字体集的相关信息。

Function: create-fontset-from-fontset-spec fontset-spec &optional style-variant-p noerror

该函数根据规范字符串 fontset-spec 定义新字体集。 字符串格式如下:

fontpattern, [charset:font]...

逗号前后的空白字符会被忽略。

字符串第一部分 fontpattern 应为标准 X 字体名称格式, 仅最后两个字段需为 ‘fontset-alias’。

新字体集有两个名称:长名与短名。 长名为完整的 fontpattern,短名为 ‘fontset-alias’。 可使用任一名称引用该字体集。 若同名字体集已存在,会抛出错误,除非 noerror 为非 nil, 此时函数不执行任何操作。

若可选参数 style-variant-p 为非 nil, 表示同时创建该字体集的粗体、斜体与粗斜体变体。 这些变体字体集没有短名,仅有长名, 通过修改 fontpattern 以标识粗体/斜体状态生成。

规范字符串还指定字体集中使用的字体,具体说明见下文。

结构 ‘charset:font’ 为此字体集中某一特定字符集指定所用字体。 其中 charset 为字符集名称,font 为该字符集使用的字体。 可在规范字符串中多次使用该结构。

对于未显式指定的其余字符集,Emacs 基于 fontpattern 选择字体: 它会将 ‘fontset-alias’ 替换为对应字符集的名称。 对于 ASCII 字符集,‘fontset-alias’ 会被替换为 ‘ISO8859-1’。

此外,若多个连续字段为通配符,Emacs 会将其合并为单个通配符, 以避免使用自动缩放字体。 通过放大大字体得到的缩放字体不适用于编辑, 而缩小小字体也无意义,直接使用原尺寸更小的字体效果更好,Emacs 正是如此处理。

因此若 fontpattern 如下:

-*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24

ASCII 字符的字体规范为:

-*-fixed-medium-r-normal-*-24-*-ISO8859-1

中文 GB2312 字符的字体规范为:

-*-fixed-medium-r-normal-*-24-*-gb2312*-*

你可能没有匹配上述规范的中文字体。 大多数 X 发行版仅包含在 family 字段中带有 ‘song ti’ 或 ‘fangsong ti’ 的中文字体。 这种情况下,可按如下方式指定 ‘Fontset-n’:

Emacs.Fontset-0: -*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24,\
        chinese-gb2312:-*-*-medium-r-normal-*-24-*-gb2312*-*

如此一来,除中文 GB2312 外的所有字符,其字体规范的 family 字段为 ‘fixed’, 而 GB2312 字符的字体规范在 family 字段使用通配符 ‘*’。

Function: set-fontset-font fontset characters font-spec &optional frame add

该函数修改现有 fontset,使其使用 font-spec 指定的字体 显示指定的 characters

fontsetnil,函数修改选中框架的字体集; 若 framenil,则修改 frame 对应的字体集。

fontsett,函数修改默认字体集, 其短名字符串为 ‘fontset-default’。

参数 characters 可为单个字符,该字符将使用 font-spec 显示; 也可为 cons 单元 (from . to), 其中 fromto 均为字符,此时 fromto(含)范围内的所有字符 均使用 font-spec

characters 可为字符集符号(see 字符集), 此时该字符集中所有字符均使用 font-spec

characters 可为书写体系符号(see char-script-table), 此时属于该书写体系的所有字符均使用 font-spec。 另请参考 use-default-font-for-symbols, 该变量会在 characters 指定或属于 symbol 书写体系(含符号与标点字符)时 影响字体选择。

characters 可为 nil,表示将 font-spec 用于 fontset 中未指定字体规范的所有字符。

font-spec 可为由 font-spec 函数创建的字体规范对象(see 底层字体表示)。

font-spec 可为 cons 单元 (family . registry), 其中 family 为字体家族名(开头可包含铸造厂名), registry 为字体注册库名(结尾可包含编码名)。

font-spec 可为字符串形式的字体名称。

font-spec 可为 nil,显式指定指定 characters 无对应字体。 这一用法很实用,例如可避免系统为 Unicode 私用区域(PUA)这类无字形的字符 执行耗时的全局字体搜索。

可选参数 add 若非 nil,指定如何将 font-spec 添加到 characters 此前已设置的字体规范中。 若为 prepend,则将 font-spec 插入现有规范头部; 若为 append,则追加至尾部。 默认情况下,font-spec 会覆盖此前设置的字体规范。

例如,以下代码修改默认字体集, 使字符集 japanese-jisx0208 的所有字符使用家族名为 ‘Kochi Gothic’ 的字体:

(set-fontset-font t 'japanese-jisx0208
                  (font-spec :family "Kochi Gothic"))

注意,该函数通常应在用户初始化文件中调用, 且一般需在当前 Emacs 会话中显示任何 characters 之前执行。 原因在于,对部分书写体系,Emacs 会缓存其显示方式, 缓存信息包含所用字体—一旦这些字符被显示过一次, 后续无论字体集如何修改,都会继续使用缓存中的字体。

Function: char-displayable-p char

若 Emacs 理应能够显示 char,函数返回非 nil。 更准确地说,是选中框架的字体集拥有可显示 char 所属字符集的字体。

字体集可按单个字符指定字体;若存在这种设置, 该函数的返回值可能不准确。

即使无可用字体,函数仍可能返回非 nil, 因为它同时会检查文本终端的编码系统能否编码该字符(see 终端 I/O 编码)。