Is-programmer 数学公式编辑指南
LuaTeX 的第一次尝试

TeX 相关名词的不完全考察

lyanry posted @ 2007年10月26日 05:54 in 文档标记语言 with tags 名词 tex , 5783 阅读

TeX

TeX 是二十世纪七十年代末,Donald E. Knuth(高德纳) 开发的一个排版程序。

TeX 首先是一个程序,它可以将一种标记语言文本处理成一种可用于打印或屏幕阅读的文档,比如 DVI 文件、PS 文件或者 PDF 文件。在概念不发生混淆的时候,我们将 TeX 所能够处理的那套标记语言也叫做 TeX。

我们学习 TeX,通常是指使用 TeX 标记语言来写源文档,这个过程可以称作”排版“。排版结束后,将所写的源文档交给 TeX 程序处理(编译),最终输出 DVI 文件、PS 文件或 PDF 文件等格式。

比如说下面有一份文件名为 hello.tex 的 TeX 源文档,其内容如下:

Hello World!
\bye

上面 TeX 源文档的第一行是文档的正文文本。第二行是一个 TeX 标记,它的作用是告诉 TeX 程序:“这里已经是文档末尾,处理完后您就可以退出了。” 要使用 TeX 程序对该文档进行处理,可在终端(控制台)运行以下命令:

$ tex hello.tex

完后就可以得到一份 hello.dvi 文件。这份文件的内容很简单,只有一串 “Hello World!” 文本。

由于 TeX 程序会根据 TeX 源文档中的各种标记来生成相应的排版格式,这个过程可以看作是 TeX 标记指示 TeX 程序来完成各项排版任务,所以下文中就将 TeX 标记统一称为 “TeX 排版指令” 或简称为 “TeX 指令”。另外,习惯上将 TeX 程序称为 “TeX 引擎”

TeX 指令大概有 300 多条,使用这些指令可以实现科技文档、乐谱、棋谱、文学作品等各式各样的文档排版,简直是无所不能了。

Plain TeX

使用 TeX 指令排版文档,就好像是我们使用筷子来吃饭,年幼时可能很不方便,假以时日,娴熟之后,管你是炒、炸、蒸、煮,一双筷子统统拿下。但是对于西餐而言,使用筷子来吃也是可行的,但这终归是不方便的,还是老老实实地刀子、叉子并用才使得。同理,TeX 指令用于排版一些专业领域的文档,也是不方便的,人们希望在撰写自己专业领域的知识文档时,能够有一套量身定做的排版指令。

TeX 系统的开发者 Knuth 意识到了这个问题,就在 TeX 指令的基础上,又添加了 600 多条复合指令,称之为 Plain TeX 指令。一条 Plain TeX 指令实际上是由多条 TeX 指令复合而成的,这是利用 TeX 指令的宏机制来实现的。

对于不大懂计算机编程的同学,对于宏也许不是很了解,这里也有一个比喻可以帮助你来理解。给你一套积木,让你组装成一个房子的模型,我们可以将你组装好的房子模型称为积木的“宏”。TeX 指令就好比积木,Plain TeX 指令就好比积木组装成的房子模型,所以 Plain TeX 指令就是 TeX 指令的宏。这里头有点弯弯绕,仔细体会应该能明了的。对于一套基于 TeX 指令实现的宏指令,通常称之为 TeX 宏包。

总之要清楚这样一个概念,Plain TeX 仅仅是一个 TeX 宏包,其诞生的目的是为了便于使用 TeX 排版。由于 Plain TeX 是 Knuth 写的,很权威,所以后来就将这 600 多条的 Plain TeX 指令与 300 多条的 TeX 指令合在一起构成了 TeX 标准指令集。

Knuth TeX

当 Knuth 感觉 TeX 系统已经足够稳定与完善之时,宣布 TeX 项目冻结,以后只进行 bug 的修正。由于 TeX 系统的源代码一直都是公开的, Knuth 欢迎他人将 TeX 继续改进成为更好的排版程序。只是出于能够兼容 Knuth TeX 指令的目的,也或许为了满足他个人对于完美的追求,Knuth 设计了一个测试,对于 TeX 的改进版本,只有通过这项测试,才能以 "TeX" 命名,否则就必须换个名字。

