42.12.12 底层字体表示

通常情况下,无需直接操作字体。若确有需要,本节将说明操作方法。

在 Emacs Lisp 中,字体使用三种不同的 Lisp 对象类型表示: 字体对象(font objects)字体规范(font specs)字体实体(font entities)

Function: fontp object &optional type

object 为字体对象、字体规范或字体实体,则返回 t,否则返回 nil

可选参数 type 若非 nil,则指定要检查的确切 Lisp 对象类型。 此时 type 应为 font-objectfont-specfont-entity 之一。

字体对象是表示 Emacs 已 打开(opened) 的字体的 Lisp 对象。 字体对象无法在 Lisp 中修改,但可以被查看。

Function: font-at position &optional window string

返回用于显示 window 窗口中位置 position 处字符的字体对象。 若 windownil,则默认为选中窗口。 若 stringnilposition 指定当前缓冲区中的位置; 否则 string 应为字符串,position 指定该字符串中的位置。

字体规范是包含一组用于查找字体的规则的 Lisp 对象。 可能有多个字体匹配某一字体规范中的规则。

Function: font-spec &rest arguments

使用 arguments 中的规则返回新的字体规范, 参数应以 属性- 对形式给出。可用规则如下:

:name

字体名称(字符串),格式可为 XLFD、Fontconfig 或 GTK+。 See Fonts in The GNU Emacs Manual

:family
:foundry
:weight
:slant
:width

含义与同名文本视觉样式属性一致。See 文本视觉样式属性:family:foundry 为字符串,其余三个为符号。 示例值::slant 可为 italic:weight 可为 bold:width 可为 normal

:size

字体大小—可以是非负整数(表示像素大小),或浮点数(表示磅值大小)。

:adstyle

字体的附加排版样式信息,如 ‘sans’。值应为字符串或符号。

:registry

字体的字符集注册库与编码,如 ‘iso8859-1’。值应为字符串或符号。

:dpi

字体设计的每英寸分辨率。值必须为非负数。

:spacing

字体间距:比例间距、双间距、等宽或字符单元。 值可为整数(0 为比例,90 为双间距,100 为等宽,110 为字符单元) 或单字母符号(PDMC 之一)。

:avgwidth

字体平均宽度,单位为 1/10 像素。值应为非负数。

:script

字体必须支持的书写体系(符号)。

:lang

字体应支持的语言。值应为符号,名称为两位 ISO-639 语言代码。 在 X 系统上,该值与字体 XLFD 名称的“附加样式”字段匹配(非空时)。 在 Windows 上,匹配该规范的字体需支持该语言所需的代码页。 当前该属性仅支持少量中日韩语言:‘ja’、‘ko’、‘zh’。

:otf

字体必须为支持这些 OpenType 特性的 OpenType 字体, 前提是 Emacs 由支持复杂文本排版的库(如 GNU/Linux 上的 ‘libotf’)编译。 值必须为如下形式的列表:

(script-tag langsys-tag gsub gpos)

其中 script-tag 为 OpenType 书写体系标签符号; langsys-tag 为 OpenType 语言系统标签符号,或为 nil 表示使用默认语言系统; gsub 为 OpenType GSUB 特性标签符号列表,无要求时为 nilgpos 为 OpenType GPOS 特性标签符号列表,无要求时为 nil。 若 gsubgpos 为列表,其中的 nil 元素表示字体不得匹配后续任意标签。 gpos 元素可省略。 OpenType 书写体系、语言与特性标签列表请参见 已注册 OTF 标签列表

:type

指定用于绘制字符的 字体后端(font backend) 的符号。 可用值取决于平台与 Emacs 编译配置。 典型值包括 X 上的 ftcrhbxfthb,Windows 上的 harfbuzz, GNUstep 上的 ns 等。 若未指定(通常在字体规范中),也可为 nil

Function: font-put font-spec property value

将字体规范 font-spec 中的字体属性 property 设为 valueproperty 可为上述任意属性。

字体实体是对尚未打开的字体的引用。 其属性介于字体对象与字体规范之间: 与字体对象类似(与字体规范不同),它指向单一特定字体; 但与字体对象不同,创建字体实体不会将字体内容加载到内存。 对于可缩放字体,Emacs 可从单个字体实体打开多个不同尺寸的字体对象。

Function: find-font font-spec &optional frame

该函数返回与 frame 框架上的字体规范 font-spec 最匹配的字体实体。 若 framenil,则默认为选中框架。

Function: list-fonts font-spec &optional frame num prefer

该函数返回所有匹配字体规范 font-spec 的字体实体列表。

可选参数 frame 若非 nil,指定字体要显示的框架。 可选参数 num 若非 nil,应为整数,指定返回列表的最大长度。 可选参数 prefer 若非 nil,应为另一字体规范,用于控制返回列表顺序; 返回的字体实体按与该规范的接近程度从高到低排序。

若调用 set-face-attribute 并将字体规范、字体实体或字体名称字符串 作为 :font 属性的值,Emacs 会打开可用的最佳匹配字体用于显示, 并将对应的字体对象保存为该文本视觉样式 :font 属性的实际值。

下列函数可用于获取字体相关信息。 对这些函数而言,参数 font 可为字体对象、字体实体或字体规范。

Function: font-get font property

该函数返回 font 中字体属性 property 的值。 property 可为 font-spec 支持的任意属性。

