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

极夜.潜的博客

 
 
 

日志

 
 

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

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

  下载LOFTER 我的照片书  |

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

他们想把 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 引擎,但是这个项目似乎也是挖了个坑,然后就没影了。

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

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 用户广泛认可。

对 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 项目。

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

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 还在开发中,但是功能上可提升的空间似乎也很有限了。

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

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

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

LuaTeX 项目大概要在 2012 年才功德圆满,届时发布 1.0 版本。但是现在的 LuaTeX 引擎已具备可用性,并于 2008 年和 ConTeXt MkIV 一起被 TUG 纳入 TeX Live,作为用户可选的 TeX 引擎。目前,仅有 ConTeXt MkIV 格式可以与 LuaTeX 匹配。

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

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

TeX 不合时宜?

与时下家喻户晓的微软 Word 那种所见即所得的文档排版方式相比,TeX 显得多么的不合时宜。虽然 ConTeXt 在改善 TeX 易用性的工作上要比 LaTeX 走的更远,但是它依然未能摆脱通过控制序列来排版文档的这种“原始方式”。

Knuth 说:我从来也不期盼 TeX 会成为一个万能的排版工具,让大家使用它可以来做一些“快速而脏”的东西;我只是将其视为一种只要你足够用心就能得到最好结果的东西。

那个包含了许多 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,但是往往又引入了新的 bug。另外,太奔放的追求新版本,容易患上更新综合症,具体症状为:一天不更新点啥,心里不舒坦。

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

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

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

序幕结束,打算看下一篇“这 就是 ConTeXt Minimals”?


参考文档

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

[2] LaTeX 笔记:http://www.tug.org/texlive/Contents/live/texmf-doc/doc/chinese/lnotes/lnotes.pdf

[3] TUG 对 Hans 的专访:http://www.tug.org/interviews/interview-files/hans-hagen.html

[4] TeX 系统的演变:http://lyanry.is-programmer.com/posts/332.html

[5] 关于 LuaTeX 项目的一些背景:http://bbs.ctex.org/viewthread.php?tid=48180

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

历史上的今天

评论

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

页脚

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