← 返回故事列表

排版革命:troff如何让文本在纸上跳出优雅之舞

时代:1973
阅读时间:7 分钟
浏览:6
点赞:0

1973年,AT&T贝尔实验室的走廊里,打印机吐出的文档第一次有了“设计感”。在此之前,Unix团队的文档要么像打字机敲出的流水账——所有字符挤在等宽的牢笼里;要么需要手工画线、贴图,耗费数小时。Joe Ossanna站在Graphic Systems公司的排字机前,这台价值数万美元的机器能输出不同

# 排版革命:troff如何让文本在纸上跳出优雅之舞 1973年,AT&T贝尔实验室的走廊里,打印机吐出的文档第一次有了“设计感”。在此之前,Unix团队的文档要么像打字机敲出的流水账——所有字符挤在等宽的牢笼里;要么需要手工画线、贴图,耗费数小时。Joe Ossanna站在Graphic Systems公司的排字机前,这台价值数万美元的机器能输出不同字号、斜体、粗体的文字,但控制它的软件却是一片空白。一个程序员对另一个程序员说:“我们写一个程序,让排版像写代码一样精确。”于是,troff诞生了——它不是简单的打印工具,而是一场关于文字美学的技术革命。 ## 排版之痛:当代码遇到纸面荒漠 1970年代初,贝尔实验室的Unix系统正从实验室走向内部使用。程序员们发现了一个尴尬的事实:他们能写出优雅的代码,却无法输出同样优雅的文档。当时的打印设备主要是行式打印机——每个字符占据相同宽度,像士兵一样整齐排列。这种“等宽字体”对代码友好,但对论文、技术手册、数学公式却是一场灾难。比如“∫f(x)dx”这样的积分符号,在行式打印机上只能拆成“积分号 f 括号 x 括号 d x”,读起来像加密电报。 Unix团队的核心成员Ken Thompson和Dennis Ritchie意识到,随着Unix被AT&T内部更多部门采用,文档质量直接影响到系统的推广。1960年代的“runoff”排版程序(最初用于Multics系统)提供了一些灵感,但它的能力仅限于处理简单的文本流,无法控制字体、字号、页面边距,更别提数学公式了。 Joe Ossanna,这位平时沉默寡言、热爱硬件的程序员,接下了这个烫手山芋。他面临的挑战是:既要驱动Graphic Systems C/A/T排字机——这台机器能输出6种字体、10种字号,但指令集复杂得像密码本;又要让文本格式化的过程对程序员友好。Ossanna的解决方案是“标记语言”——在文本中插入控制命令,类似于今天HTML的雏形。比如,`.ft B`表示“接下来用粗体”,`.ps 12`表示“字号设为12点”。这种设计让排版逻辑与内容分离,程序员可以像调试代码一样调试文档的视觉呈现。 ## 一鸣惊人:从内部工具到工业标准 1973年夏天,troff的第一个版本在贝尔实验室内部亮相。团队的反馈出乎意料地热烈——不是因为它的功能完备(事实上,早期版本只支持一种输出设备),而是因为它第一次让技术文档有了“质感”。Dennis Ritchie曾回忆,当troff输出的《C语言参考手册》第一版从排字机中缓缓吐出时,所有人都在抚摸纸张——那些倾斜的变量名、加粗的关键字、居中的标题,仿佛代码本身有了生命。 但真正的转折发生在1975年,Brian Kernighan加入了troff的改进工作。Kernighan是那种能让复杂事物变简单的天才——他后来参与设计了AWK语言和C语言的许多特性。他注意到troff的致命弱点:代码与输出设备高度耦合。如果要更换排字机,整个程序必须重写。Kernighan提出了“设备无关性”的架构:把troff拆成两部分——前端(处理文本格式化逻辑)和后端(生成特定设备的输出指令)。前端产生一个中间文件(称为“troff中间格式”),后端则根据中间格式生成不同设备的指令。这个设计让troff一夜之间从“专用驱动”变成了“通用排版引擎”。 1979年,Kernighan在《The UNIX Programming Environment》一书中详细描述了这一架构。书中提到一个关键对话:当Ossanna质疑“设备无关性会增加复杂度”时,Kernighan反问:“你希望每次买新打印机都重写整个程序吗?”Ossanna沉默了,然后说:“好,但你必须保证中间格式的完整性。”最终,troff的中间格式成为了排版领域的“通用语言”,不仅支持排字机,还能驱动激光打印机、喷墨打印机,甚至后来成为PostScript和PDF的早期先驱。 ## 优雅的遗产:排版民主化与文档的黄金时代 troff的影响力远超贝尔实验室。1980年代,它随着Unix的商业化版本(如System V、BSD)被传播到全球大学和科研机构。几乎所有的C语言教材、Unix系统文档、学术论文(包括著名的“C程序设计语言”第一版)都是用troff排版的。它催生了“文档源代码”的概念——文档就像程序一样可以被版本控制、模块化、自动生成。直到今天,许多Linux发行版中的man手册(比如`man ls`的输出)仍然使用troff的变体(groff)进行格式化。 更重要的是,troff重新定义了“专业排版”的门槛。在1970年代之前,排版是印刷厂和排字工人的专属领域,需要昂贵的设备和数年的学徒训练。troff让一个程序员在终端上就能设计出媲美专业印刷的页面——他们只需要掌握几十个控制命令,就能控制字符间距、单词间距、连字符规则、页眉页脚等细节。这种“排版民主化”直接影响了后来的桌面出版革命(如Adobe PageMaker、LaTeX)。LaTeX的创始人Leslie Lamport曾公开承认,他的设计深受troff的“标记语言”思想启发。 但troff也有它的局限:它的命令式语法(每个控制命令立即生效)让复杂布局变得冗长;它缺乏所见即所得的交互体验。当1980年代WYSIWYG(所见即所得)软件(如MacWrite)出现后,troff逐渐退出了大众视野。然而,在需要精确控制每一个像素的领域——比如学术排版、法律文档、技术手册——troff的遗产依然活着。今天,OpenBSD和FreeBSD的文档系统仍然使用troff的变体,而groff(GNU troff)也继续在Linux世界中扮演着“最后守护者”的角色。 ## 评论 troff的故事揭示了一个反直觉的真理:最持久的技术往往诞生于“小团队解决小问题”,而非“大公司规划大战略”。Joe Ossanna和Brian Kernighan最初只是为了让Unix文档更好看,却无意中创造了排版领域的“通用语言”。这种“自下而上”的创新路径,与当时IBM、施乐等巨头主导的“自上而下”的排版系统形成鲜明对比。troff的失败在于它从未试图成为“用户友好”的产品——它始终是一位专家工具,需要程序员式的思维。这提醒我们:并非所有软件都要追求大众化。有些工具注定要躲在幕后,为那些愿意学习其语法的人提供无尽的精确性。在AI生成内容泛滥的今天,troff的“手工排版”哲学反而成为了一种稀缺品质——它让每个字符的间距、每个段落的修剪都充满了人的意志和审美。 ## 参考资料 - [The Unix Heritage Society: troff history](https://www.tuhs.org/Archive/Documentation/Papers/Research/1974/troff.pdf) — 1974年troff的原始论文 - [Wikipedia: troff](https://en.wikipedia.org/wiki/Troff) — troff的详细发展历程 - [Brian Kernighan's troff改进论文](https://www.cs.princeton.edu/~bwk/202/troff/troff.pdf) — 设备无关性架构的核心文献 - [The Unix Programming Environment (Kernighan & Pike)](https://en.wikipedia.org/wiki/The_UNIX_Programming_Environment) — 详细记录了troff的设计哲学 - [GNU troff (groff) 官方文档](https://www.gnu.org/software/groff/manual/) — 现代troff实现的技术细节

发布于 2026/7/4