1990年代末,一个叫rs1n的攻略作者在GameFAQs上传了一份Super Metroid攻略。全文接近17000字,每一行都精确顶到右边界,没有一处双空格,没有连字符,通篇整整齐齐像印刷品。有人问他用了什么排版程序,他的回答只有一句:"没有,我只是仔细挑选词语,让它们在右边对齐,全部用ASCII编辑器完成。"
这句话轻描淡写,但背后是一个排版史上很少有人愿意手动碰的硬骨头。
等宽字体为什么天生对不齐
比例字体排版两端对齐,靠的是微调字距和字形宽度,像捏橡皮泥,总能捏匀。等宽字体不行——每个字符占格一样大,空格只能整个塞,没法切成半份。
数学上很清楚:行宽是W,这一行非空格字符数是L,词间空隙数是G,需要补的空格总数S等于W减L。每个空隙至少分到S除以G个空格,除不尽的余数会落在某几个空隙头上,让它们多吃一个空格。空隙天然不可能平分,这就是等宽两端对齐看着别扭的根源,居中同理,连字符也解决不了,反而在ASCII里显得突兀,还会搞乱复制粘贴。
rs1n绕开了这条数学死路,他不调空格,他换词——把整句话重写,直到非空格字符数正好等于行宽,一个空格都不用多塞。
软件早就该干这活
排版自动化不是新鲜事。活字印刷靠人手动调整铅字间距;1941年IBM Executive比例打字机部分缓解了等宽网格的限制;到了计算机时代,PDP-1上Peter Samson写的Type Justifier、1963年的TJ-2,已经能用有限的内存处理边距和连字符;1981年Knuth与Plass提出段落级最优化算法,把两端对齐从"逐行硬凑"升级成整段统筹计算,这套逻辑后来成了TeX的核心。
排版自动化走了几十年,走到了能替人把这件苦活全包的地步。rs1n在1990年代末,选择完全不用这条路,手工把算法该干的事重新做了一遍。
严格说,他做的不是传统意义上的"两端对齐"——那通常靠软件调空格、调字距。他做的是词汇层面的手工copyfitting:靠替换用词和句法,把内容硬塞进固定宽度里。这个区分不是抠字眼,它说明这件事的难度不在排版技术,而在写作本身——每一行都是一次限字重写。
完美对齐的代价
一份精确到字符的文本,读起来应该无可挑剔。但检索原文会发现,这份攻略里存在拼写错误,比如把"missile"写成"missle",连附带的FAQ提问本身也有语法瑕疵,比如"Why did you chose…"。
- 风险.为了让每一行都精确顶到边界,作者很可能牺牲了部分用词的准确性和语句的顺畲,这是原文只顾着惊叹时完全没提的一面。
极致的形式约束,常常是拿内容的一部分去换的。
这不是说rs1n的攻略不值得佩服——17000字里能维持这种约束到最后一行,本身就是耐力活。但"完美对齐"这个说法需要打个折扣:它更准确地适用于连续正文段落,标题、表格、ASCII图这些结构性内容天然不受这条规则约束,不是通篇每一个字符都经过同等打磨。
今天的回响
这种"看不见的约束",在今天最常见的落地场景是UI文案。一个按钮的字数超一个像素就换行,一条tooltip在窄屏上挤成两行——写文案的人干的事,跟rs1n没有本质区别:不是排版软件不给力,而是软件解决不了"选哪个词"这一步,这一步永远得靠人。
排版自动化的历史,是一部把人力活外包给算法的历史。rs1n的攻略提醒人们,这条外包链条到今天也没走到头——某些约束,机器算得再准,最后落地那一下,还是要靠人一个字一个字地挑。
