序幕有些长

对于 TeX 爱好者来讲,TeX 的漫长历史一直是他们津津乐道的,然而在他们眼里看来是历史的东西,在我看来,仅仅是一场漫长的尚待正式拉开的序幕。php

Knuth 的 TeX

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

Donald Knuth
Donald 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 的许多化身

与时下家喻户晓的微软 Word 那种所见即所得的文档排版方式相比,TeX 显得多么的不合时宜,然而 Knuth 说:『我历来也不期盼 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 等。post

自 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 在接受该字串以后,它就能够严肃的按照控制序列的指示驱动计算机输出相应的排版结果:

TeX控制序列

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

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

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

T\kern -.1667em\lower .5ex\hbox {E}\kern -.125emX

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

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

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

\def\TeX{T\kern -.1667em\lower .5ex\hbox {E}\kern -.125emX}

这样,在 TeX 文稿中,只要使用 \TeX 就能够实现上述 TEX 的特殊排版效果,由于 TeX 引擎在遇到 \TeX 控制序列时,会自动将其展开为上述代码。

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

一些很是有经验的 TeX 用户(即 TeX 专家)在长期使用 TeX 的过程当中,会利用宏扩展机制,逐渐积累出一套自定义的控制序列,他们利用这些控制序列能够快速而优美地实现诸如论文、专著、幻灯片、书信、曲谱、棋谱等文 档的排版。这些由 TeX 专家们自定义的控制序列一般是单独存放到一份或多份文件里,这样就造成了 TeX 宏包。 这些 TeX 宏包大部分都是无偿地提供给普通 TeX 用户使用的。使用方法很简单,比方说我从某处得到了一个名为 xxxx 的宏包,要使用这个宏包,只须要在个人 TeX 文稿的开头,使用 \input xxxx 就能够将该宏包装载进来,而后便可在文档中调用 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 的宏扩展机制上。由于 TeX 是一种图灵完备的宏编程语言,也就是说凡是其余计算机编程语言能作的事,TeX 也能作。因此,在 Knuth 公开发布 TeX 以后没几年,这个问题就被美国计算机科学家 Leslie Lamport 给解决了。

1984 年先后,Lamport 在使用 Knuth 发明的 plain TeX 排版软件撰写一些并行计算方面的论文,感到用起来不太方便。因而便本身定义了一套比较高级的控制序列,并制做成新的 TeX 格式,命名为 LaTeX。起初 LaTeX 在计算机科学家之间流传,你们以为 LaTeX 比 plain TeX 使用更方便,就常常经过各类渠道向他索取。

Leslie Lamport
Leslie Lamport

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

\documentclass{article}

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

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


\begin{document}

... 正文内容 ...

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

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

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

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

已经存在了 20 年的 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

上述控制序列能够生成数字编号列表:

数字编号列表

若是将 "startitemize[n]" 的参数由 "n" 改成 "a" 时,即 "startitemize[a]",那么上述控制序列能够生成字母编号列表:

字母编号列表

若是将 "startitemize[n]" 的参数由 "a" 改成 "1" 时,即 "startitemize[1]",那么上述控制序列能够生成无编号列表:

无编号列表

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

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

Hans Hagen
Hans Hagen

一开始 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 版本很是期待……然而在我对这份文档进行局部修订的 2015 年 9 月 22 日为止,MkIV 依然没有正式发布,不过已经很稳定而且也深具可用性了。

他们到底想把 TeX 怎么着

这么多年以来,TeX 的引擎一直在不断的改革着,TeX 格式也在不断地改革着,许多 TeX 用户在这众多的改革中有时会晕头转向。为了避免迷路,咱们仍是先在 ConTeXt 格式发展道路上停留片刻,静心看一下 TeX 引擎究竟在向那个方向走去。

前面咱们已经知道,最先的 TeX 就是 Knuth TeX。当 Knuth TeX 项目冻结以后,仅仅作bug 修正。可是它提供的宏扩展机制依然没法知足你们的须要,因而就有了一大堆 TeX 的改进版本。

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

NTS 项目开始时,有一个叫作 e-TeX (Extension TeX) 的对 TeX 引擎的改进项目,也是由 NTS 项目组开发的,后来由 Peter Breitenlohner 接管。e-TeX 项目的主要任务是对 TeX 进行扩展,在 Knuth TeX 的基础上又增长了许多有用的控制序列。当时,LaTeX 格式中的不少排版功能是基于这些控制序列实现的,后来 ConTeXt 也很快放弃了 Knuth TeX 转而使用 e-TeX。

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

