注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

极夜.潜的博客

 
 
 

日志

 
 

TeX 的前世今生(1/2)……  

2011-01-04 18:07:29|  分类: Latex |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

转自:http://liyanrui.is-programmer.com/2009/9/29/Prologue.11788.html

Knuth 的 TeX

  TeX 的前世今生(1/2)…… - 极夜.潜 - 极夜.潜的博客
Donald E. Knuth

20 世纪 60 年代,著名计算机科学家和数学家,斯坦福大学 Donald Knuth 教授在忙于撰写那部叫做《计算机程 序设计艺术》 的书。这部书计划一共写七卷,Knuth 在写第四卷时,出版社拿来了第二卷的第二版书样给他过目,结果令他大失所望,因为当时出版社的印刷技术没有使他的书稿更好看,反而变糟了,尤其是在数学公 式和字体上面的缺陷更令他无法接受。于是他就开发了一个既能供科学家编排手稿,又符合出版社印刷要求的高质量的计算机排版系统。

这个排版系统的名字叫做 TeX。这个名称是由三个大写的希腊字母 Τ?Χ 组成,在希腊语中是“科学”和“艺术”的意思。为了方便书写,一般在纯文本文档中将其写为“TeX”, 念做“泰赫”(我个人习惯将其读作“泰克”)。

Knuth 于 1977 年开始构造 TeX 系统,并为该系统设计了一个字体生成软件——METAFONT。1982 年 TeX 系统发布,之后又有几次版本升级。Knuth 用圆周率 π 的近似值作为 TeX 系统的版本号,并采用自然底数 e 的近似值作为 METAFONT 版本号。系统每升级一次,其版号就增加一位数字,从而不断地趋近于 π 和 e,这种别出心裁的版本号表示方式一方面可以展示 TeX 与科技文献排版的密切关系,同时也表达了 Knuth 对 TeX 系统与 METAFONT 系统不断追求完美的愿望 。

1990年 TeX 第3.1版发布时,Knuth 发出宣言:

  • 不再对 TeX 进行任何功能上的扩张。
  • 如果出现明显问题,修正的版本依次为3.14版,3.141版,3.1415版.....在自己离开这个世界的时候,将最后的 TeX 版本序号改为 π。 此后,即使再发现错误,也都将成为 TeX 的特征而保留。如果有人非要修改的话,就不要再叫 TeX 了,请另外起名。
  • 关于 TeX 的一切,已经全部做了书面说明,可以自由利用来设计其他的软件。

TeX 系统的内核相当稳定,几乎没有 bug,1995 年以后版本号一直停止在3.14159,直到 2002 年 12 月才又进行了一次升级。到目前为止,TeX 系统的版本序号是3.141592,而 METAFONT 版本序号则为 2.71828。

TeX 的许多化身

Knuth 之所以很自信的宣布不再对 TeX 进行任何功能上的扩张,并非自视甚高,而是有一定客观原因的。其中最主要的原因就是 TeX 提供了宏扩展机制,开发者或者用户均可以对 TeX 提供的 300 多条基本的控制序列(Control Sequence)进行组合,定义更为高级的控制序列,从而增强 TeX 的排版能力。

尽管很多 TeX 没有原生提供的功能可以通过宏扩展来实现,但是终究是有一些比较重要的问题是宏扩展难以解决的,比如对多国语言文字的支持、对 TrueType、OpenType 字体的支持、图形支持等问题。所以在 Knuth 的 TeX 之后,许多人努力地对 TeX 进行改进,或者干脆开发一个全新的“TeX”。开发者们为了尊重 Knuth 宣言的第二条,这些改进版的 TeX 或者重新开发的 TeX 均不再叫 TeX,它们都有新的名字,诸如 e-TeX、Omega、pdfTeX、XeTeX、LuaTeX 等等。

自 1990 年以来,TeX 的改进项目层出不穷,但是大浪淘沙,许多项目都没有成功,有的已经死去,有的在苟延残喘。目前广为使用 TeX 改进版本主要有 pdfTeX、XeTeX 和 LuaTeX。应当注意的是 pdfTeX 项目开发者  于 2008 年 6 月宣布自 pdfTeX 1.50.0 版本之后只进行 bug 修正,不再提供新功能扩张。LuaTeX 项目则被看作是 pdfTeX 项目的延伸,并且添加了其它许多重要的新功能,并继续开发下去。

