中文行高需求高于同字号西文
别名: 中文行距 · 汉字行高 · ideographic line spacing
概念解释
同一名义字号、同一个 line-height: 1.4,西文段落往往还能看出行,中文段落却已经开始发闷。原因不是中文读者更挑剔,而是两种文字占满字身的方式不同。西文真正用来阅读的是 x-height 那一条较矮的带,字身上下本来就空着一截给升部降部;汉字的字面几乎铺满整个字身框(em square)。同样的行框里,中文拿来当行间的气要少一截,所以中文需要更高的行高,才能得到和西文看起来相当的行间缝。
这条讲的是脚本之间的度量差,不是「行高太小会撞行」的一般拥挤,也不是行高要跟行长联动的那条调节规则。即便行长、字号都合适,把给拉丁文调好的倍数原样浇到汉字上,缝还是会不够。
机制
字体度量里,西文的基线、x-height、升部、降部把一个 em 切成几条水平带,墨水平均只占其中一段。汉字设计在正方形的字面里写满笔画,上下边距(肩)很窄。行高若按「字号 × 倍数」计算,计算用的是字身高度,不是字面高度。西文用 1.4 时,x-height 到下一行 x-height 之间的空隙包含了两行的肩加上行框多出来的那截;中文用 1.4 时,多出来的几乎只是行框减去两个几乎顶满的字面,缝自然更窄。
混排时这条差会当场对照出来:同一行里「Design」的 x 带偏矮,左右的「设计」字面偏满,垂直重心不在一条线上,行间更显得汉字在挤、拉丁在漂。若产品只有一套行高,它通常是按拉丁调的,中文界面会系统性偏紧。
还有字重的交互:中文粗体把本来就满的字面再加粗,垂直方向更易糊成条;西文粗体主要加在字干上,x-height 带变重,行间肩还在。所以中文在加粗场景对行高更敏感。
怎么研究
不必发明一套「中文心理学」。直接量字面到字面的空隙,而不是量行框到行框。把同一倍数下的拉丁试样和汉字试样叠在一起,比较:x-height 带之间的空 vs 汉字字面之间的空。自变量:脚本(中 / 西 / 混排)、名义行高倍数、字体的字面比例。因变量:字面间隙的绝对像素、主观拥挤、汉字条件下的阅读速度。
CJK 字体的垂直度量(ideographic em-box、winAscent/winDescent、行框在不同系统里如何取)会让「同一个 1.4」在浏览器之间差出几像素。比较行高时要报告字体文件和渲染引擎,否则差的是度量解释,不是脚本本身。
边界
中文标题、牌匾、单行按钮不靠段落行间来分轨道,拉丁倍数的不足在这里不明显。拼音、西文为主、汉字只作偶发专名的界面,按拉丁行高走、只在纯中文段落上加一档,往往比全局抬高更干净。竖排中文的「行」变成水平方向的列距,度量逻辑类似但轴向换了,横排上调好的倍数不能直接当列距用。极疏的展示排版(海报、封面)会故意让汉字行间大于阅读所需,那是风格,不是正文下限。
怎么落地
- 不要让中文和西文共用一个无单位行高。中文正文单独给更高的倍数,或按字面间隙而不是按字身倍数来验收。
- 混排界面以汉字段落为准做行高,拉丁短词迁就汉字,而不是反过来让整段中文迁就一句英文引语。
- 换中文字体时重新看肩:有的面孔字面更满,原来刚好的倍数会立刻发闷。
- 验证:同一倍数下并排一段英文和一段中文,中文先变成一块灰、英文还能数出行,就是倍数只服务了拉丁度量。