TeX

TeX（t，常被读作 t，音译“泰赫”、“泰克”，风格化后写作），是一个由美国计算机科学教授高德纳（Donald Ervin Knuth）编写的排版软件。TeX的 MIME 类型为`application/x-tex`，是一款自由软件。它在学术界特别是数学、物理学和计算机科学界十分流行。TeX被普遍认为是一个优秀的排版工具，尤其是对于复杂数学符号的处理。利用 等终端软件，TeX就能够排版出精美的文本以帮助人们辨认和寻找。

## 历史

高德纳最早开始自行编写TeX的原因，是因为当时的电脑排版技术十分粗糙，已经影响到他的巨著《计算机程序设计艺术》的印刷品质。他以典型的黑客思维模式，决定自行编写一个排版软件：TeX。

他计划在 1978 年的学术休假时完成这项工作，但事实上，直到十多年之后的 1989 年，TeX排版语言才被“冻结”（可以使用）。1978 年夏天，盖伊·史提尔二世在高德纳编写其第一版的TeX程式时，正好在高德纳所工作的斯坦福大学，当他回到麻省理工学院（MIT）时他在 ITS操作系统 下重写了TeX的输出输入系统。TeX的第一版是用 SASL 语言写成的，运行于 PDP-10 型计算机，采用斯坦福大学的 WAITS 操作系统。在之后的TeX版本中，高德纳发明了所谓的 “文学编程”（literate programming），一种从同一源文件自动生成可编译的源代码和高质量的文档的编程方法。这种语言被称为 WEB，它所生成的源代码是使用 Pascal 编程语言。

一个从头开始重写的新版TeX于1982年发布，它被称为TeX82。除了其他修改之外，原本的断字算法被 Frank Liang 编写的新算法所取代。TeX82还使用了定点而不是浮点，以确保结果在不同的计算机硬件上重现。并且在盖伊·史提尔二世的大力游说下，TeX82包括一种真正的、图灵完全的编程语言。1989 年，高德纳发布了新版本的TeX和 Metafont。尽管高德纳希望保持程序的稳定性，但他意识到，只能输入 128 个不同的字符不足以容纳外语；因此TeX3.0 版本的主要变化是能使用 8 位元输入，即在文本中允许输入 256 个不同的字符。

从TeX第三版开始，之后的升级是在小数点后加入一个新数位，使之越来越接近圆周率“π”的值。TeX目前的版本是 3.141592653。这显示了TeX已经十分稳定，任何的升级都十分细微。高德纳曾表示 “最后一次升级是（于我过世后）将版本数改为‘π’，那时任何余下的漏洞将被看作程序的功能。”

由于TeX的源代码基本上处于公共领域，其他程序员可以（并明确被鼓励）改进系统，但需要使用其他名称来分发修改后的TeX。例如，Omega 项目是在 1991 年之后开发的，主要是为了提高TeX的多语种排版能力。高德纳创建了 “非官方” 修改版本，例如TeX-XeT，它允许用户在同一文档中混合写入从左到右和从右到左书写系统的文本。

## 范例

<image>

此乃于 Microsoft Windows 系统中示范的简易TeX文本范例。

首先建立一名为 `myfile.tex` 的纯文本文件，并载有以下内容：

```latex
Hello, World
\bye          % marks the end of the file; not shown in the final output
```

然后在命令行解释器（Command line interpreter），如 cmd 或 PowerShell 中键入

`tex myfile.tex`

并回车确认，之后TeX便会建立一名为 `myfile.dvi` 的文件。此文件可用如YAP之类的 DVI 检视器检视。此档于阅读器可见的是 “Hello, World” 一句话。`\bye` 是一个TeX指令，作用等同于档案结束标记，不会显示于此。此 DVI 文件可在阅读器中直接打印或转换成更普遍的格式，例如 PostScript，或现代更常见的 .pdf 格式。

另外，使用指令 `pdftex myfile.tex` 亦能输出 PDF 文件。PDFTeX出现之前，把 DVI 转成PostScript 再转成 PDF 所产生的字体显示质量很差（但打印则没问题）。这是由于TeX本身支持点阵字体（Type 3），而此远不及向量字体（Type 1）的显示质量好。

### 数学公式范例

以二次方程为例。

```latex
The quadratic formula is $-b \pm \sqrt{b^2 - 4ac} \over 2a$
\bye
```

$$\hbox{The quadratic formula is } \textstyle{-b \pm \sqrt{b^2 - 4ac} \over 2a}$$

所有行内公式在TeX中都须以一对 `$` 符号围住。如果要使公式成为行间公式，也就是另起一行居中，则应以一对 `$ $` 取代一对 `$`。例如：

```latex
The quadratic formula is $$-b \pm \sqrt{b^2 - 4ac} \over 2a$$
\bye
```

$\hbox{The quadratic formula is}\,$ $-b \pm \sqrt{b^2 - 4ac} \over 2a$

### 2.2