我们可以将Knuth 开发的 TeX 程序+TeX 指令集+Plain TeX 宏指令集统称为  Knuth TeX。

NTS 、 e-TeX 与 ExTeX

NTS (New Typesetting System) 项目的任务就是要继续扩展 TeX。这个项目由德国 TeX 用户组织于 1992 年发起,后来不知怎么回事一直拖到 1998 年才算是真正地开始,并计划使用 Java 将 Knuth TeX 重新实现与改进(Knuth TeX 是使用 WEB 语言实现的,WEB=Pascal+TeX)。在 1999 年至 2000 年间,NTS 项目的运作比较积极。但是后来又不知怎么回事,到了现在的 2007 年,这个项目又一直没有什么动静了。

e-TeX 最初是 NTS 项目的一个并行项目,由 NTS 项目组成员负责,后来转由 Peter Breitenlohner 负责。e-TeX 项目的主要任务是对 TeX 进行扩展,在 Knuth TeX 的基础上又增加了许多有用的排版指令。

e-TeX 与 NTS 的区别在于:前者只是对 Knuth TeX 进行修修补补,而后者是计划使用 Java 语言对 TeX 重新实现并加以改进。从我所阅读的材料来看,NTS 项目基本上已经败落,而 e-TeX 则是下文要讲到的 LaTeX、pdfTeX 等项目的重要基础。

2002 年,德国,一些专家和开发人员组织成一个小团体,发起了 ExTeX 项目。ExTeX 项目是基于 NTS 的,并借鉴了 e-TeX、pdfTeX、Ω (Omega) 等项目的经验,它的理想是实现一个新的基于 Java 实现的 TeX。这个项目,现在依然在运作中,但愿它能很好的生存下去。

LaTeX

由于 Knuth 写的 Plain TeX 宏包虽然比最初的 TeX 指令集高级了一些,但它还是过于停留在排版的层次上,而不是从文档撰写者的角度出发,强调文档内容的逻辑性而不是格式。就像对于吃西餐,对于大多数人而言,只希望有一套真正的刀子和叉子就可以了,因为他们真正的目的是吃西餐,而不是研究如何基于筷子的原理寻找制造出刀子和叉子的方法。所以,在 Knuth TeX 出现后没有几年,Leslie Lamport 便基于 Knuth TeX 指令集 (TeX 指令集+Plain TeX 宏包) 开发了 LaTeX 宏包。

LaTeX 的出现,主要目的是简化 TeX 的使用,让文档撰写者有更多的精力集中在文档内容的写作上。譬如 LaTeX 可以自动给出文档的标题,章节, 表格目录,交叉索引,公式编号, 文献引用,浮动图表等。另外 LaTeX 也强调了文档的格式与内容的分离,它鼓励文档撰写者将文档的格式单独集中在一些文档中,在写文档时,只需要少许指令加载这些格式文档即可对所撰写的文档进行格式化排版。如果你大概知道一些 HTML 与 CSS 的知识,那么就可以很好地明白 LaTeX 所提倡的格式与内容分离的观念。

LaTeX 自问世以来,也在不断地发展着。LaTeX 最初的正式版本为 2.09,在经过几年的发展之后,许多新的功能,机制被引入于其中。但是用户在享受 LaTeX 这些新功能所带来的便利之时,它所伴随的副作用也开始显现,这就是许多宏包的不兼容性,譬如标准的 LaTeX 2.09、引入了“新字体选择机制”(NFSS) 的 LaTeX 、SLiTeX、AMSLaTeX 等宏包相互之间无法兼容,这给 LaTeX 使用者和维护者都带来很大的麻烦。

为结束 LaTeX 宏包之间兼容性糟糕的状况,Frank Mittelbach 等人发起了 LaTeX3 项目,目标是建立一个最优的、有效的、统一的、标准的指令集。这是一个长期目标,向这个目标迈出第一步就是在 1994 年发布的 LaTeX2e。LaTeX2e 采用了 NFSS 作为标准,加入了很多新的功能,同时还兼容旧的 LaTeX 2.09。LaTeX2e 每 6 个月更新一次,修正发现的错误并加入一些新的功能。

