TeX, LaTeX, XeTeX, PdfTeX等等

TeX 是一种宏语言。就像别的语言有库一样,TeX 语言有的集合。这些宏,就是用这个语言写出来的东西,供大家共用的。TeX 有个最基本的宏集合,与基础语言一起构成一种“格式”,就是 Plain TeX。基本的 TeX 语言和 Plain TeX 的宏,都是 Knuth 完成的。
后来有了 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 文件(里面是排序整理好的索引条目)。

-----------------------------------------ZZ From ctexfreshman----------------------------------------------
TeX:一种宏语言。
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文件)。那就好理解多了。

不知道上述理解对不对。如有错误,还请各位指点。

另外,我觉得,介绍概念时可以采用数学上的定义的方法,单独列出来每个概念的定义,每个概念的定义中不能含有前面没有定义的概念。这样就会让人好理解的多。上面我写的摘要就是这样做的。

----------------------------------------------------------------------------------------------------------
后记:
用latex写论文,从2004年就开始了,现在8年过去了,从网上对tex/latex的搜索量就能看出来,这玩意真的火了!!
对新手而言TeX的排版很漂亮,不管是“艺术”也好,“精美”也好,反正对一个菜鸟而言,从一个专业杂志网站下载*.cls文档类文件,然后不用操心版面设计,把自己的东西输进去,马上出来一篇很professional的文章,看着都赏心悦目,虽然内容可能很垃圾!但是要弄懂里面的东西,没有点程序设计的基础还是蛮吃力的。
对上面的问题自己的意见:
TeX可以认为是一种语言,与C语言等程序设计语言一样,区别是它不是用来计算,而是将你写的代码(tex文件)中的命令($x^2$, \section{}等)编译输出为屏幕显示的点阵文件(或者看作是bmp的图片文件),起个名字叫dvi(与设备无关)。这样dvi;文档就可以用dvi浏览器在各种平台上查看或者打印。 
然而TeX程序太过原始,不太好用,像有人认为C语言难学一样,后来LaTeX就基于TeX的核心,加入一些宏包(例如将原来多条复杂的命令整合起来变成一条,更简单好用),于是很多人都可以用LaTeX写一些像样的文章了。
随着时代进步,计算机的进步等等,现在PDF也是跨平台,而且在Linux,Mac,Windows上支持的都很好,于是乎有人就开发了pdflatex(pdftex)编译器, 将TeX源码编译生成PDF文件,这下好用多了。例如我用Mac,支持PDF很好。我就喜欢将电脑的资料存为PDF格式。那么LaTeX写的源代码,用pdflatex编译为pdf,很好用!现在就主要用这个!
随着用tex的人越来越多,不是只有英文语言国家,其他国家也要用啊。如中文,最初人们用的是CTEX,用CJK包来支持中英混排,但是你得额外安装一些中文字库。同样,XeTeX呢就是直接调用操作系统的字库来编译生成PDF,不用再安装了。这个呢,就涉及到TeX对字体库的问题了,TeX出来是可印刷级别的文档,那么里面的字放大很多倍还是很清晰,这个就是字体库的功劳,点阵分辨率很高。
Tex好用,在于发表论文时,一般杂志都有模板,下载后把自己的内容填进去生成pdf,提交就完了。
Tex难用,在于一旦你想自己设计页面风格,或者搞一下高难度的东西,那么你就得阅读cls文档,参考文献如bst文档,学会怎么用海量的命令来精细控制各种显示。当然也有好心人自己折腾完,写成宏包发布,那么你只需要去学者用就行了,但是这依然不轻松。推荐页眉页脚fancyhdr包等等。
 
此外,新手最好不要用哪些tex编辑器。就用一个普通文本编辑器,慢慢添加内容,慢慢编译尝试。
当你写好tex源代码文件,命令行执行latex *.tex,看看输出些什么东西,会看到多了一些如.log,.toc.,lof,aux等等,当然简单文件可能没那么多,这些也是tex生成pdf文件必须的辅助文件,然后再运行一下latex *tex,这次是为了添加一些应用,如公式,文献等。最后来个pdflatex *, 你会找到目录下的pdf文件。当然如果你嫌烦,就上面一堆命令写成一个批处理就是。这要比鼠标点一些tex编辑器上的按钮更能了解tex怎么用。
 
至于总有人争论latex与word谁好,没那个必要。我要写论文,大量的公式,图片,参考文献,latex套用杂志的模板,自然很好用。而且杂志社也方便,一劳永逸!而我就是随便写点东西,那word是比latex方便啊,所见即所得!当然现在Markdown也很方便。需求定位不同,干嘛一定要争!不过非常重要的一点还有就是Word是收费的,还不便宜!!别总是说盗版!
转自:http://blog.163.com/goldman2000@126/blog/static/1672968952012112645041621/
05-11 11:26