字体集(fontset) 是一组字体的列表,每一种字体分配给一段字符编码范围。 单个字体无法显示 Emacs 支持的全部字符,但字体集可以。 字体集与字体一样拥有名称,在为框架或文本视觉样式指定字体时, 可用字体集名称替代字体名称。 以下介绍在 Lisp 程序控制下定义字体集的相关信息。
该函数根据规范字符串 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 字段使用通配符 ‘*’。
该函数修改现有 fontset,使其使用 font-spec 指定的字体 显示指定的 characters。
若 fontset 为 nil,函数修改选中框架的字体集;
若 frame 非 nil,则修改 frame 对应的字体集。
若 fontset 为 t,函数修改默认字体集,
其短名字符串为 ‘fontset-default’。
参数 characters 可为单个字符,该字符将使用 font-spec 显示;
也可为 cons 单元 (from . to),
其中 from 与 to 均为字符,此时 from 至 to(含)范围内的所有字符
均使用 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 会缓存其显示方式, 缓存信息包含所用字体—一旦这些字符被显示过一次, 后续无论字体集如何修改,都会继续使用缓存中的字体。