```
是一套以TeX描述的[[巨集]]软件。 有很多预设的模版、样式。它比TeX更为[[结构化编程|结构化]]，如包含了供建立[[索引]]、[[表格]]、[[列表]]等的巨集和[[公用软件]]。例如：
```

```latex
\documentclass[a4paper]{book}
\begin{document}
\section{ ... a title }
\subsection{ ... a subtitle}
%% Text goes here
\end{document}
```

执行

```
latex myfile.tex
dvips myfile.dvi
```

会建立一本为 PostScript 档的书。如要建立 PDF 档则可使用

```
pdflatex myfile.tex
```

## 特性

TeX软件在当时拥有其他排版软件没有或不成熟的功能。其中有一些功能得益于排版算法的创新，其中很多成为了高德纳的学生的论文主题。尽管有些功能现在已经被其他排版系统所实现，但仍有部分功能是TeX所特有的，比如数学公式的自动间距调整。

### 数学公式的自动间距调整

<image>

由于TeX的设计目标是实现高质量的书籍排版，高德纳在数学公式的排版上下了很大功夫。

他研究了三种按照老方法排版、排版质量高的书籍：艾迪生韦斯利出版社（即高德纳的《计算机程序设计艺术》的出版商）的出版物，尤其是汉斯·沃尔夫和 Joseph-Louis Lagrange 的书籍《Thermodynamics Innovation》（1856）、数学期刊《Acta Mathematica》、和数学期刊《Indagationes Mathematicae》。高德纳通过研究其数学公式的排版，总结出了一套数学公式内部间距的规则，并将其用于TeX。TeX排版数学公式时只是提供了一个间距调整引擎，实际的间距大小由数学字体提供。比如TeX默认的 Computer Modern 字体提供了一套成熟的间距参数，可以直接使用。

TeX的数学排版功能并非十全十美，有时也招来部分批评。比如TeX诞生的时代的部分机器由于容量不够，不足以存储TeX的所有字体参数，在部分场合需要hack才能正常使用。在美学方面，TeX对根号的处理也招致部分批评。

OpenType 字体技术的数学字体参数基于TeX。

### 断字与断行

与手动排版相比，计算机排版系统可以自动处理断行问题。大部分排版系统都采用首次拟合法处理断行，即一行一行处理，一行处理完就不管了，因此一旦遇到较长的专有名词，就会出现前面排版没有问题，但后面的行却出现极丑陋的大间距的情况。TeX的方法是一次处理一个自然段，尝试每一种断行方法，然后选出最优解。两种方法的差异如下：（此演示不考虑断字）

```
  The quick brown fox jumps over
the lazy dog. The words here are
quite  short.  Aren't they?  But
long     ones      such       as
perhydrocyclopentanophenanthrene
may appear.
```

```
  The  quick  brown  fox   jumps
over  the  lazy  dog.  The words
here  are  quite  short.  Aren't
they?  But  long  ones  such  as
perhydrocyclopentanophenanthrene
may appear. 
```

左边的例子是首次拟合法的结果。第4行单词间的空集中在一行导致排版不美观，TeX的方法由于考虑了所有的情况，所以一般情况下能找出较好的方法（即把空分散在 1~4 行）。

TeX的断行算法里有一个叫做 badness（“不美观度” 或 “丑度”）的参数，空格伸缩量越大 badness 越大。每一种断行的方式都有一个总体的衡量标准，包括 badness、断行、以及行与行之间的疏密差异等。TeX其实并不考虑所有的 $2^n$ 种情况，而是采用一种算法复杂度仅为 $\Omicron(n^2)$ 的最短路径算法，加上不考虑空格伸缩量太大的情况，断行所用的时间几乎和段落大小成正比。在分页问题上，TeX并不采用一种考虑所有情况后得出最优解的算法，而是用一页一页处理的方法。一是因为分页的灵活性没有断行那样高，二是因为当时的计算机没有足够的速度。但是，TeX仍然有避免寡行和孤行的功能。Michael Plass 的一篇论文指出，考虑图表的放置位置的完美分页算法可能为 NP 完全。TeX的断行算法后来被 Adobe InDesign 等桌面出版软件所采用。

