Hyaika Blog

Penguin is all you need

设计

「我只是选词选得小心」——90 年代,有人用纯文本排完了 17,000 词的完美版面

「我只是选词选得小心」——90 年代,有人用纯文本排完了 17,000 词的完美版面

「我只是选词选得小心」——90 年代,有人用纯文本排完了 17,000 词的完美版面

引言

先看一段问答。有人问一位写了超级长攻略的作者:

你用什么程序给文字做的两端对齐?

没有。我就是选词选得小心,让每一行右边都对得整整齐齐。全部是用一个 ASCII 编辑器手写的。

这段话印在一份 17,000 词的《超级银河战士》攻略末尾。1990 年代末,一个叫 rs1n 的人,用最原始的文本编辑器,写完了整份攻略——而且每一行的右边缘,都精确地停在同一个位置。没有两端对齐功能,没有连字符,没有自动排版,就是一行一行地选词,让单词恰好填满行宽。

这件事让我愣了挺久。它像一块琥珀,把「自动化之前的排版手艺」完整地封存在里面。

目录

为什么纯文本里,两端对齐这么难

先给不常排版的人解释一下问题在哪。

在书籍、网页里,两端对齐(justify)是排版引擎的日常工作:文字填满整行,两边都是笔直的边缘。引擎靠什么做到?靠微调每个词之间的空格宽度。单词之间多塞一点、少塞一点,总量刚刚好,右缘就齐了。

但等宽字体(monospace)没有这个能力。等宽字体里,每个字符占的宽度完全相同,空格也是固定宽度的——你不能把一个空格变成 1.3 个空格,只能放整数的空格。

这意味着,在纯文本里做右对齐,你只能数空格:

普通等宽文本,右缘参差不齐

普通文字还行,凑合能看。可一旦要求严一点就麻烦了。

右对齐?你得一个字符一个字符地数,算这行到底该放几个空格把右缘顶齐;居中?更难——没有「半空格」这种东西,奇数宽度的行永远差半个字符,看起来总差一点点:

右对齐需要数空格,居中因为没有半空格而无法完美

至于两端对齐(full justification),空格会被拉得特别大,而且分布不均,行与行之间像被硬撑开的,读起来非常难受:

两端对齐时空格被拉得过宽

所以你在纯文本文件里几乎看不到两端对齐——不是没人想做,是做不了。工具在这个场景里彻底失灵了。

工具穷尽:左对齐、居中、右对齐,各有各的别扭

排字工业里,这个问题有个经典解法:连字符(hyphenation)。一个长单词放不下,就从中间切开,右边补一个连字符,剩下的挪到下一行。这样每行都能填满,看起来也整齐。

但连字符在等宽字体里一样难堪。连字符本身太显眼——它是一个额外的字符,打断了词的完整性,而且复制粘贴的时候会带进文本里。别人把你的攻略复制走,满屏都是「infor-mation」这种被腰斩的词:

连字符在等宽文本里既难看又污染复制内容

于是所有传统路径都堵死了:

  • 微调空格 — 等宽字体没有弹性空格,只有整数的 1、2、3…
  • 连字符 — 太难看,还会污染复制内容
  • 左右留白 — 只能保证一边齐,另一边永远锯齿

工具帮不上忙。要么接受参差不齐的右缘,要么……

最后一个选项:重写文字本身

还有第四个选项,绝大多数人不会想到:把文字改写一遍,让每个词的长度恰好把行填满

不调整空格——调整词。一句话里换个同义词,加一个可有可无的「the」,删掉一个副词,把「carefully」换成「with care」,让这一行的字符总数精确地等于目标宽度。

这听起来荒谬。写攻略本来就是在组织文字,现在连每个词的长度都要管?可偏偏有人把这件事做成了艺术。

17,000 词的现场:rs1n 的超级银河战士攻略

1990 年代末,rs1n 在 GameFAQs 上发布了《超级银河战士》攻略。这份攻略的长度是 17,000 多词,覆盖游戏的全部流程、所有隐藏房间、每一种 Boss 打法。

而它的排版方式是:每一行的右边缘,都严格对齐。

超级银河战士攻略实拍:17,000 词每一行右缘对齐

注意这不是截图处理,是原始文本就是这样。作者在 FAQ 末尾轻描淡写地承认了这件事:「我用什么程序排版的?没有。我就是选词选得小心,让右边都对齐。全部用 ASCII 编辑器完成。」

你想想这意味着什么。17,000 词,假设每行 40-50 个字符,那就是三四百行。每一行,他都要先想好这一行该说什么,再让这些词恰好装满行宽,不多不少。换一个词,这一行就不齐了;想加一句,前面几行可能都得重排。