后来在 2002 年,德国一些专家和开发人员组织成一个小团体,发起了 ExTeX 项目。ExTeX 项目是基于 NTS 项目的,它的理想是实现一个基于 Java 实现一个新的 TeX 引擎,可是这个项目彷佛也是挖了个坑,而后就没影了。

1997 年,1997 年,Han The Thanh 基于 Knuth TeX 实现了 pdfTeX 。pdfTeX 在实现上能够分为两个模块:一个模块保留了原先Knuth的全部代码,能够按照 Knuth TeX 那样直接输出 dvi 文件格式;另外一个模块主要是实现基于 TeX 源文档直接输出 pdf 文件格式,在该模块的实现中,加入了大量的 C 代码;经过与 C 库的链接,能够处理一些 Knuth TeX 引擎难以解决的问题,好比插入各类格式的图片等。pdfTeX 在排版算法方面也作出了重要改进,能够取得更好的排版效果。后来,pdfTeX 开发人员又将 e-TeX 对 Knuth TeX 的改进部分也合并到 pdfTeX 项目中。因为 pdfTeX 的功能比较强大,在国际 TeX 用户组织 (TUG) 维护的 TeX 系统发行版——TeX Live 中被设定为默认的 TeX 引擎,这标着着 pdfTeX 获得了 TeX 用户普遍承认。

Han The Thanh
Han The Thanh

对 TeX 引擎的改造工做除了加强其排版功能以外,还有一个重要的方向就是对多国语言文字的支持。

Knuth 在设计 TeX 引擎时,是以支持英文为出发点考虑的,系统规定的文本输入一概采用 ASCII 字符集。可是世界上被普遍使用的语言文字不止英文一种,不少语言的基本字符数量远远超出 ASCII 字符集所能表示的范围,好比对于中国的汉字而言,经常使用汉字约有 6000 多,而 ASCII 最多能表示 256 个字符。即使如此,让 TeX 支持各国语言文字也不是很困难。譬如,以 TeX 中文支持问题的解决为例,能够先对中文 TeX 文稿进行预处理,为每一个汉字生成多个字节的 ASCII 编码;而后再实现汉字字符编码与字体图形之间的映射,以后的过程交给 TeX 引擎处理便可。这一预处理过程采用 TeX 宏扩展机制便可实现。如今一些 TeX 中文支持宏包,譬如德国人 Werner Lemberg 写的 CJK 宏包、中科院张林波教授开发的 CCT、华东师大陈志杰教授开发的 TyTeX(天元软件包)等,就是按照这一思路实现的。这种解决方案虽然能够比较轻省地实现中文化、日文、韩文等文字语言支持。可是要实现各国语言文字的 支持,基本上对于每个语种都要为之开发一个 TeX 支持宏包,特别是一份 TeX 文稿须要出现多种语言文字时,问题就变得更加复杂。

计算机软件开发中,对不一样语言文字的支持有一股清晰的潮流,那就是让应用程序支持 Unicode 编码,这是目前统一化处理世界各国语言计算机表示的最佳方案,由于 Unicode 编码的字符集能够涵盖目前地球上全部的文字,而且还具有大量的扩展编码空间。不少人都但愿 TeX 引擎也能顺应这种潮流,便千方百计改造 TeX 引擎以实现对 Unicode 编码的支持。Omega、XeTeX、LuaTeX 等项目均致力解决这个问题。

Omega 是由 John Plaice 与 Yannis Haralambous 基于 Knuth TeX 引擎最先实现的能够支持 Unicode 编码的 TeX 引擎。在 Omega 中,每一个字符都以一个 16 位编码的数据结构表示,这样就能够摆脱 TeX 的 ASCII 编码限制。可是在留下了一堆 bug 以后,Omega 项目就终止了。后来有人将 Omega 项目与 e-TeX 项目合并起来,创建了 Aleph 项目。再后来,Aleph 项目也终止了,其后继者就是下面要介绍的 LuaTeX 项目。

Jonathan Kew 在 Mac OS X 平台上对 e-TeX 进行改造,为其添加 Unicode 编码支持,并基于 Mac OS X 的各类开发技术,建立了 XeTeX 项目。Jonathan Kew 自 2005 年开始发布 XeTeX 的 Windows 和 Linux 版本。值得注意的是,XeTeX 除了能够直接支持 Unicode 编码以外,还能够直接调用那些存在于用户操做系统以内的 TTF 和 OpenType 格式的字体,这极大方便了用户为 TeX 添加本身喜好的字体(在 Knuth TeX 中增长一款 TTF 或 OpenType 字体简直是一场噩梦)。从 2007 年开始,XeTeX 被 TeX Live 吸纳,标志着它也获得 TeX 用户的普遍承认。如今,XeTeX 还在开发中,可是功能上可提高的空间彷佛也颇有限了。

