从校样问题到斯坦福的程序

斯坦福大学计算机科学家唐纳德·克努斯编修《计算机程序设计艺术》第二卷时,对出版方改用计算机照相排字后的校样质量不满。1977年,他转向数字排版研究,希望自行控制数学著作的印刷效果。TeX由此产生,处理的对象包括普通文字、数学公式和页面位置。

迈克尔·普拉斯与弗兰克·梁根据克努斯的设计实现早期原型,随后克努斯编写完整程序。1978年,系统在斯坦福人工智能实验室的PDP-10计算机上运行,采用SAIL语言和WAITS操作系统,输出送往XGP打印机;同年其他使用者开始参与。

比顿、贝里与沃尔登的计算史研究指出,TeX在图形化桌面出版普及前,采用带标记的纯文本输入。它以精确排版和长久重现为目标,研究生的开发工作与作者实际制书需求紧密结合。

参考:[1]

把一行指令排成二维公式

克努斯在1978年1月4日的吉布斯讲座中介绍了这项尚未完成的工作,讲稿于1979年发表。其中用“1 \over 2”表示分数,反斜线将控制指令与普通文字区分开来。输入文件不必画出分数线,也不必用空格手工对齐分子和分母。

沿用这种写法,在数学模式中把分母改为三,输入“1 \over 3”,程序便组织三分之一的排印形式:一在上,三在下,中间是一条横线。它处理的是符号的位置和字形大小,不是把算式求值后改写成小数。这是排版程序与数值计算程序的一个具体区别。

TeX将字符、横线和较复杂的内容组织为盒子,横向排列成行,纵向排列成页。盒子之间的间距可以伸缩;公式与正文因而能够进入同一套组合规则。

参考:[2]

从逐行填满到整段选择

一段文字的第一行怎样结束,会影响后面各行的空白。克努斯与普拉斯在1981年的论文中,讨论了把整段文字一起考虑的断行方法。它不必在一行刚好填满时就永久作出决定,而可以比较不同断点组合。

模型把内容表示为盒子、可伸缩的间距以及断点惩罚。盒子有宽度,间距有正常值和伸缩能力,惩罚则表达某个位置换行是否合适。例如,把短词移到下一行,可能改善两行的间距;在词中插入连字符虽然能装下更多文字,也可能增加排版代价。

算法运用动态规划保留到达各断点的较佳结果,避免穷举所有组合。这里的“最佳”是相对于设定的宽度、间距和惩罚规则而言,并非宣称机器能够替代一切审美判断。论文将这些选择变成可计算、可比较的程序步骤。

参考:[3]

手册、样书与实际印刷

TeX的传播依赖程序,也依赖可学习和检验的印刷材料。克努斯在《TeX早期印本》中回顾,第一版手册以斯坦福计算机科学报告第六七五号于1978年出现;美国数学学会于1979年6月出版修订版。同年后期,手册又收入学会与数字出版社合出的《TeX与METAFONT:排版的新方向》。

早期手册并非一开始就在统一的商业设备上制作。首版使用斯坦福的XGP,随后两版分别使用施乐的另外两种实验打印设备。传播一种数字排版方法,当时仍须同具体机器、字体和输出分辨率打交道。

1978年圣诞节,克努斯还参与制作一本二十八页的家族纪念小书,把程序排出的文字与油毡版插图结合,再交付印刷。它表明,早期试验除了技术说明书,也已进入篇章、插图和纸面成品相结合的实际制书过程。

参考:[4]

让同一排版结果走向不同设备

大卫·富克斯在2007年的访谈中回忆,他于1978年加入项目,将旧版TeX从斯坦福的WAITS环境移植到TOPS-20。约1980年,实验室更换打印设备,最初的设想是为新机器再写一个直接输出模块。

富克斯提出把排版和设备驱动分开:TeX先生成设备无关的页面描述,再由后续程序解释并送往打印机。这形成了最早的DVI输出格式。这样,换用新打印机时,可以增加相应驱动,而不必让用户选择一套专为该打印机编成的TeX。

这项改进也受硬件条件约束。早期主机内存有限,串行连接速度不高,输出格式必须紧凑,设备端也需要处理字体数据的储存。TeX的早期扩散因而不仅是复制源程序,还包含操作系统移植、输出接口和印刷设备的协同设计。后来以WEB和Pascal重写的系统,属于继续发展的阶段。

参考:[5]