虽然 Knuth 的 TeX 系统出现了许多的改进版本和分化版本,但大都是良性的,并且变动的只是 TeX 引擎,它们大都兼容 Knuth 定义的 TeX 格式。这就好比只改进汽车 的发动机性能,并不改变或者只是略微改变汽车驾驶操作方式,这使得用户可以像往常一样去驾驶一辆性能更好的汽车。所以 TeX 用户们通常无需要担心 TeX 引擎太多,导致自己的 TeX 文稿在其他人的计算机上无法编译。

几个 TeX 术语

 前一节出现了几个经常让 TeX 新用户难以理解的术语——控制序列 (Control Sequence)、TeX 引擎 (Engine) 以及 TeX 格式 (Format)。为了帮助那些没有太深的计算机使用背景的 TeX 新用户来理解这些概念,我要适当的找点东西来比喻一下。

首先,来看 TeX 引擎是什么。引擎,俗称发动机,是用来驱动某个系统运转的。比方说汽车引擎,就是给汽车提供动力的装置,让汽车的机械部件运作起来,从而可以日行千里,夜 行八百。TeX 引擎是一个计算机程序,它的作用就是驱动计算机为用户输出排版结果。

然后来看一下控制序列又是什么东西。众所周知,现在最先进的汽车也不是自动驾驶的,它通常需要驾驶者输入一些控制参数,譬如档位、油门、离合等。当 然,TeX 引擎不需要输入这些,它只需要你向它提供要排版的文字以及一些控制序列而已。譬如下面这行 TeX 引擎可接受的字串: 

to be {\bf bold} or to {\sl emphasize} something.

这行字串包含了所要排版的文字以及控制序列,其中以“\”作为前缀的单词便构成一个控制序列,比如 "\bf" 和 "\sl"。TeX 在接受该字串之后,它就可以严肃的按照控制序列的指示驱动计算机输出相应的排版结果:

        to be {\bf bold} or to {\sl emphasize} something.

观察这份由 TeX 引擎驱动计算机输出的排版结果,可以看到在控制序列 "\bf" 之后的单词 "bold" 的排版效果是粗体,而控制序列 "\it" 之后的单词 "emphasize" 的排版效果是斜体。即使你现在是第一次听说 TeX,应该也不难猜出 "\it" 和 "\bf" 分别是用来控制文字的粗体和斜体的,以及字串里的 "{...}" 括号是限制控制序列的作用域的(即控制序列只对 "{...}" 所包含的字串有效)。

可以将 TeX 的控制序列看作是由用户发给 TeX 引擎的指令,TeX 引擎会乖乖地按照这些指令去驱使计算机生成用户所期望的排版结果。TeX 控制序列就像对汽车的方向盘、档位、油门、离合、刹车等装置进行操作一样,可以使用它们来控制汽车引擎及其它相关部件的工作状态,从而让汽车按照我们的意 愿行驶在正确的道路上。如果一份文本文件所包含的内容除了控制序列就是所要排版的文字信息,我们可以将该文件称 为 TeX 文稿(主 要是为了叙述上的方便)。

Knuth 在设计 TeX 系统时,为 TeX 引擎定义了 300 多个比较基本的控制序列。TeX 用户只要掌握了这些控制序列的用法,就具备了排版各种类型文档的能力。这种想法很好,但是在实际应用中,这些控制序列与所排版的文字交织在一起,显得非常 不堪,比方说下面这行字串:

T\Mkern {-.1667}\lower .5ex\hbox {E}\Mkern {-.125}X

看上去很是古怪,实际上它的目的只是对 "TEX" 这三个字母进行稍微特殊一些的排版:

        \TeX

试想,如果一篇很长的 TeX 文稿里到处都是类似的文本, 对于 TeX 引擎而言很是直白,因为它只管机械地处理那些控制序列;对于直接阅读该文稿的我们而言就异常晦涩了,因为我们关注的是文稿中的内容,另外输入那些稀奇古怪 的控制序列也是个很费时间的体力活。

针对这一问题,Knuth 为 TeX 建立了宏扩展机制,允许用户去组合一部分基本的控制序列,从而生成更方 便使用的控制序列。比如上述 "TEX" 的排版语句可以定义成 "\TeX" 控制序列:

\def\TeX{T\Mkern {-.1667}\lower .5ex\hbox {E}\Mkern {-.125}X}

 这样,在 TeX 文稿中,只要使用 "\TeX" 就可以实现上述 "TEX" 的特殊排版效果,因为 TeX 引擎在遇到 "\TeX" 控制序列时,会自动将其展开为 "T\Mkern {-.1667}\lower .5ex\hbox {E}\Mkern {-.125}X"。

