我们可以先找一个文档看,那就是tex-overview的文档,经过几年的安利,你们应该都知道有个东西叫做texdoc了吧:

texdoc tex-overview

然后我们可以看到下面的图:

texfamily_b

先说根部的TeX,这个可是Knuth写在1981年到1982主要写的,大的代码块都是在这个时候定型的。史称TeX82,实际上还有个版本叫做TeX78,是Knuth的学生写的,一个叫Liang一个叫Plass。将来有机会(Yǒu Rén Jūan Qían) 的时候再讲这两个人吧,当然提到这两个人的时候就涉及到算法了,算法可就简单了。 那么,TeX3是怎么回事呢?我们可以先看一下TeX里面的版本注释:
% Version 0 was released in September 1982 after it passed a variety of tests.
% Version 1 was released in November 1983 after thorough testing.
% Version 1.1 fixed ``disappearing font identifiers'' et alia (July 1984).
% Version 1.2 allowed `0' in response to an error, et alia (October 1984).
% Version 1.3 made memory allocation more flexible and local (November 1984).
% Version 1.4 fixed accents right after line breaks, et alia (April 1985).
% Version 1.5 fixed \the\toks after other expansion in \edefs (August 1985).
% Version 2.0 (almost identical to 1.5) corresponds to "Volume B" (April 1986).
% Version 2.1 corrected anomalies in discretionary breaks (January 1987).
% Version 2.2 corrected "(Please type...)" with null \endlinechar (April 1987).
% Version 2.3 avoided incomplete page in premature termination (August 1987).
% Version 2.4 fixed \noaligned rules in indented displays (August 1987).
% Version 2.5 saved cur_order when expanding tokens (September 1987).
% Version 2.6 added 10sp slop when shipping leaders (November 1987).
% Version 2.7 improved rounding of negative-width characters (November 1987).
% Version 2.8 fixed weird bug if no \patterns are used (December 1987).
% Version 2.9 made \csname\endcsname's "relax" local (December 1987).
% Version 2.91 fixed \outer\def\a0{}\a\a bug (April 1988).
% Version 2.92 fixed \patterns, also file names with complex macros (May 1988).
% Version 2.93 fixed negative halving in allocator when mem_min<0 (June 1988).
% Version 2.94 kept open_log_file from calling fatal_error (November 1988).
% Version 2.95 solved that problem a better way (December 1988).
% Version 2.96 corrected bug in "Infinite shrinkage" recovery (January 1989).
% Version 2.97 corrected blunder in creating 2.95 (February 1989).
% Version 2.98 omitted save_for_after at outer level (March 1989).
% Version 2.99 caught $$\begingroup\halign..$$ (June 1989).
% Version 2.991 caught .5\ifdim.6... (June 1989).
% Version 2.992 introduced major changes for 8-bit extensions (September 1989).
% Version 2.993 fixed a save_stack synchronization bug et alia (December 1989).
% Version 3.0 fixed unusual displays; was more \output robust (March 1990).
实际上,TeX3的功能在1989年的诸多版本里面就在测试了。TeX3和以前的版本,最重要的区别就是TeX3支持的是8bit编码,而以前的编码是7bit编码。很荣幸,我看过TeX3以前的版本,只要字符大小过了127就出问题了。换到8bit之后,那就牛了,拿现在的UTF-8来说,毫无压力!在这里,8bit的0到255映射到的是ASCII的编码顺序。按理说,7bit的TeX应该听够用的。但是,问题在哪里呢?在西欧诸语上,有很多扩展字符需要超过127的编码位置,那么,还是改成8bit好了。 接下来说encTeX,这个是Petr Olšák做的扩展,见CTAN: Package encTeX。MLTeX是Bernd Raichle做的扩展,见CTAN: Package mltex。这俩得放一起说,encTeX主要做的编码的转换,MLTeX是做多语言处理的。实际上,这俩东西对于中文真没啥用。 TeX2PDF、pdfTeX、pdf(e)-TeX这仨得一块说。这几个东西是一个叫做Hàn Thế Thành的越南人做的,写成中文就得写成韩世成。这些东西是韩在Masaryk University写的,最早叫TeX2PDF,当时PDF标准还是1.1,很简单,然后随着PDF升级,逐步加新功能,随后改名为pdfTeX,后来加了eTeX的扩展就逐步形成现在的pdfeTeX。实际上韩在那个大学读博的时候,他导师像先让他用prolog实现一个,韩真的去实现了,写了一段时间之后发现好像跑偏写不出来了……所以他还是以Pascal写的。pdfTeX不直接支持中文,那是因为代码里面就没做考虑。我在做pTeX-ng之前仔细考察过是不是有将pTeX的补丁合并到pdfTeX中的可能性,读了三个月的代码之后,发现绝无可能,其实最大的问题出自PDF生成代码。pdfTeX最早的PDF支持只需要1.1,那个版本不需要做多少工作,所以PDF生成代码部分是写死在源码里面并没有使用第三方库的(实际上当时也无可能使用第三方库,时年1998年)。 下面说TeXgX和XeTeX。TeXgX还是有主页可以看的,见TeXgX 1.1b3。XeTeX的代码就好找了。这两个东西的作者是Jonathan Kew,现在应该在Mozilla吧。这两个东西其实都是平台相关性比较大的,最早都是在Mac上实现的。TeXgX我没用过,所以我不细说。XeTeX是2005年首先在用户组会议上公开版本的。2005年,也是国内第一次承办TUG会议,洪峰那个人我就不说了。XeTeX实际上虽然是有Unicode支持的,但是其实对汉字处理还不是太好,直到今天都不是太好,需要用钩子处理汉字。 eeTeX和LuaTeX得放一起说了,为嘛呢,因为开发者基本一样:Taco Hoekwater和Hans Hagen。实际上,我对eeTeX了解不多,你们可以看这里:Moteurs。eeTeX的主页现在好像访问不了,据我以前的了解,eeTeX加了不少类似ConTeXt的那种成对的命令。而LuaTeX则好说多了,我以前吐糟过很多次,不想再重复了。LuaJITTeX呢,就是把LuaTeX中的Lua换成LuaJIT而已,我测试过,执行效率是高一点,但是还是个坑啊。 对于pTeX系,我以前也介绍过不少, pTeX是日本ASCII公司开发的汉字处理引擎。在2008年和2010年经历合并以及收购之后,pTeX的实际开发已经停止,已经转向由社区维护。upTeX是在pTeX基础上加了Unicode支持,但是还是有一定的局限,比如设定catcode什么的。epTeX是加了eTeX支持的。 既然提到eTeX很多次了,那么就仔细说吧,eTeX得和NTS一起说。NTS是设计野心相当大的一个项目,但是后来喜闻乐见地烂尾了,可见:tex.loria.fr/moteur-dis。NTS的代码我也看过,用Java实现的,见CTAN: Package NTS,这里面是没有多少新的功能的。NTS的讨论,后来在eTeX里面实现了,比如\middle。eTeX现在基本上是各大TeX的标配了。 HeX和ANT可得放一起说,这俩都不是使用C或者Pascal实现的。HeX是使用Haskell实现的TeX,见luispedro/hex · GitHub。后者是用OCaml实现的类TeX系统,见CTAN: Package ant。这俩要说完成度,还是ANT实现的程度比较高,HeX还是有点试验性质的东西,看看就好。 TeX-XeT和TeX--XeT,见CTAN: Search TeX-XeT,这是啥呢?就是TeX里面实现的BiDi。这俩都是比较旧的实现,eTeX里面的BiDi实现是足够好的。 选自:http://zhuanlan.zhihu.com/LaTeX/19959301

点赞(0)

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部