Jonathan Kew
Jonathan Kew

如今该轮到 LuaTeX 登场了。LuaTeX 项目是 2006 年春天启动的。当时,美国科罗拉多州立大学的一个研究哲学的教授与国际 TeX 用户组织联合申请到一个叫作“东方 TeX”的项目,目的是为了更好的排版阿拉伯语言的书。Hans Hagen 拿到这个项目的经费以后,就由 Taco Hoekwater 把 LuaTeX 项目作起来了。LuaTeX 和 ConTeXt MkIV 的开发工做很大程度上是为了这个“东方 TeX”的项目,可是也不排除 Hans 要壮大 ConTeXt 的野心。

Taco Hoekwater
Taco Hoekwater

LuaTeX 项目对 TeX 引擎进行了大刀阔斧地改革,它先是整合了 pdfTeX 和 aleph 项目,而后又将 TeX 世界里一款很是重要的矢量图绘制引擎——MetaPost 改形成一个能够链接的库——MpLib,并将这个库嵌入 LuaTeX 中,这样 LuaTeX 就能够内部直接支持 MetaPost 图绘制了。另外也像 XeTeX 那样,实现了对用户操做系统中 TTF 和 OpenType 字体的直接调用。LuaTeX 最引人注目的地方就是:它把自从 Knuth TeX 开始就一直被沿用的宏扩展机制改形成 Lua 程序扩展机制。这样,未来用户能够使用 Lua 程序设计语言为 LuaTeX 引擎实现功能扩展,不再须要面对丑陋而且容易出错的 TeX 宏扩展机制。

LuaTeX 项目原计划于 2012 年发布 1.0 版本,然而至如今的 2015 年 9 月为止,它的版本号刚到 0.80.1。LuaTeX 官方主页上不知什么时候已将 1.0 的发布时间推延至 2020 年。虽然如此大幅度的跳票,可是如今的 LuaTeX 引擎已具有可用性,并于 2008 年和 ConTeXt MkIV 一块儿被 TUG 归入 TeX Live,做为用户可选的 TeX 引擎。目前,ConTeXt MkIV 格式能够与 LuaTeX 有比较完善的配合,可以初步支持中文排版。LaTeX 与 LuaTeX 的配合对于西文排版而言,问题不大,可是对于中文排版,须要日本 TeX 用户开发的 LuaTeXja 的配合,具体状况可参考 LuaTeXja-zhfonts文档,再有不解,可去 CTeX 论坛 询问 m6n

关于 LuaTeX 的跳票,我能够理解。到 2020 年 LuaTeX 1.0 发布之时,人类的计算机的运行速度确定知足 LuaTeX 的需求。若是那时人类的计算机技术仍是不好,不能流畅的运行 LuaTeX,也许它会将 1.0 的发布时间改至 2025 年……

LuaTeX 是 TeX 引擎改革的结束么?也许如今谁也无法说清楚,正所谓江山代有才人出,一代新人换旧人,当年即便 Knuth 也无法预料到如今会有 LuaTeX 的出现。如今,咱们也许只能预料到 LuaTeX 能够将 TeX 用户带上一个新的台阶,至于未来在那个新的台阶上又会遇到什么样的困难,咱们也不必替将来的人担心。

值得注意的是,TeX 引擎之因此可以曲曲折折走到今天,除了凭借自由/开源软件的开发模式以及众多的黑客长期不懈的智力投入与积累以外,也跟 TeX 所面向的领域过于小众化有重要关系。2000 年,一名记者采访 Leslie Lamport 时问:“当前为何没有高质量的所见即所得 (WYSIWYG) 的排版系统?”Lamport 回答说:“门槛过高了,一个所见即所得的排版系统要作到 LaTeX 当前的水平,工做量之大不是单枪匹马所能完成的。微软这样的大公司能够作,可是市场过小了。”Lamport 算是一语道破了 TeX 虽然历经 30 余年迄今依然生机盎然的秘密。

TeX 发行版