利用宏扩展机制,可以将那些丑陋的 TeX 语句定义为一个高级的控制序列,从而显著改善 TeX 文稿可读性。当 TeX 引擎遇到高级控制序列时,会将高级控制序列展开为基本控制序列组合,前提是 TeX 引擎需要事先知道这些高级控制序列的定义。

一些非常有经验的 TeX 用户(即 TeX 专家)在长期使用 TeX 的过程中,会利用宏扩展机制,逐渐积累出一套自定义的控制序列,他们利用这些控制序列可以快速而优美地实现诸如论文、专著、幻灯片、书信、乐谱、棋谱等文 档的排版。这些由 TeX 专家们自定义的控制序列通常是单独存放到一份或多份文件里,这样就形成了 TeX 宏包。 这些 TeX 宏包大部分都是无偿地提供给普通 TeX 用户使用的。使用方法很简单,比方说我从某处获得了一个名为  xxxx 的宏包,要使用这个宏包,只需要在我的 TeX 文稿的开头,使用 "\input" 控制序列就可以将该宏包装载进来:

\input xxx

 然后我就可以在自己的 TeX 文稿里调用 xxxx 宏包中定义的控制序列了。

为了加速 TeX 引擎对这些 TeX 宏包的装载和解析,Knuth 为 TeX 提供了格式生成机制,利用它可以将一份 TeX 宏包转换为 TeX 引擎可以快速载入的二进制文件,这种文件被称为 TeX 格式。也就是说,TeX 格式也是 TeX 宏包,只不过是一种可供 TeX 引擎快速装载和处理的 TeX 宏包。

Knuth 本人也是感觉 TeX 的基本控制序列过于难用,于是提供了一套由他定义的 TeX 格式,叫做 Plain TeX,其中包含了 600 多个控制序列。使用 Plain TeX 定义的控制序列来撰写 TeX 文稿要比直接使用那 300 多个 TeX 基本控制序列来的轻便一些。由于 TeX 的基础控制序列和 Plain TeX 所包含的控制序列皆出自 Knuth 之手,所以 TeX 用户们干脆也就不加以区分了,将它们统称为 Plain TeX,共包含大约 900 个控制序列。

在实际应用中,TeX 用户们对 Plain TeX 显然是不满意的。这主要是因为 Plain TeX 仅仅停留在如何排版的层次上,即便是使用 Plain TeX 来排版一份中规中矩的论文,用户们也不得不同时扮演论文作者和论文排版者双重角色。

Lamport 和 Hans 让 TeX 更好用了

现在,我们从一些比较流行的字处理软件(比如微软 Word、金山 WPS、OpenOffice 等软件)的视角来看,普通用户在写一份文档时,只需要给他提供一份大众化的模板,然后他向里面填写文档内容即可快速有效的完成文稿排版。早期的 TeX 所缺乏的就是类似的便于普通用户使用的文稿模板。这一问题的解决,自然还是要着落在 TeX 的宏扩展机制上。在 Knuth 公开发布 TeX 之后没几年,这个问题就被美国计算机科学家 Leslie Lamport 给解决了。

1984 年前后,Lamport 在使用 Knuth 发明的 plain TeX 排版软件撰写一些并行计算方面的论文,感到用起来不太方便,于是便自己定义了一套比较高级的控制序列,并制作成新的 TeX 格式,命名为 LaTeX。起初 LaTeX 在计算机科学家之间流传,大家觉得 LaTeX 比 plain TeX 使用更方便,就经常通过各种渠道向他索取。

LaTeX 的卓越之处在于提供了一套针对文档逻辑结构的控制序列,将文章的排版设计与文章内容分开处理。比方说一篇科技论文,其逻辑结构主要由标题、作者信息、摘 要、正文、参考文献等部分组成,使用 LaTeX 的控制序列可将其表示为:

\documentclass{article}

\title{标题}
\author{作者信息}

\begin{abstract}
... 摘要内容 ...
\end{abstract}


\begin{document}

... 正文内容 ...