font 为字体规范且未指定 property,返回值为 nil。 若 font 为字体对象或实体,:script 属性的值可为字体支持的书写体系列表, :otf 属性的值为形如 (gsub . gpos) 的 cons 单元, 其中 gsubgpos 为表示字体支持的 OpenType 特性的列表,格式如下:

((script-tag (langsys-tag feature...) ...) ...)

其中 script-taglangsys-tagfeature 为表示 OpenType 布局标签的符号。

font 为字体对象,当字体后端支持非 OpenType 字体的组合字符渲染时, 特殊属性 :combining-capability 为非 nil

Function: font-face-attributes font &optional frame

该函数返回与 font 对应的文本视觉样式属性列表。 可选参数 frame 指定字体要显示的框架,为 nil 时使用选中框架。 返回值格式如下:

(:family family :height height :weight weight
   :slant slant :width width)

其中 familyheightweightslantwidth 为文本视觉样式属性值。若字体未指定某属性,对应键值对可省略。

Function: font-xlfd-name font &optional fold-wildcards long-xlfds

该函数返回匹配 font 的 XLFD(X 逻辑字体描述符)字符串。 XLFD 相关信息参见 See Fonts in The GNU Emacs Manual

若可选参数 fold-wildcardsnil,XLFD 中连续的通配符会合并为一个。

若可选参数 long-xlfds 省略或为 nil, 当 XLFD 长度超过 255 字符时函数返回 nil,以兼容 X 协议对 XLFD 长度的限制。 若 long-xlfdsnil,则取消该限制,函数可返回任意长度的 XLFD。

下列两个函数返回字体的重要信息。

Function: font-info name &optional frame

该函数返回 frame 上由字符串名称 name 指定的字体信息。 若 frame 省略或为 nil,则默认为选中框架。

返回值为如下形式的向量: [opened-name full-name size height baseline-offset relative-compose default-ascent max-width ascent descent space-width average-width filename capability]。 各分量说明如下:

opened-name

打开字体所用的名称,字符串。

full-name

字体完整名称,字符串。

size

字体像素大小。

height

字体高度,单位像素。

baseline-offset

相对于 ASCII 基线的偏移,单位像素,向上为正。

relative-compose
default-ascent

控制字符组合方式的数值。

max-width

字体最大前进宽度。

ascent
descent

字体的上伸部与下伸部,二者之和等于上述 height

space-width

字体空格字符的宽度,单位像素。

average-width

字体字符平均宽度。Emacs 用于计算显示文本布局; 若该值为 0,则使用 space-width 代替。

filename

字体文件路径字符串。若字体后端无法提供文件路径,可为 nil

capability

列表,首个元素为表示字体类型的符号, 可为 xopentypetruetypetype1pcfbdf 之一。 对于 OpenType 字体,列表还包含两个附加元素,分别描述字体支持的 GSUB 与 GPOS 特性。 每个元素格式为 ((script (langsys feature …) …) …), 其中 script 为 OpenType 书写体系标签符号, langsys 为 OpenType 语言系统标签(nil 表示默认语言系统), 每个 feature 为 OpenType 特性标签符号。

Function: query-font font-object

该函数返回 font-object 的相关信息。 (与 font-info 不同,此函数参数为字体对象而非字符串名称。)

返回值为如下形式的向量: [name filename pixel-size max-width ascent descent space-width average-width capability]。各分量说明如下:

name

字体名称,字符串。

filename

字体文件路径字符串。若字体后端无法提供,可为 nil

pixel-size

打开字体所用的像素大小。

max-width

字体最大前进宽度。

ascent
descent

字体的上伸部与下伸部,二者之和为字体高度。

space-width

字体空格字符宽度,单位像素。

average-width

字体字符平均宽度。若为 0,Emacs 计算显示布局时会使用 space-width 代替。

capability

一个列表,其首个元素是一个表示字体类型的符号,取值为 xopentypetruetypetype1pcfbdf 之一。对于 OpenType 字体,该列表还包含 2 个额外元素,用于描述 字体支持的 GSUBGPOS 特性。这些元素的每个元素都是格式为 ((script (langsys feature …) …) …) 的列表,其中 script 是表示 OpenType 书写系统标签的符号, langsys 是表示 OpenType 语言系统标签的符号(或 nil,代表默认语言系统), 每个 feature 是表示 OpenType 特性标签的符号。

以下四个函数返回各类 文本的视觉样式 所使用字体的尺寸信息,便于在 Lisp 程序中进行各类布局处理。 这些函数会考虑 文本的视觉样式 重映射,若目标 文本的视觉样式 已被重映射,则返回重映射后的 文本的视觉样式 相关信息。 See 文本视觉样式重映射

Function: default-font-width

该函数返回当前缓冲区默认 文本的视觉样式 所使用字体的平均宽度(以像素为单位), 该 文本的视觉样式 是为当前选中的 框架 定义的。

Function: default-font-height

该函数返回当前缓冲区默认 文本的视觉样式 所使用字体的高度(以像素为单位), 该 文本的视觉样式 是为当前选中的 框架 定义的。

Function: window-font-width &optional window face

该函数返回 windowface 所使用字体的平均宽度(以像素为单位)。 指定的 window 必须是有效 框架。若 nil 或省略,window 默认为选中的 框架, face 默认为 window 中的默认 文本的视觉样式。

Function: window-font-height &optional window face

该函数返回 windowface 所使用字体的高度(以像素为单位)。 指定的 window 必须是有效 框架。若 nil 或省略,window 默认为选中的 框架, face 默认为 window 中的默认 文本的视觉样式。