42.11 行高

每条显示行的总高度由该行内容的高度,加上显示行上方或下方可选的额外垂直行间距组成。

行内容的高度是该显示行上任意字符或图像的最大高度,包含最后的换行符(如果存在)。(续行的显示行不包含末尾换行符。)这是默认行高,若你未指定更大高度则使用此值。(最常见情况下,该值等于对应 框架 默认字体的高度,参见 框架字体。)

有多种方式可显式指定更大的行高,既可直接为显示行指定绝对高度,也可指定垂直间距。但无论如何设置,实际行高永远不会小于默认值。

换行符可拥有 line-height 文本或覆盖层属性,用于控制以此换行符结尾的显示行总高度。该属性值可为以下几种形式之一:

t

若属性值为 t,则该换行符对行的显示高度无影响—仅可见内容决定高度。此时换行符的 line-spacing 属性(下文说明)也会被忽略。这在平铺小图像(或图像切片)且不在图像间添加空白区域时非常有用。

(height total)

若属性值为上述形式的列表,则会在显示行 下方 添加额外间距。Emacs 首先使用 height 作为高度规格控制行 上方 的额外空间,随后在行 下方 补充足够空间,使总行高达到 total。此情况下,换行符的 line-spacing 属性值会被忽略。

其他类型的属性值均视为高度规格,会被转换为一个数值—即指定的行高。高度规格有多种写法,其转换为数值的规则如下:

integer

若高度规格为正整数,则高度值即为该整数。

float

若高度规格为浮点数 float,则数值高度为 float 乘以 框架 的默认行高。

(face . ratio)

若高度规格为上述格式的 cons 对,则数值高度为 ratio 乘以字体 face 的高度。ratio 可为任意数值类型,或 nil(表示比例为 1)。 若 facet,则指代当前字体。

(nil . ratio)

若高度规格为上述格式的 cons 对,则数值高度为 ratio 乘以该行内容的高度。

因此,任意合法的高度规格都会以某种方式确定以像素为单位的高度。若行内容高度小于该值,Emacs 会在行上方添加额外垂直空间以达到指定总高度。

若未指定 line-height 属性,则行高由内容高度加上行间距组成。Emacs 文本的不同部分可通过多种方式设置行间距。

在图形终端上,你可通过 line-spacing 框架参数为一个 框架 内的所有行指定行间距(see 布局参数)。但若 line-spacing 的默认值非 nil,则会覆盖 框架 的 line-spacing 参数。整数表示行下方放置的像素数;浮点数表示相对于 框架 默认行高的间距。

你可通过缓冲区局部变量 line-spacing 为缓冲区中所有行指定行间距。整数表示行下方的像素数;浮点数表示相对于默认 框架 行高的间距。该设置会覆盖为 框架 指定的行间距。

最后,换行符可拥有 line-spacing 文本或覆盖层属性,用于放大默认 框架 行间距与缓冲区局部 line-spacing 变量:若其值大于缓冲区或 框架 默认值,则以此更大值作用于该换行符结尾的显示行(除非该换行符同时拥有 line-height 属性,且其值为会忽略 line-spacing 的特殊值,参见上文)。

这些机制最终会为每一行的间距指定一个 Lisp 值。该值为高度规格,并按上文规则转换为 Lisp 数值。但在此场景下,数值高度表示的是行间距,而非行高。

在文本终端上,行间距无法修改。