> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/zh-cn/shen-ru-wen-zhang/49-the-tex-family-tree-latex-pdftex-xetex-luatex-and-context.md).

# TeX 家族树：LaTeX、pdfTeX、XeTeX、LuaTeX 和 ConTeXt

LaTeX 的故事要追溯到 1977 年，当时 Donald Knuth 首次意识到需要一种高质量的排版程序。如今，Knuth 当年构想出的系统至今仍然是完成这项工作的最佳工具，这足以证明 LaTeX 的卓越品质，尽管在随后的几十年里又加入了许多有用的扩展。事实上，LaTeX 正是 Donald Knuth 所开发的原始系统的这些扩展之一，而那个原始系统叫作 [TeX](http://www.tug.org/).

为了在 LaTeX 圈里保住你的江湖地位，你得把它写成大写的 T 和 X，并把它念作 Lay-Tech。这是因为 TeX 里的 X 实际上是来自希腊字母 Chi（χ）的大写形式。而按正常大小写和读音写作 Latex 的 latex，则是一种橡胶！

## 原始 TeX

如今有一大类工具都是从 TeX 衍生出来的，乍一看它们的名字就像一串胡言乱语：LaTeX、pdfTeX、XeLaTeX、LuaTeX、ConTeXt 等等。它们的共同祖先当然是 Knuth 的原始 TeX 程序。它接受纯文本格式的文档，并把它转换成一份排版精美的文档。Knuth 对排版相当讲究，而 TeX 中对细节的关注可谓一目了然。一个 TeX 文档示例如下：

```latex
\TeX{} 很擅长排版像 `fjord'、`efficiency' 这样的单词，
以及 `fiasco'。它在排版数学公式方面也很擅长，比如
$a^2 + b^2 = c^2$。
\bye
```

将其通过 TeX 程序运行后，输出结果是：

![Texsample.png](/files/d80d5a9789948ad1c837a877a0ae4c018e2f9ab4)

请注意，在示例单词中，字母组合 'fi'、'fj' 和 'ff' 是如何自然连在一起的，以及数学符号的间距如何恰到好处。放到更大尺度上看，TeX 在合适的位置断行以生成两端对齐文本方面做得非常出色，并会在适当的地方进行连字符断词。

它不仅能把文本排版得很好，还提供了一系列命令，例如 `\bye` 和 `\TeX` 在上面的示例中。这些命令可以做一些简单的事情，比如改变字体大小，或者改变文本的排版方式；也可以做更强大的事情，比如维护章节编号以便交叉引用你的页面，或者自动生成目录。TeX 程序内置了大约 300 个命令，但也可以在其中定义其他命令。Donald Knuth 还从 TeX 内部编写了另外大约 600 个有用命令，放在一个名为 Plain TeX 的宏包中，使一些常见的排版任务更容易完成。

## LaTeX

TeX 和 Plain TeX 中的命令仍然相当基础，用它们来做复杂的事情并不容易。为了解决这个问题，Leslie Lamport 创建了 [LaTeX](http://www.latex-project.org/) 在 20 世纪 80 年代初创建的，旨在提供一种比 TeX 更高级的工作语言。LaTeX 是一组根据底层 TeX 命令定义出来的命令，往往要经过很多很多层抽象。你在 LaTeX 文档中使用的所有命令，实际上都只是底层一组复杂的 TeX 命令，除非你直接使用 TeX 命令！像宏包（`\usepackage{...}`）、环境（`\begin{environment} ... \end{environment}`）以及文档类（`\documentclass{...}`）这些概念，都是 Leslie Lamport 在 LaTeX 中引入的。

通过为 LaTeX 创建一个标准化的宏包系统，Leslie Lamport 让这个社区得以迅速壮大。如今已有成千上万的 LaTeX 宏包可供使用，让你能排版从子图到编织图样的各种内容。针对不同类型的文档也有许多文档类可供选择，无论你是在写书、实验报告还是简历。许多出版社和期刊都有自己的定制文档类，会按他们想要的方式设置文档样式。

## pdfTeX

对于一款已有 20 多年历史的软件来说，TeX 程序的稳定性令人惊叹；Knuth 曾在 1989 年宣布它的功能已完善，此后只做了错误修复。当然，这并没有阻止 LaTeX 持续而显著的发展，因为它本身就是用 TeX 编写的。事实上，TeX 的稳定性让像 LaTeX 这样建立在其之上的宏包得以蓬勃发展。

这并不是说底层的 TeX 程序在过去 20 年里没有任何进步。事实上远非如此，只不过改进是在 TeX 旁边进行的，而原始 TeX 保持稳定。20 世纪 90 年代最重要的改进是创建了 [pdfTeX](http://www.tug.org/applications/pdftex/) 由 Hàn Thế Thành 为其博士论文所创。原始 TeX 程序会把排版后的文档输出为一种名为 DVI（DeVice Independent format，与设备无关格式）的自定义格式，之后可以再转换成用于打印的 PostScript 文件。然而，PDF 格式在 1993 年出现，而今天我们可以清楚地看到，它作为一种更好的格式，明显胜过了 PostScript。PDF 有许多优势功能，比如章节之间的超链接、能让你在 PDF 阅读器左侧看到目录的元数据部分，以及对更广泛、更现代的图像格式的支持。pdfTeX 是对 TeX 的一种修改，它允许直接输出为 PDF，从而利用这些额外功能。

如今你在系统上安装 LaTeX 发行版时，它实际上会附带两种不同的程序： `tex`以及 `pdftex`。它还会在此基础上附带另外两个程序： `latex` 和 `pdflatex`，但它们实际上只是对底层程序的包装器 `tex` 和 `pdftex` 分别对应 `latex` 或 `tex` 那么你会得到一个 DVI 文件，你可以把它转换成 postscript 文件或 PDF，但如果你运行 `pdflatex` ，那么你会直接得到一个 PDF。

大体上， `pdftex` 和 `pdflatex` 是对 `tex` 和 `latex`的改进，不过有一个缺点。`.eps`）因为这些文件可以很容易地被包含在 PostScript 文件中（这些 PostScript 文件是通过转换 `.dvi` 文件通过 [`Dvips`](https://www.tug.org/texinfohtml/dvips.html)）。不过， `pdftex` 无法包含 EPS 文件，因此你应改用 PDF（PDF 可以通过 EPS 文件借助命令生成 `epstopdf` 它通常随 LaTeX 发行版一起提供）。 `.png`, `.jpg` 和 `.pdf` 图像，而原始 TeX 只支持 .eps（通过 [`Dvips`](https://www.tug.org/texinfohtml/dvips.html)).

## XeLaTeX 和 LuaTeX

到目前为止，我们已经看到 TeX 自诞生以来主要沿两条不同路线演化：一是在原始系统之上加入更易用的命令（LaTeX），二是更新底层程序以支持 PDF 输出（pdfTeX）。不过，故事并没有就此结束，现代化 TeX 的努力仍在继续。2004 年，Jonathon Kew 创建了 [XeTeX](http://tug.org/xetex/)，这是对底层 TeX 引擎的另一种修改，这次是为了支持除纯英文数字和字母之外更广泛的字符范围，并加入对现代字体格式的支持。这使得用外语写作容易得多，也让你可以在 LaTeX 中使用那些传统上只有文字处理器才能用的字体。

[LuaTeX](http://www.luatex.org/) 旨在用一种更合理的编程语言扩展原始 TeX 程序。虽然原则上你可以从 TeX 中做任何事情，但在实践中，它是一门非常笨拙的编程语言，甚至是否算得上编程语言都不好说。LaTeX 的许多内部机制都很复杂，外部人士很难理解，这在很大程度上是因为只能用 TeX 来处理。LuaTeX 增加了同名脚本语言 Lua，它是一种简单而稳定的语言，非常适合编写复杂的宏。到 2012 年为止，它仍在积极开发中，而且它的 API 可能会变化，但依然非常实用。

## ConTeXt

我们已经提到过 LaTeX 是 TeX 所提供命令的扩展，但它并不是唯一一个对 TeX 进行了重要扩展的宏包。 [ConTeXt](http://wiki.contextgarden.net/What_is_ConTeXt) 是另一个系统，由 Hans Hagen 于 1990 年创建。LaTeX 的目标是把用户从排版和布局的决策中解放出来（你输入 `\section` 和 `\emph` 但不用关心这些会做什么——那由文档类或布局来决定）。另一方面，ConTeXt 旨在为高级排版功能提供一个易用的接口。遗憾的是，我对 ConTeXt 的了解没有我希望的那么多，所以我没法进一步详细展开，不过如果我以后有机会更多地试验它，我一定会把我的发现写下来。

作为最后一个历史注脚，我应该提到 [AMSTeX](http://en.wikipedia.org/wiki/AMS-LaTeX) ，它是对 Plain TeX 宏的扩展，并于 1982 年至 1985 年间被美国数学学会（AMS）使用。它的影响在 AMS-LaTeX 宏包中得以延续，这些宏包是许多 LaTeX 文档的标配： `\usepackage{amsmath}`.

## 未来

TeX 和 LaTeX 的未来会怎样？我还不知道，不过正如 Alan Kay 曾经说过：

> 预测未来的最好方式就是去创造它。

借助 ShareLaTeX，我们希望在第三个方向上改进 TeX 和 LaTeX，即显著改善 LaTeX 的工作流程。尽管已经有 20 多年历史，LaTeX 仍在很大程度上是一个命令行程序，必须在编写、编译和检查输出的繁琐循环中使用。协作方式往往依赖笨拙的电子邮件，而不是像 Google Documents 那样简化的流程。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/zh-cn/shen-ru-wen-zhang/49-the-tex-family-tree-latex-pdftex-xetex-luatex-and-context.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
