网页把排版拆成了几层
印刷品出厂时,排版已经定了。网页不一样。同一段 HTML,在手机、电脑、阅读器、不同浏览器、不同字体下,会长成不同的样子。
HTML,大白话说,是告诉浏览器“这里是什么内容”的标记。CSS,大白话说,是告诉浏览器“这些内容长什么样”的规则。理想情况下,文字内容应该交给 HTML,视觉间距应该交给 CSS。
按这个理想,中英文之间的那点白不应该由作者手敲。作者只写“中文English”,浏览器按照中文排版规则,在显示时自动垫一点视觉间距;复制出来仍然是原文,不多一个字符。这听起来很美。
现实是,这件事没有那么早成为稳定的浏览器能力。很长时间里,网页作者面对的选择粗糙得多:要么不加,忍受拥挤;要么手动加空格,让文本本身改变。
为什么浏览器不能“顺手做了”
浏览器当然会做很多排版判断,比如换行、字距、连字、标点挤压。那为什么不中西文自动加一点白?因为它看起来像小事,实际上牵动很多边界。
第一,语言边界不好判。一个页面可能有中文、日文、英文、代码、品牌名、邮箱、链接、数学表达式。浏览器如果一律加空,可能在不该断开的地方制造缝隙。
第二,空白大小不好定。印刷规范里说的是细间距,可能是一个汉字宽度的八分之一或类似量级。但网页里的字体各异,字号各异,粗细各异。固定值会在某些字体上刚好,在另一些字体上刺眼。
第三,兼容性很重。网页是一个承诺:旧页面今天也要能工作。浏览器如果突然改变混排间距,很多精确布局、按钮宽度、标题换行都会变。用户看到的是“浏览器升级后页面坏了”。
浏览器不是不知道空白好看,而是不敢轻易替所有网页决定:哪里加、加多少、算不算内容。
CSS 想管的是“显示”,作者手里却是“字符”
排版系统最干净的分工应该是这样:文本存文本,样式管样式。中西文间距属于样式,因为它不改变句子的意思。
可普通写作者最容易控制的不是样式,而是字符。你在 Markdown、微博、博客后台、聊天窗口里,通常不能写复杂 CSS。你能做的,就是按一下空格。
Markdown,大白话说,是一种用普通文本写格式的办法。它鼓励人们用简单字符写文章,再转换成网页。Markdown 很适合写作,却也让“空格到底是内容还是样式”变得更模糊。因为空格看起来像排版动作,实际却进入了源文本。
这就是网页时代的尴尬:我们用内容层的工具,修显示层的问题。
手动空格的三个副作用
手动加空格能立刻改善阅读,但它不是免费午餐。
- 复制会带走它。别人复制“微信 Mac 版”,得到的是带空格的字符串。多数时候没事,但放进命令、路径、产品名、搜索词里,有时就会变味。
- 换行会利用它。普通空格是可断行位置。窄屏上,“Mac”可能被甩到下一行,视觉上未必比不加更好。
- 规则会不一致。一个作者今天加,明天忘;一个团队里有人加英文,有人连数字也加,有人品牌名不加。文章越长,斑驳越明显。
这些副作用并不说明不该加。它们只说明:手动空格是一个工程折中,不是排版真理本身。
网页没有老师傅,就需要工具
在印刷厂里,经验丰富的排字工会替你照看这些细节。在网页里,发布链条变长了:作者写 Markdown,系统转 HTML,浏览器渲染,读者用不同设备打开。中间没有一个固定的老师傅。
于是工具出现了。它们不试图理解全文意思,只做一件窄事:扫描字符串,找出汉字和半角英文、数字、符号贴住的地方,插入空格。
这就是 pangu.js 这类工具的出场位置。它不是美学大师,更像流水线上的小刀。它不会替你决定文章好不好,但能把最常见的混排粘连切开。
下一章我们拆这把小刀:它为什么能靠规则工作,它的边界在哪里,以及为什么“自动”并不等于“无脑”。