TeX, LaTeX, XeTeX, PdfTeX等等
后来有了 LaTeX,就是 Lamport TeX。LaTeX 也是宏的集合,也构成一种与 Plain TeX 不一样的格式。这种格式提供了不少方便的功能,并强调结构化的文档,因而很快风行起来。
世界在发展,LaTeX 这个格式提供的基本功能并不能满足所有人的需要,就有人接着写宏。这些宏可能就是在 LaTeX 这个格式的框架下面编写的,也就是说是依赖于 LaTeX 宏的宏。一些有能力有精力的人把他觉得有用的宏打成包,公开发布,就成为了 LaTeX 的宏包。换言之,宏包就是基本的格式的扩展。当然它是人人可写的,特别有名的,比如美国数学会官方定制的 AMSTeX/AMSLaTeX,就是一套 TeX/LaTeX 格式下面的宏包。
一个语言是抽象的,不能运行就没有结果。因此 Knuth 在设计这个语言的同时也给出了一个程序用来把 TeX 语言的代码转换为排版的结果——这个程序当然也叫 TeX。嗯,可以把这个程序看做编译器。直接运行 tex 命令(我用小写字母表示你实际使用的命令),默认就是用 Plain TeX 这种格式进行排版。为示区别,我们可以把 Knuth 的这个 TeX 程序叫 Knuth TeX。
用 tex 加上一个选择格式的命令行编译选项,就可以改用 LaTeX 这种格式进行排版了。但这很麻烦,于是就把 tex 命令与对应编译选项合成为一个命令,叫 latex。简言之,latex 命令就是 tex 命令加一个选项的简写方式。
Knuth TeX 这个程序有一些功能不好实现,后面就有人进行扩展,得到 ε-TeX 这个程序,一般写成 eTeX。eTeX 程序和 Knuth TeX 都是 TeX 语言的一个实现,eTeX 增加了少量的几个命令,但一般来说是没有太多区别的。
Knuth TeX 输出的格式是 DVI(DeVice Independent)文件,但后来电子出版业和电子文档交换中常用的格式是 Adobe 公司开发的 PostScript 格式(PS)和 Portable Document Format 格式(PDF)。因此就需要有一些工具完成这样的转换,一些转换程序应运而生:Dvips(把 DVI 转换为 PS);DVIPDF、DVIPDFM、DVIPDFMx(把 DVI 转换为 PDF,可以认为后面的是前面的改进版)。
转换的过程令人不爽,于是就又有了 TeX 语言的又一个实现,pdfTeX。它会把 TeX 语言写的代码直接编译成 PDF 文件。当然,不难理解 pdftex 命令就是用 pdfTeX 这个程序和 Plain TeX 这个格式进行排版,而 pdflatex 这个命令就是用 pdfTeX 这个程序和 LaTeX 格式进行排版。不过 pdfTeX 程序也保留了输出 DVI 格式的能力。
时代在发展,多字节的编码渐渐代替 ASCII 成为主流。为了支持 Unicode 编码和直接访问操作系统字体,又出现了 TeX 语言的新的实现,即 XeTeX。作为一个现代的程序,XeTeX 也直接输出 PDF 文件(我们暂不去管它内部有格式转换的实现方式)。于是,不难理解 xetex 命令就是使用 XeTeX 程序以 Plain TeX 格式排版,而 xelatex 命令就是用 XeTeX 程序以 LaTeX 格式排版。
哦,人们的要求总是在发展,现在又想在 TeX 中嵌入其他语言进行更强有力的扩展了。于是 Lua 脚本语言和 TeX 语言的结合体,LuaTeX 应运而生。LuaTeX 程序也是 TeX 语言的一个完整的有扩展的实现。LuaTeX 支持 Unicode、系统字体和内嵌语言扩展,能直接输出 PDF 格式文件,也可以仍然输出 DVI 格式。于是 LuaTeX 程序又对应了许多命令:luatex dviluatex 使用 Plain TeX 格式,输出 DVI;lualatex dvilualatex 使用 LaTeX 格式,输出 DVI;pdfluatex luatex 使用 Plain TeX 格式,输出 PDF;pdflualatex lualatex 使用 LaTeX 格式,输出 PDF。
瞧,语言的脉络是简单的,但软件程序总是层出不穷。
故事还没有完,前面我遗漏了一个重要的格式,叫做 ConTeXt。这个格式从一开始就很强调与脚本语言,也就是具体实现程序的结合。过去旧版本的 ConTeXt 是使用 pdfTeX 程序作为它的排版引擎的,用来扩展的脚本语言是 ruby,编译文件使用的命令一般是 texexec;新版本的 ConTeXt 则使用 LuaTeX 作为它的排版引擎,脚本也都直接使用 Lua,编译时使用的命令是 context。那么不难猜,所谓“XeConTeXt”是什么东西,它事实上是 ConTeXt 改用 XeTeX 程序作为它的排版引擎的一种编译方式,实际的命令则是 texexec 或 context 加上适当的命令行选项。
最后说一下 BibTeX 和 MakeIndex。这两个都是与 TeX 相关联的工具程序,一般用在 LaTeX 格式上。BibTeX 处理 LaTeX 格式编译时输出的 .aux 文件,根据其中的引用,从文献数据库中提取生成参考文献列表;而 MakeIndex 处理 LaTeX 格式编译时输出的 .idx 文件(里面是索引条目),生成 .ind 文件(里面是排序整理好的索引条目)。
Plain Tex: Tex中的一个最基本的宏集合与TeX的基础语言构成的一种格式。
LaTex: Tex中的一个宏集合,构成一种与 Plain TeX 不一样的格式。
Tex程序:把Tex语言转换为排版的程序,也叫Tex。为区别,称这个 TeX 程序叫Knuth TeX。
tex命令:Tex程序中的编译命令。tex命令默认用Plain TeX格式进行排版。也就是说tex命令后面默认跟的tex文件应该是用Plain Tex格式写的。
latex命令:tex命令加上某一个选项使用,就会用LaTeX 格式进行排版,也就是说此时后面跟的tex文件应该是用LaTex格式写的。为方便,就把tex 命令与对应编译选项合成为一个命令,叫latex命令。
ε-TeX 程序:Knuth TeX程序的一个扩展,也是一个程序,一般写成 eTeX。增加了少量的几个命令,但一般来说是与Knuth TeX程序没有太多区别的。
实现:在文中的意思就是指“程序”的意思。如文中:eTeX 程序和 Knuth TeX 都是TeX语言的一个实现(也就是说,eTeX 程序和 Knuth TeX 都是把TeX语言转换为排版的程序。程序作用于tex文本文件,把tex文件编译成dvi文件)。
pdfTeX程序:Tex语言的又一个实现,也就是把Tex语言转换为排版的又一个程序。它会把 TeX 语言写的代码直接编译成 PDF 文件。
pdftex命令:pdfTex程序中的命令,用来编译用Plain TeX格式写的tex文件。
pdflatex命令:pdfTex程序中的命令,用来编译用LaTeX格式写的tex文件。
XeTeX程序:TeX语言的新的实现,即把Tex语言转换为排版的一个新程序。支持Unicode 编码和直接访问操作系统字体。与pdfTex相似。
xetex命令:XeTeX程序中的命令,用来编译用Plain TeX格式写的tex文件。
xelatex命令:XeTeX程序中的命令,用来编译用LaTeX格式写的tex文件。
其中“实现”这个概念比较别扭,不知是不是计算机中的概念,反正非计算机专业的人读起来不知道“实现”是什么意思,不知道“TeX语言的一个实现”是什么意思。如果把“TeX语言的一个实现”写成是把TeX语言转换为排版的一个程序,这个程序作用于tex文本文件,把tex文件编译成某些文件,如dvi,pdf文件(比如pdfTex程序把tex文件编译成pdf文件)。那就好理解多了。
不知道上述理解对不对。如有错误,还请各位指点。
另外,我觉得,介绍概念时可以采用数学上的定义的方法,单独列出来每个概念的定义,每个概念的定义中不能含有前面没有定义的概念。这样就会让人好理解的多。上面我写的摘要就是这样做的。