这不是排版,这是在织布。

在屏幕写作里,你几乎看不到这种东西——正常写作没人会为了右缘对齐去改词的。但注意,rs1n 不是闲得慌。游戏攻略的受众,就是要复制代码、对照地图、按流程走的人。等宽字体下,右缘对齐意味着每一行都是确定性的:这一行该有什么内容、该从哪里开始,一眼就能看明白。对攻略这种「照着做」的文体来说,整齐本身就是功能。

他选词,不只是为了好看——是为了让这份攻略在等宽世界里,读起来像一份印刷品。

我自己试了一遍:手工选词做右对齐

看完这故事,我手痒了。别人 17,000 词都排得,我排个 6 行总行吧?

我先试了最老实的方法:程序自动两端对齐——在等宽字体里塞空格。结果就像文章前面说的,空格数量只能整数,行尾总有 1-2 个字符的差,右缘永远差一点点。工具的极限就摆在这。

于是我学 rs1n,改走选词路线。我给自己定了一个目标:写一句话,手工换词,让每一行都是 40 个字符宽,右缘绝对对齐。

试了几次,我发现这玩意比想象中难得多。英文单词长度是离散的——3 个字母、4 个字母、7 个字母,你不能把它拉长或压扁。要凑满一行 40 个字符,等于在解一个离散的组合问题:这一段话里,哪些词能替换成别的长度的同义词,让总数恰好等于目标值。

我最后写出了一小段,目标行宽 40 字符(左边缘我没管,先保证右缘):

This guide was written with care, indeed|
each word chosen so the right edge meets|
falls exactly at column forty, no hyphen|
no padding, no tricks, just words picked|
land flush at the margin, one by one, as|
if setting type by hand in a quiet room.|

右边那排竖线是我画的参考。为了不吹牛,我写了个脚本逐行断言长度,结果 6 行全部恰好 40 字符——那一刻我忽然明白 rs1n 在做什么了:他写的根本不是「攻略」,他是在用词汇当排版工具,把文字本身变成了活字。

这也解释了为什么他的攻略二十年了还有人当模板抄——因为那份「整齐」不是装饰,是作者对读者的承诺:每一个字都是被认真对待过的。

中文世界,为什么没有这个烦恼

看到这里,中文读者可能有点懵:这算什么难题?

确实——中文没有这个问题。汉字是方块字,天生等宽。一个「字」占一个格子,空格是它的两倍宽。想右对齐?直接数格子就行,每个字宽度一模一样,不存在「单词长度离散」的困境。中文排版里最接近「选词」的做法,是写诗时凑平仄和字数——那又是另一种手艺了。

所以 rs1n 的困境,本质上是拼音文字的困境:单词由不定长的字母组成,又用空格隔开,导致每一行的「颗粒度」天然参差。而中文的颗粒度是均匀的,排版引擎和手写者都轻松得多。

这也是为什么在中文互联网时代,几乎没有人需要「手工选词对齐」——不是中文用户更懒,是方块字把这道题提前解掉了。rs1n 用选词对抗的,是英文世界里根深蒂固的「排版债」。

选词,是一种排版工具

我们活在自动化时代。排版引擎几毫秒就能完成 rs1n 花了无数个夜晚手工完成的事——两端对齐、连字符、微调间距,全都交给计算机。没有人在 2026 年还会为了一份文本文件手工选词对齐。

但 rs1n 的故事提醒我一件事:在工具失灵的地方,人的手艺会绕到工具前面去。

选词这件事,排版引擎做不到。引擎只能调整空格和连字符,它不能替你决定「这一行该说什么、换成哪个词更好」。而 rs1n 把「选词」本身变成了一种排版能力——他不需要排版工具,因为他把排版内化成了写作的一部分。

这种手艺在今天并没有消失,它换了名字。写 UI 的人为了一个按钮文案反复斟酌长度、做幻灯片的人为了对齐绞尽脑汁、甚至我们写代码注释时让块注释对齐——本质上都是「选词」排版。工具越强大,那些「在工具夹缝里用手艺解决问题」的时刻反而越珍贵。

纯文本已经死了吗?早该死了吧。但总有人愿意在 ASCII 的世界里,一个字一个字地把右缘对齐。

附:这份攻略至今还能在 GameFAQs 找到(Super Metroid FAQ #10114,作者 rs1n)。上面的选词排版示例是我自己写的,仅致敬,不敢与原作 17,000 词相比。

分享:

评论(0)

暂无评论,来写第一条吧~

发表评论