> 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-tw/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 首次意識到需要一套高品質的排版程式。能夠證明 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/a5a3d41c6d3f640319e4742815f36d50f77c2f1f)

請注意，範例字詞中的字母組合 'fi'、'fj' 和 'ff' 彼此連接得十分自然，而數學符號之間的間距也很合適。放大到整體來看，TeX 在適當的位置斷行以產生對齊良好的文字方面表現極佳，並在需要時加入連字號斷字。

它不只把文字排版得很好，也提供了一系列指令，例如 `\bye` 以及 `\TeX` 如上例中的 \TeX。這些指令可以做些簡單的事，例如變更字型大小，或改變文字的排版方式；也可以做更強大的事，例如維持章節編號以便交叉引用你的頁面，或自動建立目錄。TeX 程式內建約 300 個指令，但也可以在其中定義其他指令。Donald Knuth 又從 TeX 內寫出了另外大約 600 個有用的指令，封裝在一個名為 Plain TeX 的套件中，使一些常見的排版工作更容易。

## LaTeX

TeX 和 Plain TeX 中的指令仍然相當基本，要用它們做複雜的事情並不容易。為了協助這點，Leslie Lamport 在 [LaTeX](http://www.latex-project.org/) 在 1980 年代初期創建了這套系統，提供比 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 則保持穩定。1990 年代最重要的改進是創造了 [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。如果你執行 `latex` 或 `tex` ，那麼你會得到一個 DVI 檔，可再轉成 postscript 檔或 PDF；但如果你執行 `pdflatex` ，你就會直接得到 PDF。

大致上， `pdftex` 以及 `pdflatex` 是對……的改進 `tex` 以及 `latex`，但也有一個缺點。原始 TeX 和 DVI 格式支援 Encapsulated PostScript 檔（`.eps`），因為這些檔案很容易被包含在 PostScript 檔中（這些 PostScript 檔是由轉換 `.dvi` 檔成 PostScript，透過 [`Dvips`](https://www.tug.org/texinfohtml/dvips.html)產生的）。然而， `pdftex` 無法包含 EPS 檔，因此你應該改用 PDF（可使用指令從 EPS 檔產生 `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 裡做任何事，但實際上它是一種非常笨拙的程式語言，甚至是否能算是程式語言都很難說。由於只能在 TeX 中工作，LaTeX 的許多內部機制都很複雜，對外人來說也很難理解。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://overleaf-pro.ayaka.space/latex/zh-tw/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.
