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年
- 類型：文檔文件格式