> For the complete documentation index, see [llms.txt](https://ayakaleaf-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://ayakaleaf-pro.ayaka.space/latex/zh-cn/shen-du-wen-zhang/49-the-tex-family-tree-latex-pdftex-xetex-luatex-and-context.md).

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

LaTeX 的故事可以一直追溯到 1977 年，当时 Donald Knuth 第一次意识到需要一个高质量的排版程序。如今他当年设想的那个系统仍然是处理这项工作的最佳工具，这充分证明了 LaTeX 的卓越品质，尽管在此后的几十年里已经加入了许多有用的扩展。事实上，LaTeX 就是 Donald Knuth 开发的原始系统的这些扩展之一，那个原始系统叫做 [TeX](http://www.tug.org/).

要想在 LaTeX 圈子里保持懂行的名声，你得把它写成大写的 T 和 X，并把它读作 Lay-Tech。这是因为 TeX 里的 X 实际上是源自希腊字母的一个大写 Chi（χ）。而按正常大小写和发音写作 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`的改进，不过也有一个缺点。原始 TeX 和 DVI 格式支持 Encapsulated PostScript 文件（`.eps`），因为这些文件很容易包含在 PostScript 文件中（这些 PostScript 文件是通过转换 `.dvi` 文件通过 [`Dvips`](https://www.tug.org/texinfohtml/dvips.html)）生成的。不过， `pdftex` 不能包含 EPS 文件，你应该改用 PDF（它们可以通过命令 `epstopdf` 该命令通常随 LaTeX 发行版一起提供）。作为对这一缺点的交换，pdfTeX 增加了对 `.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 文档那样更流畅的流程。


---

# 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://ayakaleaf-pro.ayaka.space/latex/zh-cn/shen-du-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.