\bibliography{参考文献}
\end{document}

 至于论文的标题、摘要、正文等各部分所使用的字体及其尺寸、文本行距、段落间距等排版参数,LaTeX 均提供了较好的默认设置,通常不需要修改。如果采用 Plain TeX 来排版这样的文档,动用上百个控制序列是家常便饭。这样,用户在使用 LaTeX 来排版自己的文稿时,主要精力通常可以放在文稿的内容上,而不是文稿的版面设计。话又说回来,如果用户必须去调整文稿的排版参数来适应特殊的排版需 求,LaTeX 提供的控制序列对此也是有些力不从心,这时用户就有必要去学习一下 Plain TeX 了。未能为排版参数配置提供统一化的控制序列,这是 LaTeX 最大的缺点,不过在当时终究是瑕不掩瑜。

Lesile Lamport
Leslie Lamport

LaTeX 的出现消除了普通用户对 TeX 的敬畏,普通用户即便不是很了解 TeX,也可以在很短的时间制作出高质量的排版结果,并且对于复杂数学公式排版,LaTeX 表现的也非常出色,因此迅速在计算机科学、数学及相关学科领域得到推广应用,也逐步吸引了许多科学家和 TeX 爱好者不断对 LaTeX 继续进行宏扩展,并将宏扩展以宏包的形式发布,供其他用户使用,这使得 LaTeX 的功能不断地扩充,应用领域也不断地扩大。

Lamport  在 1992 年发布了 LaTeX 2.09 版本之后便退居二线。之后 LaTeX 的开发工作由 Frank Mittelbach 领导的 LaTeX 小组接管。该小组于 1994 年发布了 LaTeX 2ε 版本之后,然后他们就转入 LaTeX 3 版本的开发。迄今,LaTeX 3 仍在在开发中,希望将来会有好的结局。

已经存在了 15 年的 LaTeX 2ε 现在已经成为国际数学排版的事实标准,国外有许多期刊接受甚至只接受 LaTeX 文稿。从这一点来看,LaTeX 项目长期没有太大变化似乎是件好事情,因为这样比较稳定,许多基于 LaTeX 的文档项目或者软件项目不用担心来自底层的动荡。

 虽然大多数 TeX 用户对 LaTeX 表示很满意(现在也是如此),但是在上个世纪 80 年代后期,荷兰的一个名字叫做 Pragma 的排版公司里有几个家伙却对 LaTeX 很不满意,其中一个人的名字叫做 Hans Hagen。因为 Hans 是做文档排版服务的专业人员,他的工作就是根据顾客的需求来排版各种样式的文档,因此需要频繁的修改 LaTeX 默认的那些排版参数。

前面已经说过,LaTeX 最大的缺点就是没有为排版参数的设置提供统一化的控制序列,用计算机软件的专业术语来说就是“用户界面不友好”。于是,Hans 尝试对 LaTeX 的控制序列做一些封装(宏扩展),想改善 LaTeX 的用户界面。譬如,他对 LaTeX 的列表项控制序列进行封装后,提供了更为友好的控制序列:

\startitemize[n]
\item 列表项 1
\item 列表项 2
\item 列表项 3
\stopitemize

上述控制序列可以生成如下风格的列表:

          TeX 的前世今生(1/2)…… - 极夜.潜 - 极夜.潜的博客

如果将 "\startitemize[n]" 的参数由 "n" 改为 "a" 时,即 "\startitemize[a]",那么上述控制序列可以生成如下风格的列表:

          TeX 的前世今生(1/2)…… - 极夜.潜 - 极夜.潜的博客

如果将 "\startitemize[n]" 的参数由 "a" 改为 "1" 时,即 "\startitemize[1]",那么上述控制序列可以生成如下风格的列表:

          TeX 的前世今生(1/2)…… - 极夜.潜 - 极夜.潜的博客

从上面这个有关列表排版的示例可以看出,Hans 对 LaTeX 继续封装的主要意图就是:让用户只需为控制序列提供一些很简单 的参数便可以实现最大化地排版控制。在 LaTeX 里,对于上述三种列表项是分别通过几组不同的控制序列来实现的,另外去调整列表的其它排版参数(留白、缩进、行距等)也非常繁琐。

Hans Hagen
Hans Hagen