其实,咱们平常挂在嘴边的『TeX』既不是 TeX 引擎,也不是 TeX 格式,而是一个包含了 TeX 引擎、TeX 格式、宏包以及一些辅助程序的东西,它的学名叫“TeX 发行版”,它的使命是让 TeX 用户们不用四处奔波去寻找本身也不知道到底是否须要的 TeX 引擎以及那些 TeX 格式、宏包以及一些乱七八糟的辅助程序。为了完成这一使命,TeX 发行版的开发者们就努力地将这个世界上公认的那些颇有用的 TeX 引擎、格式、宏包以及一些乱七八糟的辅助程序收集起来,并持续地维护下去。

虽然 TeX 发行版谁均可以作,可是只有 TeX Live、MacTeX、MikTeX 这三个发行版所收集的 TeX 软件比较全面且比较受欢迎,它们好像都是每一年发布一个新版本供用户免费下载和使用,其中 TeX Live 主要在类 Unix 系统中运行,固然它也能够在 Windows 系统中运行的也很好,可是 Windows 用户们却很买 MikTeX 的帐,至于 MacTeX,顾名思义就是 Mac OS 系统中的 TeX 了。

这些 TeX 发行版一般都是大而全的。以 TeX Live 为例,它几乎包含了前文中所提到的全部 TeX 引擎,像 Plain TeX、LaTeX、ConTeXt 这些 TeX 格式也是照单全收,此外还有数以千计的宏包,还有一些用于字体、图形处理的辅助程序。因为收录的软件包太多,因此这些 TeX 发行版一般都是庞大的怪兽。不过,这些年随着计算机网络的普及,开始流行在线定制安装的形式。用户只须要下载一个很小的安装程序,而后根据本身的须要选择 所安装的软件包集,而后这个安装程序会自动链接提供 TeX 发行版的服务器去下载所需的文件。一般,只须要下载几百兆字节的文件就能够获得一个比较完善的 TeX 环境了。

本篇文档所讲的 TeX 发行版与上面所说的 TeX 发行版略有区别,咱们要使用的是 ConTeXt Minimals, 顾名思义,就是专门为 ConTeXt 格式定制的最小化 TeX 发行版,它是由 Hans 所领导的 ConTeXt 项目组发布的,它的任务就是把最稳定和最不稳定的各类版本的 ConTeXt 以及与之配套的 TeX 引擎提供给那些只对 ConTeXt 感兴趣的 TeX 用户们。ConTeXt Minimals 能够跨操做系统平台(Windows、Linux、FreeBSD、Mac OS X、Solaris 等)运行,而且能够与系统中所安装的其它 TeX 发行版互不干扰。

为迎接 ConTeXt 作点准备

从如今开始,咱们就再也不旁生枝节,只将注意力放到 ConTeXt 格式 上,只关注它的 MkIV 版本(就是搭配 LuaTeX 引擎的那个),而且所使用的 TeX 发行版仅限于 ConTeXt Minimals。下面全部的内容,除非我很巧妙的申明,不然它们 默认都属于这个环境。

在开始学习使用 ConTeXt 来排版文档以前,须要在身体和心理上作点准备,即使你铁了心要跟 ConTeXt 耗下去,也要准备一下。

首先,不要苛求完美。由于 ConTeXt MkIV 及 LuaTeX 都在开发状态中,有大量大量的 bug 都是不免的,千万不要为此而郁闷。实在感受很难受,能够去 ConTeXt 邮件列表里勇敢又巧妙地把 bug 报告给 Hans,并催促他老人家修复。

其次,不要四处乱找 ConTeXt 中文文档,特别是 2008 年以前的那些中文文档,它们大都是针对 ConTeXt MkII 的,而咱们这里要学习的是 ConTeXt MkIV。

最后,若是真的感受 ConTeXt 很无聊,纯粹是浪费时间,那么最好仍是把大好的时间用来陪女友逛逛街,作点体育活动,或者用来学习不无聊也不浪费时间的知识。若是只是把节省下来的时间用来看看电影,打打游戏,那么我仍是很巧妙地建议你继续学习 ConTeXt 吧。由于 ConTeXt 中文黑客实在太少了,你不要再让它失去一个。

参考文档

[1] LaTeX 编辑部——TeX 简介:http://zzg34b.w3.c361.com/hom...

[2] LaTeX 笔记:http://www.tug.org/texlive/Co...

[3] TUG 对 Hans 的专访:http://www.tug.org/interviews...

[4] TeX 系统的演变:http://lyanry.is-programmer.c...

[5] 关于 LuaTeX 项目的一些背景:http://bbs.ctex.org/viewthrea...

相关文章
相关标签/搜索