最新文章
最新碎记
14. Word 的文字行高是如何计算的
发布于:在 OOXML 里有一个段落属性标签 Spacing,该标签上有 lineRule、line 这两个常用的属性,它俩会直接影响文字的行高。
lineRule 可以是 exact(精确值)、atLeast(最小值)、auto(自动),前两个比较好理解,auto 的规则不是很明确。
当 lineRule 为 auto 时,line 中的数值除以 240 表示多倍行距的倍率,比如值为 240 对应的就是单倍行距,值为 360 对应的就是 1.5 倍行距。
核心问题在于,这个多倍的基数是什么?或者说单倍行距到底是多高呢?
在 OOXML 规范中,关于这一点并不是很明确,行高的计算有很多复杂的逻辑,WPS 实现的效果也难以做到和 Office Word 完全一致。
简单来讲,它应该是根据当前 run 文字的字体、字重、字号等属性测量出来的文字行高,对于 CJK 文字,可能会额外乘以一个 extendScale,通常为 1.3。除此之外,还有大量优化细节的逻辑,等后续我对此有更深理解之后再单独展开讲讲。
这里讲一种特殊场景,此场景下的行高规则稍微简单一些,那就是对齐文档网格。
文档网格整体概念比较简单,包含了行网格和字符网格,段落可以设置对齐行网格属性,run 也可以设置对齐文字网格属性。
当一个文档节中设置了行网格,并且段落也开启了对齐网格(默认开启)时,实际文字的行高应该是「文字轮廓行高向上对齐整数个网格线」与「多倍行距(多倍网格线)」中的较大值。
多倍行距这个属性,在对齐网格的场景下,基准将变成单个网格线行高。这一点并不是 OOXML 规范内的要求,而是我通过测试一些 Office Word 实际渲染效果后猜测出来的规则。
实际测试了金山文档、石墨文档、腾讯文档,自由组合对齐网格、段落间距、段前段后、字号等属性,均符合这条规则。
不过也发现,各家的 Word 编辑器行内文字在垂直方向上的基线对齐方式存在一些差异,后面有时间再进一步了解吧。
13. 关于中文排版中的 autoSpace
发布于:多年前接触到中文文案排版指北这个项目,它包含了一些约定的中文排版规则。按照这套逻辑,文字排版效果会更舒服,很多网站、公众号文章都遵守这些规则,甚至绝大多数的大模型都遵守这个约定,输出的内容总是包含这些空格。
其中有两条规则分别是「中英文之间需要增加空格」和「中文与数字之间需要增加空格」。
最近刚好做了一些和中文排版相关的需求,对这方面有了更多的了解。
这两条规则,实际对应了 Office Open XML 中的两种段落属性,分别是
autoSpaceDE和autoSpaceDN,D 指的是 Document,E 指的是 EastAsia 东亚文字,N 指的是 Number。按照 OOXML 的规范要求,这个属性默认是开启的,所以其实并不需要人类手动添加空格,这应该是各端的排版引擎去做的事情。
除此之外,还有四种关系密切的段落属性:kinsoku(按中文习惯控制首尾字符)、wordWrap(允许西文在单词中间换行)、overflowPunct(允许标点溢出边界)、topLinePunct(允许行首标点压缩),它们相互影响,组合起来会有各种各样的效果。
我早已养成了随手打空格的习惯,当然微信输入法也内置了自动加空格的逻辑,这是因为依然有大量的端软件没有做这种自动空格的适配。
比如
text-autospace这个 CSS 属性也是刚刚出现不久,远远没有达到可以生产使用的状态。