但是,Hans 对 LaTeX 的封装工作仅仅开了个头便终止了。因为他当时对 LaTeX 进行了一次版本升级,然后发现他定义的那些控制序列没法正常工作了,估计是积极性被严重打击了。扔掉 LaTeX 之后,Hans 去尝试了当时其它一些 TeX 格式,最后发现 InrsTeX 格式(现在已经是文物了)比较适合 hack,便于用户界面友好方面的改进。Hans 在以后的岁月里不断地对 InrsTeX 进行代码替换和封装,直到最后他意识到自己已经创造了一个新的 TeX 宏包,便将这个宏包命名为 pragmatex,直到 1996年才更名为 ConTeXt,这个名字是个文字游戏,其意可以拆解为 Con-TeX-t,表示 "text with tex"。不得不说,这个名字取的很失败,因为在 Google 里输入 "ConTeXt" 的时候,检索到的大都是跟 ConTeXt 无关的信息。

一开始 ConTeXt 主要是针对 LaTeX 的缺点而开发的,按说它应该可以取代 LaTeX。但是在 ConTeXt 还在逐步完善的时间里,LaTeX 已经在 TeX 用户群中广为流传了 10 多年,期间出现了数以千计的辅助宏包,再加上许多科技期刊和专业排版公司的支持,所以 ConTeXt 一时之间很难撼动 LaTeX 的地位。所以,我们最好还是不要以用户群的多与寡来评判一个工具的好坏。

ConTeXt 还具有一个特点,就是项目开发特别活跃。拿新版本发布来说,有时一天会连续发布多次。把这个特点与 LaTeX 项目长期的不露声色相比,ConTeXt 项目显得很有激情。当然,这不能算是优点。频繁的发布新版本通常也昭示着容易出 bug。但是也不必过于担心,因为频繁发布的新版本只是测试版,ConTeXt 项目组每年都会发布一个稳定版。

在 TeX 发展历程中,TeX 格式可谓千变万化,但是它们都致力于提高 TeX 的易用性,让用户不用去面对晦涩难懂的 Plain TeX 控制序列。现在 LaTeX 和 ConTeXt 好像是 TeX 的左膀和右臂,我们只需抓住它们中的一个,即可与 TeX 共舞。显然,我和这篇文档一起选择了 ConTeXt。 

在 ConTeXt 的道路上观看 TeX 奔跑的身影

基于前面的那些知识,应当可以认识到 TeX 格式是与 TeX 引擎密切相关的。ConTeXt 尤为如此,它与 TeX 引擎宛若两根相互缠绕的树藤,沿着岁月的方向蜿蜒前进并且生机盎然。

ConTeXt 目前的版本已进化到 MkIV,在它之前还有两个版本,分别是 ConTeXt MkI 和 ConTeXt MkII。

ConTeXt MkI 是 ConTeXt 的第 1 个版本,所匹配的 TeX 引擎是 Knuth 开发的那个 TeX 引擎。Knuth 的 TeX 引擎的排版输出结果是 dvi 文件格式,这种文件格式通常需要借助 dvi2pdf、dvipdfmx 等程序转换成 ps 或 pdf 文件格式方可用于文档打印或屏幕阅读。我们现在还是把 MkI 和 dvi 放到博物馆里供喜欢历史的人去研究吧。

ConTeXt MkII 是 ConTeXt  的第 2 个版本,所匹配的 TeX 引擎是捷克籍越南人 Hàn Th? Thành (也可写作 Han The Thanh) 由 Knuth TeX 引擎改造而来的 pdfTeX 引擎。pdfTeX 引擎可以直接将排版结果输出为 pdf 文档格式,这样就可以省去 dvi 到 pdf 的转换步骤。ConTeXt MkII 是当前 ConTeXt 格式的稳定版本,但是开发者今后只对其进行 bug 修正,不再为其增加新功能。

ConTeXt MkIV 是 ConTeXt 的第 4 个版本,也是正在开发中的下一代 ConTeXt,所匹配的 TeX 引擎是 Taco Hoekwater 开发的 LuaTeX。LuaTeX 引擎本身也是正处于开发中,目前在功能上已经超越了当前所有的 TeX 引擎。ConTeXt MkIV 的开发工作是与 LuaTeX 的开发工作同步进行的,前者靠后者提供更多的新功能,后者靠前者进行可用性与稳定性测试。

Hans 打算将 MkIII (也就是 ConTeXt 第 3 个版本)这个版本号留给那个可以与 XeTeX 引擎相匹配的 ConTeXt 格式,这是因为 XeTeX 引擎也是正处于开发中,尚未发布正式版本。

目前,Hans 和 Taco 在合作上如胶似漆,两人的开发工作也相得益彰,所以招惹许多 ConTeXt 用户对那个计划在 2012 年正式发布的 MkIV 版本非常期待。


  评论这张
 
阅读(1420)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018