在 LaTeX 3 最终完成之前,LaTeX2e 将是标准的 LaTeX 版本。我们现在所指的 LaTeX,通常是指 LaTeX2e。

还要注意一点,LaTeX2e 宏包的底层也不再是基于 Knuth TeX 指令集来实现了,而是基于 e-TeX,所使用的 TeX 引擎也不再是 Knuth 所开发的那个 TeX 程序了,至少我所知的 TeX Live 套件中 LaTeX 所使用的 TeX 引擎是 pdftex。至于什么是 TeX Live 与 pdftex,在下文中会讲到的。

PDFTeX

1997 年,Han The Thanh 基于 Knuth TeX 实现了 PDFTeX。

PDFTeX 在实现上可以分为两个模块。一个模块保留了原先Knuth的所有代码,可以按照 Knuth TeX 那样直接输出 dvi 文档。另一个模块主要是实现基于 TeX 源文档直接输出 pdf 文档,在该模块的实现中,加入了大量的 C 代码;通过与 C 库的连接,可以处理一些简单的问题,比如插入各种格式的图片等。

PDFTeX 在算法上面比较的杰出方面,是 HZ 特性(具体是什么,我也不清楚),可以取得较好的排版效果。

在 TeXLive 套件中,etex、latex、pdfetex、pdflatex、pdfelatex 等命令都是指向 pdftex 命令的连接。

对于目前较为流行的绘图宏包 PGF/TikZ,还有用于制作演示文档的 Beamer 宏包,也都对 PDFTeX 提供了最好的支持。另外 ConTeXt 也力推使用 PDFTeX 作为 TeX 引擎。

这也许能够说明,PDFTeX 已经成为目前 TeX 引擎的事实标准。目前该项目已被 PDF 项目组承接过去继续开发。

ConTeXt

ConTeXt 是基于 TeX 实现的一个宏包,其设计目的与 LaTeX 类似,但是它远比 LaTeX 年轻,因此也更能跟随 TeX 的一些新生功能;在设计上也相对统一,不像 LaTeX 那样容易出现某些宏包相互冲突的现象。ConTeXt 给予了用户更强大的文档布局控制能力,即便用户并不怎么了解 TeX。

ConTeXt 集成了 MetaFun,作为矢量图形绘制语言。MetaFun 是 MetaPost 的超集,可以独立使用,也可以用于 ConTeXt 文档布局,可以实现精妙的排版效果。

ConTeXt 允许用户使用不同种语言的用户界面,即 ConTeXt 排版指令可以用多种语言表述,目前支持英语、荷兰语、德语、法语以及意大利语。在不改变用户界面的情况下,ConTeXt 也可以调用不同的 TeX 引擎对源文档进行处理。

ConTeXt 项目运作的非常积极,开发者非常注重自由软件开发哲学——经常发布,有时一天会发布两次。

Avatar_small
yulewang 说:
2007年11月01日 23:25 呵呵,参考我的文章以后要注明哦....比如pdftex当中的很多介绍,是参考我在水木上的文章吧。 HZ特性,或者叫HZ算法,是字体设计大师Zapf设计的两个使得排版更加漂亮的算法。可以说都是基于Knuth的badness定义的断行算法的改进。第一个算法是margin kerning,可以允许标点符号比如逗号或者hyphen放到margin线上,这样的话,不但使得margin线的区域在肉眼看来更加整齐(事实上是不整齐),而且也使得断行效果更好(这个容易理解,行距事实上被增大了,所以badness会减小)。第二个算法是font expansion,就是当某行badness比较大时,适当地增大或者减小字体轮廓曲线(当然这个得保证改变量如此小以至于肉眼看不出来),而使得字体box长度发生变化,而达到减小badness的目的。 >目前该项目已被 PDF 项目组承接过去继续开发。 没有PDF项目组,是LuaTeX team。pdftex和luatex的开发组是相同的,LuaTeX是pdfTeX的一个后继者。
Avatar_small
lyanry 说:
2007年11月01日 23:39 To yulewang: 多谢你的补充。 这篇文章可能要写很久,最后会附上所有的参考文献。:)

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter