中文排版的几个笨问题
标点为什么占一个格子,行距为什么总是不够
给这间书房排版,最先遇到的问题是标点该占多宽,而不是选一款什么字体。这类问题很笨,但绕不过去:它决定了每一行字与字之间的空隙,读者未必说得出来哪里不对,只是读着别扭。
一、标点也是一个字
西文的句号是一个点,后面跟一个空格;中文的句号是一个圆圈,占满一个汉字的宽度。这不是排版的怪癖,是文字系统自带的:方块字等宽,标点也得进这个格子,否则一行里会出现大小不一的洞1。
于是中文排版必须处理两件事:
- 避头尾。行首不能是「,。、;:)」这类标点,行尾不能是「(『「」这类。遇上冲突,要么把字挪到下一行,要么压缩前面的字距2。
- 标点挤压。两个标点相邻时(比如「。」后面紧跟「」」),各占三分之二甚至半个格子,避免中间空出一大片。
浏览器默认不做这些。要做得靠 CSS:text-spacing-trim 是较新的属性,Chrome 支持得比较好,Safari 还在追;成熟的方案是自己写一套行首行尾的规则,或者干脆交给一个专门做中文排版的库3。
「夫人之立言,因字而生句,积句而成章,积章而成篇。」
—— 刘勰《文心雕龙·章句》
字、句、章、篇,四层各有各的边界。排版做的事,说到底就是把这几条边界画出来,让读者不用自己去猜。
二、缩进几格
段首缩进两个汉字,是现在中文书籍的通行做法。源头说法很多,不必纠结——真正要紧的是:同一篇文章里只用一种。
段首缩进和段间空行,本质上在解决同一个问题:告诉读者「这里断了」。两个一起用,读者会分不清这是分段还是分节,眼睛得多做一次判断。这间书房选的是段间空行,段落不缩进,代价是丢掉了一点纸书的味道。
三、行距与字号
西文正文的 1.4 到 1.5 倍行距,在中文上往往显得挤。原因很直接:方块字的字面率高,笔画几乎填满了字格,行与行之间没有天然的空白;拉丁字母有小写字母的升部与降部,行距里本来就藏着空隙。
所以中文正文的行距要给到 1.8 到 2.0。这里说的倍数,是相对字号而言:字号 17 像素、行距 1.95,实际行距就是 33 像素左右。把留白分成层级来给、而不是一律加厚,这个想法是从造园那边来的,那边 有一节专门讲。
| 用途 | 字号 | 行距 | 行宽 |
|---|---|---|---|
| 正文(桌面) | 17px | 1.95 | 32 字 |
| 正文(手机) | 16px | 1.9 | 随屏幕 |
| 注释与脚注 | 14px | 1.7 | 同正文 |
| 二级标题 | 26px | 1.35 | 不限 |
| 代码块 | 14px | 1.6 | 88 字符 |
行宽那一列不好省。正文行宽超过四十字,读者读完一行回头会找错行首;代码块超过八十八个字符,手机上一定横向滚动。行宽其实还拖着速度:回头找一次行首,就是 一篇文章要读多久 那个公式里算不进去的一笔。
四、把标点打对
排版规则再细,标点打错也是白搭。三个最省事的习惯:
- 中文输入法下,[ 与 ] 直接给出「」;Shift + 4 打出来的是人民币符号 ¥,不是美元符号。
- 省略号用「……」两个三连点,不要敲六个句点。
- 破折号用「——」两个全角横,前后不加空格。
中英文之间别手打空格
手打的空格在换行处会被吞掉,字体一换还可能变成双倍空隙。空隙交给 CSS,正文里只写一个字挨一个字。
五、一份校对清单
每次发文章前过一遍,五件事,两分钟:
- 全角标点,没有半角逗号混进来
- 引号成对,单双不混用
- 省略号、破折号写法统一
- 中英文之间不加空格,交给 CSS 处理
- 数字与单位之间不留空格,但量词紧跟
- 行首行尾的标点处理,目前仍靠浏览器
排版是手艺活,规矩多但不神秘。难的不是知道这些,是在几百个段落里一致地做到。