在断行时，如果一遍不成功，TeX会尝试断字，即把一个诸如 “computer” 的多音节单词断成 “com-” 和 “puter” 或 “compu-” 和 “ter” 分在两行。TeX82采用了一套 Frank Liang 于 1983 年发明的断字算法。这套算法采用 “匹配项” 的方法。“匹配项”的作用是找到单词中可能出现的一些字母组合，然后在适当的位置插入数字来表示可能或不可能的断字点。这些 “匹配项” 对单词的字母与字母之间会给予是否为断字点提示。提示有相对的强弱。如果提示互相冲突，则强的会覆盖弱的。最后留下来的提示决定一处是否为断行点。TeX 自带 4447 条 “匹配项”，从 .ach4 开始到 z4zy 结束。所有 “匹配项” 使用 1 到 5 这五个数字，其中奇数表示可能为可断字点，偶数表示不为可断字点，大的数字的优先级高于小的数字。例如，h5elo 的含义是，单词中如果出现 “helo”，那么在 “h” 和 “e” 之间有很大把握为可断行点（例如 “bach-e-lor” 和 “ech-e-lon”）；hach4 的含义是，单词中如果有 “hach”，则 “h” 后面很可能不是断字点（如 “tooth-aches”），虽然把握没有数字 5 的那么大。例如，对于单词 “encyclopedia”，对得上的匹配项有`'''1'''c'''4'''l'''4''', '''1'''cy, '''1'''d'''4'''i'''3'''a, '''4'''edi, e'''3'''dia, '''2'''i'''1'''a, ope'''5'''d, '''2'''p'''2'''ed, '''3'''pedi, pedia'''4''', y'''1'''c`。插入完所有数字后，留下来的数字中的最大值为`en'''1'''cy'''1'''c'''4'''l'''4'''o'''3'''p'''4'''e'''5'''d'''4'''i'''3'''a'''4'''`，最后奇数处为可断行点：“en-cy-clo-pe-di-a”。

这种方法可以找到约 90 % 的正确断字点，几乎从不出错。而且，TeX有一个 “断字特例表” 的功能，对于自带断字算法出错的单词可以手动处理。TUG（TeX用户组）有一份英语单词的特例表。另外，TeX默认不会把单词在前两个字母或后三个字母之间断开，所以 encyclopedia 一词不会断成 “encyclopedi-” 和 “a”（这样也的确不好看）。

## 开发

TeX是非常稳定的程序，高德纳悬赏奖励任何能够在TeX中发现程序漏洞（bug）的人。每一个漏洞的奖励金额从 2.56 美元（16 进制的100 美分）开始，以后每发现一个 bug，都会翻倍，直到目前的 327.68 美元封顶。然而高德纳从未因此而损失大笔金钱，因为TeX中的漏洞极少，而真正发现漏洞的人在获得支票后往往不愿将其兑现。到目前为止，关于TeX的最后一个 bug 是被 Oleg Bulatov 发现的。

### 衍生软件

有许多衍生出来的文档处理程序就是基于TeX的，主要的有：

- AMS-TeX：美国数学学会（American Mathematical Society）发表的TeX版本。绝大多数的 $\mathcal{AMS}$-TeX功能可以利用 $\mathcal{AMS}$ 包在 上实现，称为 $\mathcal{AMS}$-TeX。
- ConTeXt
- jadeTeX
- LaTeX（LamportTeX）：流行的文档处理程序
- LuaTeX
- MacTeX
- MikTeX
- pdfTeX
- SyncTeX
- Texinfo：GNU 的文档处理系统
- TeX Live
- XeTeX

### 兼容工具

TeXmacs 是一个所见即所得的科学文档编辑器，利用TeX字体作为显示字体，具有类似 Emacs 的编辑方式。它可以导出为TeX文本，PS，PDF 文档，以及 HTML，XML 页面。

LyX 也是一个类似的工具。

## 发音和拼写

TeX这个词的标准发音为 tɛx，其中x为清的软腭擦音，相当于中文里“赫”字的声母，或者苏格兰语 “loch” 一词中 “ch” 的发音（TeX其实是希腊单词 τεχ 的全大写形式）。整个词发音接近“戴赫”或“泰赫”。在英语和法语中实际通常讹读作 /tɛk/，发音接近“泰克”。TeX这个词来自希腊文中的 τέχνη （TEXNH），希腊文意为“艺术”和“制造”，也是英语中 technical（技术）的词源。书写时，三个字母都是大写，字母 E 应当左缩进 0.1667 em，向右缩进 0.125 em，并低于其他两个字母 0.5 ex。而不支持复杂文本的系统则只能这样书写：“TeX”。

TeX的用户喜欢创造一些和TeX有关的词汇，例如 “TeXnician”（与英语单词 “technician”，技工的发音相近，意为“TeX 用户”），“TeXhacker”（“TeX程序员”，“TeX黑客”）和“TeXnique”（与英语单词 “technique”，技巧的发音相近，意为“TeX水平”）等。另有人发明一词为“TeXpert”（“TeX高手”），但是高德纳本人反对这一名称，因为这里TeX一词的读法是错误的。

## 参考文献

- 本条目部分或全部内容出自以GFDL授权发布的《自由线上电脑词典》（FOLDOC）
- . The source code of the book in TeX (and a needed set of macros ) is available online on CTAN. It is provided only as an example and its use to prepare a book like The TeXbook is not allowed.
- . The full source code of TeX; also available on CTAN. Being written using literate programming, it contains plenty of human-readable documentation.
- . Reprinted as .
- contains extensive documentation about the algorithms used in TeX.
- on AMS-TeX.

## 外部链接

- 中文TeX用户组
- TeX Users' Group
- Eijkhout, Victor. TeX by Topic
- TeX for the Impatient

## 基本资料

- 扩展名：.tex
- mime：application/x-tex
- 发行日期：1978年
- 类型：文档文件格式