序幕有些長

對於 TeX 愛好者來講,TeX 的漫長曆史一直是他們津津樂道的,然而在他們眼裏看來是歷史的東西,在我看來,僅僅是一場漫長的尚待正式拉開的序幕。php

Knuth 的 TeX

20 世紀 60 年代,著名計算機科學家和數學家,斯坦福大學 Donald Knuth 教授在忙於撰寫那部叫作《計算機程序設計藝術》 的書。這部書計劃一共寫七卷,Knuth 在寫第四卷時,出版社拿來了第二卷的第二版書樣給他過目,結果令他大失所望。由於當時出版社的印刷技術沒有使他的書稿更好看,反而變糟了,尤爲是在數學公式和字體上面的缺陷更令他沒法接受。因而他就開發了一個既能供科學家編排手稿,又符合出版社印刷要求的高質量的計算機排版系統。html

Donald Knuth
Donald Knuth算法

這個排版系統的名字叫作 TeX。這個名稱是由三個大寫的希臘字母 ΤЄΧ 組成,在希臘語中是「科學」和「藝術」的意思。爲了方便書寫,通常在純文本文檔中將其寫爲 TeX, 唸作「泰赫」(我我的習慣將其讀做「泰克」)。編程

Knuth 於 1977 年開始構造 TeX 系統,併爲該系統設計了一個字體生成軟件——METAFONT。1982 年 TeX 系統發佈,以後又有幾回版本升級。Knuth 用圓周率 π 的近似值做爲 TeX 系統的版本號,並採用天然底數 e 的近似值做爲 METAFONT 版本號。系統每升級一次,其版號就增長一位數字,從而不斷地趨近於 π 和 e,這種別出心裁的版本號表示方式一方面能夠展現 TeX 與科技文獻排版的密切關係,同時也表達了 Knuth 對 TeX 系統與 METAFONT 系統不斷追求完美的願望 。服務器

1990年 TeX 第3.1版發佈時,Knuth 宣佈:網絡

  • 再也不對 TeX 進行任何功能上的擴張。
  • 若是出現明顯問題,則修正後的版本號依次爲3.14,3.141,3.1415.....在本身離開這個世界的時候,將最後的 TeX 版本序號改成 π。 此後,即便再發現錯誤,也都將成爲 TeX 的特徵而保留。若是有人非要修改的話,就不要再叫 TeX 了,請另外起名。
  • 關於 TeX 的一切,已經所有作了書面說明,能夠自由利用來設計其餘的軟件。

TeX 系統的內核至關穩定,幾乎沒有 bug,1995 年之後版本號一直中止在3.14159,直到 2002 年 12 月才又進行了一次升級。到目前爲止,TeX 系統的版本序號是3.141592,而 METAFONT 版本序號則爲 2.71828。數據結構

TeX 的許多化身

與時下家喻戶曉的微軟 Word 那種所見即所得的文檔排版方式相比,TeX 顯得多麼的不合時宜,然而 Knuth 說:『我歷來也不期盼 TeX 會成爲一個萬能的排版工具,讓你們使用它能夠來作一些「快速而髒」的東西;我只是將其視爲一種只要你足夠用心就能獲得最好結果的東西。』編程語言

Knuth 之因此很自信的宣佈再也不對 TeX 進行任何功能上的擴張,並不是自視甚高,而是有必定客觀緣由的。其中最主要的緣由就是 TeX 提供了宏擴展機制,開發者或者用戶都可以對 TeX 提供的 300 多條基本的控制序列(Control Sequence)進行組合,定義更爲高級的控制序列,從而加強 TeX 的排版能力。工具

儘管 TeX 沒有原生提供的功能能夠經過宏擴展來實現,可是終究是有一些比較重要的問題是宏擴展方式難以解決的,好比對多國語言文字的支持、對 TrueType、OpenType 字體的支持、圖形支持等問題。因此在 Knuth 的 TeX 以後,許多人努力地對 TeX 進行改進,或者乾脆開發一個全新的「TeX」。開發者們爲了尊重 Knuth 宣言的第二條,這些改進版的 TeX 或者從新開發的 TeX 均再也不叫 TeX,它們都有新的名字,諸如 e-TeX、Omega、pdfTeX、XeTeX、LuaTeX 等。post

自 1990 年以來,TeX 的改進項目層出不窮,可是大浪淘沙,許多項目都沒有成功,有的已經死去,有的在苟延殘喘。目前廣爲使用 TeX 改進版本主要有 pdfTeX、XeTeX 和 LuaTeX。應當注意的是 pdfTeX 項目開發者已於 2008 年 6 月宣佈自 pdfTeX 1.50.0 版本以後只進行 bug 修正,再也不提供新功能擴張。LuaTeX 項目則被看做是 pdfTeX 項目的延伸,而且添加了其它許多重要的新功能,並繼續開發下去。

雖然 Knuth 的 TeX 系統出現了許多的改進版本和分化版本,但大都是良性的,而且變更的只是 TeX 引擎,它們大都兼容 Knuth 定義的 TeX 格式。這就比如只改進汽車 的發動機性能,並不改變或者只是略微改變汽車駕駛操做方式,這使得用戶能夠像往常同樣去駕駛一輛性能更好的汽車。因此 TeX 用戶們一般無需擔憂 TeX 引擎太多,致使本身的 TeX 文稿在其餘人的計算機上沒法編譯。

幾個 TeX 術語

前一節出現了幾個常常讓 TeX 新用戶難以理解的術語——控制序列 (Control Sequence)、TeX 引擎 (Engine) 以及 TeX 格式 (Format)。爲了幫助那些沒有太深的計算機使用背景的 TeX 新用戶來理解這些概念,我要找點適當的東西比喻一下。

首先,來看 TeX 引擎是什麼。引擎,俗稱發動機,是用來驅動某個系統運轉的。比方說汽車引擎,就是給汽車提供動力的裝置,讓汽車的機械部件運做起來,從而能夠日行千里,夜行八百。TeX 引擎是一個計算機程序,它的做用就是驅動計算機爲用戶輸出排版結果。

而後來看一下控制序列又是什麼東西。衆所周知,如今最早進的汽車也不是自動駕駛的,它一般須要駕駛者輸入一些控制參數,譬如檔位、油門、離合等。固然,TeX 引擎不須要輸入這些,它只須要你向它提供要排版的文字以及一些控制序列而已。譬以下面這行 TeX 引擎可接受的字串:

to be {\bf bold} or to {\sl emphasize} something.

這行字串包含了所要排版的文字以及控制序列,其中以 \ 做爲前綴的單詞便構成一個控制序列,好比 \bf\sl。TeX 在接受該字串以後,它就能夠嚴肅的按照控制序列的指示驅動計算機輸出相應的排版結果:

TeX控制序列

觀察這份由 TeX 引擎驅動計算機輸出的排版結果,能夠看到在控制序列 "bf" 以後的單詞 "bold" 的排版效果是粗體,而控制序列 \it 以後的單詞 emphasize 的排版效果是斜體。即便你如今是第一次據說 TeX,應該也不難猜出 \it\bf 分別是用來控制文字的粗體和斜體的,以及字串裏的 {...} 括號是限制控制序列的做用域的(即控制序列只對 {...} 所包含的字串有效)。

能夠將 TeX 的控制序列看做是由用戶發給 TeX 引擎的指令,TeX 引擎會乖乖地按照這些指令去驅使計算機生成用戶所指望的排版結果。TeX 控制序列就像對汽車的方向盤、檔位、油門、離合、剎車等裝置進行操做同樣,能夠使用它們來控制汽車引擎及其它相關部件的工做狀態,從而讓汽車按照咱們的意 願行駛在正確的道路上。若是一份文本文件所包含的內容除了控制序列就是所要排版的文字信息,咱們能夠將該文件稱 爲 TeX 文稿(主要是爲了敘述上的方便)。

Knuth 在設計 TeX 系統時,爲 TeX 引擎定義了 300 多個比較基本的控制序列。TeX 用戶只要掌握了這些控制序列的用法,就具有了排版各類類型文檔的能力。這種想法很好,可是在實際應用中,這些控制序列與所排版的文字交織在一塊兒,顯得很是不堪,比方說下面這行字串:

T\kern -.1667em\lower .5ex\hbox {E}\kern -.125emX

看上去非常古怪,實際上它的目的只是對 "TEX" 這三個字母進行稍微特殊一些的排版:TeX

試想,若是一篇很長的 TeX 文稿裏處處都是相似的文本, 對於 TeX 引擎而言非常直白,由於它只管機械地處理那些控制序列;對於直接閱讀該文稿的咱們而言就異常晦澀了,由於咱們關注的是文稿中的內容,另外輸入那些稀奇古怪 的控制序列也是個很費時間的體力活。

針對這一問題,Knuth 爲 TeX 創建了宏擴展機制,容許用戶去組合一部分基本的控制序列,從而生成更方便使用的控制序列。好比上述 TEX 的排版語句能夠定義成 \TeX 控制序列:

\def\TeX{T\kern -.1667em\lower .5ex\hbox {E}\kern -.125emX}

這樣,在 TeX 文稿中,只要使用 \TeX 就能夠實現上述 TEX 的特殊排版效果,由於 TeX 引擎在遇到 \TeX 控制序列時,會自動將其展開爲上述代碼。

利用宏擴展機制,能夠將那些醜陋的 TeX 語句定義爲一個高級的控制序列,從而顯著改善 TeX 文稿可讀性。當 TeX 引擎遇到高級控制序列時,會將高級控制序列展開爲基本控制序列組合,前提是 TeX 引擎須要事先知道這些高級控制序列的定義。

一些很是有經驗的 TeX 用戶(即 TeX 專家)在長期使用 TeX 的過程當中,會利用宏擴展機制,逐漸積累出一套自定義的控制序列,他們利用這些控制序列能夠快速而優美地實現諸如論文、專著、幻燈片、書信、曲譜、棋譜等文 檔的排版。這些由 TeX 專家們自定義的控制序列一般是單獨存放到一份或多份文件裏,這樣就造成了 TeX 宏包。 這些 TeX 宏包大部分都是無償地提供給普通 TeX 用戶使用的。使用方法很簡單,比方說我從某處得到了一個名爲 xxxx 的宏包,要使用這個宏包,只須要在個人 TeX 文稿的開頭,使用 \input xxxx 就能夠將該宏包裝載進來,而後便可在文檔中調用 xxxx 宏包中定義的控制序列。

爲了加速 TeX 引擎對這些 TeX 宏包的裝載和解析,Knuth 爲 TeX 提供了格式生成機制,利用它能夠將一份 TeX 宏包轉換爲 TeX 引擎能夠快速載入的二進制文件,這種文件被稱爲 TeX 格式。也就是說,TeX 格式也是 TeX 宏包,只不過是一種可供 TeX 引擎快速裝載和處理的 TeX 宏包。

Knuth 本人也是感受 TeX 的基本控制序列過於難用,因而提供了一套由他定義的 TeX 格式,叫作 Plain TeX,其中包含了 600 多個控制序列。使用 Plain TeX 定義的控制序列來撰寫 TeX 文稿要比直接使用那 300 多個 TeX 基本控制序列來的輕便一些。因爲 TeX 的基礎控制序列和 Plain TeX 所包含的控制序列皆出自 Knuth 之手,因此 TeX 用戶們乾脆也就不加以區分了,將它們統稱爲 Plain TeX,共包含大約 900 個控制序列。

在實際應用中,TeX 用戶們對 Plain TeX 顯然是不滿意的。這主要是由於 Plain TeX 僅僅停留在如何排版的層次上。即使是使用 Plain TeX 來排版一份中規中矩的論文,用戶們也不得不一樣時扮演論文做者和論文排版者雙重角色。

Lamport 和 Hans 讓 TeX 變得更好用

如今,咱們從一些比較流行的字處理軟件(好比微軟 Word、金山 WPS、OpenOffice 等軟件)的視角來看,普通用戶在寫一份文檔時,只須要給他提供一份大衆化的模板,而後他向裏面填寫文檔內容便可快速有效的完成文稿排版。早期的 TeX 所缺少的就是相似的便於普通用戶使用的文稿模板。這一問題的解決,天然仍是要着落在 TeX 的宏擴展機制上。由於 TeX 是一種圖靈完備的宏編程語言,也就是說凡是其餘計算機編程語言能作的事,TeX 也能作。因此,在 Knuth 公開發布 TeX 以後沒幾年,這個問題就被美國計算機科學家 Leslie Lamport 給解決了。

1984 年先後,Lamport 在使用 Knuth 發明的 plain TeX 排版軟件撰寫一些並行計算方面的論文,感到用起來不太方便。因而便本身定義了一套比較高級的控制序列,並製做成新的 TeX 格式,命名爲 LaTeX。起初 LaTeX 在計算機科學家之間流傳,你們以爲 LaTeX 比 plain TeX 使用更方便,就常常經過各類渠道向他索取。

Leslie Lamport
Leslie Lamport

LaTeX 的卓越之處在於提供了一套針對文檔邏輯結構的控制序列,將文章的排版設計與文章內容分開處理。比方說一篇科技論文,其邏輯結構主要由標題、做者信息、摘 要、正文、參考文獻等部分組成,使用 LaTeX 的控制序列可將其表示爲:

\documentclass{article}

\title{標題}
\author{做者信息}

\begin{abstract}
... 摘要內容 ...
\end{abstract}


\begin{document}

... 正文內容 ...

\bibliography{參考文獻}
\end{document}

至於論文的標題、摘要、正文等各部分所使用的字體及其尺寸、文本行距、段落間距等排版參數,LaTeX 均提供了較好的默認設置,一般不須要修改。若是採用 Plain TeX 來排版這樣的文檔,動用上百個控制序列是屢見不鮮。這樣,用戶在使用 LaTeX 來排版本身的文稿時,主要精力一般能夠放在文稿的內容上,而不是文稿的版面設計。話又說回來,若是用戶必須去調整文稿的排版參數來適應特殊的排版需求,LaTeX 提供的控制序列對此也是有些力不從心,這時用戶就有必要去學習一下 Plain TeX 了。未能爲排版參數配置提供統一化的控制序列,這是 LaTeX 最大的缺點,不過在當時終究是瑕不掩瑜。

LaTeX 的出現消除了普通用戶對 TeX 的敬畏,普通用戶即使不是很瞭解 TeX,也能夠在很短的時間製做出高質量的排版結果,而且對於複雜數學公式排版,LaTeX 表現的也很是出色,所以迅速在計算機科學、數學及相關學科領域獲得推廣應用,也逐步吸引了許多科學家和 TeX 愛好者不斷對 LaTeX 繼續進行宏擴展,並將宏擴展以宏包的形式發佈,供其餘用戶使用,這使得 LaTeX 的功能不斷地擴充,應用領域也不斷地擴大。

Lamport 在 1992 年發佈了 LaTeX 2.09 版本以後便退居二線。以後 LaTeX 的開發工做由 Frank Mittelbach 領導的 LaTeX 小組接管。該小組於 1994 年發佈了 LaTeX 2ε 版本以後,而後他們就轉入 LaTeX 3 版本的開發。迄今,LaTeX 3 仍在在開發中,但願未來會有好的結局。

已經存在了 20 年的 LaTeX 2ε 如今已經成爲國際數學排版的事實標準,國外有許多期刊接受甚至只接受 LaTeX 文稿。從這一點來看,LaTeX 項目長期沒有太大變化彷佛是件好事情,由於這樣比較穩定,許多基於 LaTeX 的文檔項目或者軟件項目不用擔憂來自底層的動盪。

雖然大多數 TeX 用戶對 LaTeX 表示很滿意(如今也是如此),可是在上個世紀 80 年代後期,荷蘭的一個名字叫作 Pragma 的排版公司裏有幾個傢伙卻對 LaTeX 很不滿意,其中一我的的名字叫作 Hans Hagen。由於 Hans 是作文檔排版服務的專業人員,他的工做就是根據顧客的需求來排版各類樣式的文檔,所以須要頻繁的修改 LaTeX 默認的那些排版參數。

前面已經說過,LaTeX 最大的缺點就是沒有爲排版參數的設置提供統一化的控制序列,用計算機軟件的專業術語來講就是「用戶界面不友好」。因而,Hans 嘗試對 LaTeX 的控制序列作一些封裝(宏擴展),想改善 LaTeX 的用戶界面。譬如,他對 LaTeX 的列表項控制序列進行封裝後,提供了更爲友好的控制序列:

\startitemize[n]
\item 列表項 1
\item 列表項 2
\item 列表項 3
\stopitemize

上述控制序列能夠生成數字編號列表:

數字編號列表

若是將 "startitemize[n]" 的參數由 "n" 改成 "a" 時,即 "startitemize[a]",那麼上述控制序列能夠生成字母編號列表:

字母編號列表

若是將 "startitemize[n]" 的參數由 "a" 改成 "1" 時,即 "startitemize[1]",那麼上述控制序列能夠生成無編號列表:

無編號列表

從上面這個有關列表排版的示例能夠看出,Hans 對 LaTeX 繼續封裝的主要意圖就是:讓用戶只需爲控制序列提供一些很簡單的參數即可以實現最大化地排版控制。在 LaTeX 裏,對於上述三種列表項是分別經過幾組不一樣的控制序列來實現的,另外去調整列表的其它排版參數(留白、縮進、行距等)也很是繁瑣。

可是,Hans 對 LaTeX 的封裝工做僅僅開了個頭便終止了。由於他當時對 LaTeX 進行了一次版本升級,而後發現他定義的那些控制序列無法正常工做了,估計是積極性被嚴重打擊了。扔掉 LaTeX 以後,Hans 去嘗試了當時其它一些 TeX 格式,最後發現 InrsTeX 格式(如今已是文物了)比較適合 hack,便於用戶界面友好方面的改進。Hans 在之後的歲月裏不斷地對 InrsTeX 進行代碼替換和封裝,直到最後他意識到本身已經創造了一個新的 TeX 宏包,便將這個宏包命名爲 pragmatex,直到 1996 年才改名爲 ConTeXt,這個名字是個文字遊戲,其意能夠拆解爲 Con-TeX-t,表示 text with tex。不得不說,這個名字取的很失敗,由於在 Google 裏輸入 ConTeXt 的時候,檢索到的大都是跟 ConTeXt 無關的信息。

Hans Hagen
Hans Hagen

一開始 ConTeXt 主要是針對 LaTeX 的缺點而開發的,按說它應該能夠取代 LaTeX。可是在 ConTeXt 還在逐步完善的時間裏,LaTeX 已經在 TeX 用戶羣中廣爲流傳了 10 多年,期間出現了數以千計的輔助宏包,再加上許多科技期刊和專業排版公司的支持,因此 ConTeXt 一時之間很難撼動 LaTeX 的地位。因此,咱們最好仍是不要以用戶羣的多與寡來評判一個工具的好壞。

ConTeXt 還具備一個特色,就是項目開發特別活躍。拿新版本發佈來講,有時一天會連續發佈屢次。把這個特色與 LaTeX 項目長期的不露聲色相比,ConTeXt 項目顯得頗有激情。固然,這不能算是優勢。頻繁的發佈新版本一般也昭示着容易出 bug。可是也沒必要過於擔憂,由於頻繁發佈的新版本只是測試版,ConTeXt 項目組每一年都會發佈一個穩定版。

在 TeX 發展歷程中,TeX 格式可謂變幻無窮,可是它們都致力於提升 TeX 的易用性,讓用戶不用去面對晦澀難懂的 Plain TeX 控制序列。如今 LaTeX 和 ConTeXt 好像是 TeX 的左膀和右臂,咱們只需抓住它們中的一個,便可與 TeX 共舞。顯然,我和這篇文檔一塊兒選擇了 ConTeXt。

奔跑在 ConTeXt 的道路上的 TeX

基於前面的那些知識,應當能夠認識到 TeX 格式是與 TeX 引擎密切相關的。ConTeXt 尤其如此,它與 TeX 引擎宛若兩根相互纏繞的樹藤,沿着歲月的方向蜿蜒前進而且生機盎然。

ConTeXt 目前的版本已進化到 MkIV,在它以前還有兩個版本,分別是 ConTeXt MkI 和 ConTeXt MkII。

ConTeXt MkI 是 ConTeXt 的第 1 個版本,所匹配的 TeX 引擎是 Knuth 開發的那個 TeX 引擎。Knuth 的 TeX 引擎的排版輸出結果是 dvi 文件格式,這種文件格式一般須要藉助 dvi2pdf、dvipdfmx 等程序轉換成 ps 或 pdf 文件格式方可用於文檔打印或屏幕閱讀。咱們如今仍是把 MkI 和 dvi 放到博物館裏供喜歡歷史的人去研究吧。

ConTeXt MkII 是 ConTeXt 的第 2 個版本,所匹配的 TeX 引擎是捷克籍越南人 Hàn Thế Thành (也可寫做 Han The Thanh) 由 Knuth TeX 引擎改造而來的 pdfTeX 引擎。pdfTeX 引擎能夠直接將排版結果輸出爲 pdf 文檔格式,這樣就能夠省去 dvi 到 pdf 的轉換步驟。ConTeXt MkII 是當前 ConTeXt 格式的穩定版本,可是開發者從此只對其進行 bug 修正,再也不爲其增長新功能。

ConTeXt MkIV 是 ConTeXt 的第 4 個版本,也是正在開發中的下一代 ConTeXt,所匹配的 TeX 引擎是 Taco Hoekwater 開發的 LuaTeX。LuaTeX 引擎自己也是正處於開發中,目前在功能上已經超越了當前全部的 TeX 引擎。ConTeXt MkIV 的開發工做是與 LuaTeX 的開發工做同步進行的,前者靠後者提供更多的新功能,後者靠前者進行可用性與穩定性測試。

Hans 打算將 MkIII (也就是 ConTeXt 第 3 個版本)這個版本號留給那個能夠與 XeTeX 引擎相匹配的 ConTeXt 格式,這是由於 XeTeX 引擎也是正處於開發中,還沒有發佈正式版本。

目前,Hans 和 Taco 在合做上如膠似漆,兩人的開發工做也相得益彰,因此招惹許多 ConTeXt 用戶對那個計劃在 2012 年正式發佈的 MkIV 版本很是期待……然而在我對這份文檔進行局部修訂的 2015 年 9 月 22 日爲止,MkIV 依然沒有正式發佈,不過已經很穩定而且也深具可用性了。

他們到底想把 TeX 怎麼着

這麼多年以來,TeX 的引擎一直在不斷的改革着,TeX 格式也在不斷地改革着,許多 TeX 用戶在這衆多的改革中有時會暈頭轉向。爲了避免迷路,咱們仍是先在 ConTeXt 格式發展道路上停留片刻,靜心看一下 TeX 引擎究竟在向那個方向走去。

前面咱們已經知道,最先的 TeX 就是 Knuth TeX。當 Knuth TeX 項目凍結以後,僅僅作bug 修正。可是它提供的宏擴展機制依然沒法知足你們的須要,因而就有了一大堆 TeX 的改進版本。

NTS (New Typesetting System) 項目的任務就是要繼續擴展 TeX。這個項目由德國 TeX 用戶組織於 1992 年發起,後來不知怎麼回事一直拖到 1998 年纔算是真正地開始,並計劃使用 Java 將 Knuth TeX 從新實現與改進(Knuth TeX 是使用 WEB 語言實現的,WEB=Pascal+TeX)。在 1999 年至 2000 年間,NTS 項目的運做比較積極。可是後來又不知怎麼回事,這個項目又沒有什麼動靜了。

NTS 項目開始時,有一個叫作 e-TeX (Extension TeX) 的對 TeX 引擎的改進項目,也是由 NTS 項目組開發的,後來由 Peter Breitenlohner 接管。e-TeX 項目的主要任務是對 TeX 進行擴展,在 Knuth TeX 的基礎上又增長了許多有用的控制序列。當時,LaTeX 格式中的不少排版功能是基於這些控制序列實現的,後來 ConTeXt 也很快放棄了 Knuth TeX 轉而使用 e-TeX。

e-TeX 與 NTS 的區別在於:前者只是對 Knuth TeX 進行修修補補,然後者是計劃使用 Java 語言對 TeX 從新實現並加以改進。從我所閱讀的材料來看,NTS 項目基本上已經敗落,而 e-TeX 則是下文要講到的 pdfTeX 項目的重要基礎。

後來在 2002 年,德國一些專家和開發人員組織成一個小團體,發起了 ExTeX 項目。ExTeX 項目是基於 NTS 項目的,它的理想是實現一個基於 Java 實現一個新的 TeX 引擎,可是這個項目彷佛也是挖了個坑,而後就沒影了。

1997 年,1997 年,Han The Thanh 基於 Knuth TeX 實現了 pdfTeX 。pdfTeX 在實現上能夠分爲兩個模塊:一個模塊保留了原先Knuth的全部代碼,能夠按照 Knuth TeX 那樣直接輸出 dvi 文件格式;另外一個模塊主要是實現基於 TeX 源文檔直接輸出 pdf 文件格式,在該模塊的實現中,加入了大量的 C 代碼;經過與 C 庫的鏈接,能夠處理一些 Knuth TeX 引擎難以解決的問題,好比插入各類格式的圖片等。pdfTeX 在排版算法方面也作出了重要改進,能夠取得更好的排版效果。後來,pdfTeX 開發人員又將 e-TeX 對 Knuth TeX 的改進部分也合併到 pdfTeX 項目中。因爲 pdfTeX 的功能比較強大,在國際 TeX 用戶組織 (TUG) 維護的 TeX 系統發行版——TeX Live 中被設定爲默認的 TeX 引擎,這標着着 pdfTeX 獲得了 TeX 用戶普遍承認。

Han The Thanh
Han The Thanh

對 TeX 引擎的改造工做除了加強其排版功能以外,還有一個重要的方向就是對多國語言文字的支持。

Knuth 在設計 TeX 引擎時,是以支持英文爲出發點考慮的,系統規定的文本輸入一概採用 ASCII 字符集。可是世界上被普遍使用的語言文字不止英文一種,不少語言的基本字符數量遠遠超出 ASCII 字符集所能表示的範圍,好比對於中國的漢字而言,經常使用漢字約有 6000 多,而 ASCII 最多能表示 256 個字符。即使如此,讓 TeX 支持各國語言文字也不是很困難。譬如,以 TeX 中文支持問題的解決爲例,能夠先對中文 TeX 文稿進行預處理,爲每一個漢字生成多個字節的 ASCII 編碼;而後再實現漢字字符編碼與字體圖形之間的映射,以後的過程交給 TeX 引擎處理便可。這一預處理過程採用 TeX 宏擴展機制便可實現。如今一些 TeX 中文支持宏包,譬如德國人 Werner Lemberg 寫的 CJK 宏包、中科院張林波教授開發的 CCT、華東師大陳志傑教授開發的 TyTeX(天元軟件包)等,就是按照這一思路實現的。這種解決方案雖然能夠比較輕省地實現中文化、日文、韓文等文字語言支持。可是要實現各國語言文字的 支持,基本上對於每個語種都要爲之開發一個 TeX 支持宏包,特別是一份 TeX 文稿須要出現多種語言文字時,問題就變得更加複雜。

計算機軟件開發中,對不一樣語言文字的支持有一股清晰的潮流,那就是讓應用程序支持 Unicode 編碼,這是目前統一化處理世界各國語言計算機表示的最佳方案,由於 Unicode 編碼的字符集能夠涵蓋目前地球上全部的文字,而且還具有大量的擴展編碼空間。不少人都但願 TeX 引擎也能順應這種潮流,便千方百計改造 TeX 引擎以實現對 Unicode 編碼的支持。Omega、XeTeX、LuaTeX 等項目均致力解決這個問題。

Omega 是由 John Plaice 與 Yannis Haralambous 基於 Knuth TeX 引擎最先實現的能夠支持 Unicode 編碼的 TeX 引擎。在 Omega 中,每一個字符都以一個 16 位編碼的數據結構表示,這樣就能夠擺脫 TeX 的 ASCII 編碼限制。可是在留下了一堆 bug 以後,Omega 項目就終止了。後來有人將 Omega 項目與 e-TeX 項目合併起來,創建了 Aleph 項目。再後來,Aleph 項目也終止了,其後繼者就是下面要介紹的 LuaTeX 項目。

Jonathan Kew 在 Mac OS X 平臺上對 e-TeX 進行改造,爲其添加 Unicode 編碼支持,並基於 Mac OS X 的各類開發技術,建立了 XeTeX 項目。Jonathan Kew 自 2005 年開始發佈 XeTeX 的 Windows 和 Linux 版本。值得注意的是,XeTeX 除了能夠直接支持 Unicode 編碼以外,還能夠直接調用那些存在於用戶操做系統以內的 TTF 和 OpenType 格式的字體,這極大方便了用戶爲 TeX 添加本身喜好的字體(在 Knuth TeX 中增長一款 TTF 或 OpenType 字體簡直是一場噩夢)。從 2007 年開始,XeTeX 被 TeX Live 吸納,標誌着它也獲得 TeX 用戶的普遍承認。如今,XeTeX 還在開發中,可是功能上可提高的空間彷佛也頗有限了。

Jonathan Kew
Jonathan Kew

如今該輪到 LuaTeX 登場了。LuaTeX 項目是 2006 年春天啓動的。當時,美國科羅拉多州立大學的一個研究哲學的教授與國際 TeX 用戶組織聯合申請到一個叫作「東方 TeX」的項目,目的是爲了更好的排版阿拉伯語言的書。Hans Hagen 拿到這個項目的經費以後,就由 Taco Hoekwater 把 LuaTeX 項目作起來了。LuaTeX 和 ConTeXt MkIV 的開發工做很大程度上是爲了這個「東方 TeX」的項目,可是也不排除 Hans 要壯大 ConTeXt 的野心。

Taco Hoekwater
Taco Hoekwater

LuaTeX 項目對 TeX 引擎進行了大刀闊斧地改革,它先是整合了 pdfTeX 和 aleph 項目,而後又將 TeX 世界裏一款很是重要的矢量圖繪製引擎——MetaPost 改形成一個能夠鏈接的庫——MpLib,並將這個庫嵌入 LuaTeX 中,這樣 LuaTeX 就能夠內部直接支持 MetaPost 圖繪製了。另外也像 XeTeX 那樣,實現了對用戶操做系統中 TTF 和 OpenType 字體的直接調用。LuaTeX 最引人注目的地方就是:它把自從 Knuth TeX 開始就一直被沿用的宏擴展機制改形成 Lua 程序擴展機制。這樣,未來用戶能夠使用 Lua 程序設計語言爲 LuaTeX 引擎實現功能擴展,不再須要面對醜陋而且容易出錯的 TeX 宏擴展機制。

LuaTeX 項目原計劃於 2012 年發佈 1.0 版本,然而至如今的 2015 年 9 月爲止,它的版本號剛到 0.80.1。LuaTeX 官方主頁上不知什麼時候已將 1.0 的發佈時間推延至 2020 年。雖然如此大幅度的跳票,可是如今的 LuaTeX 引擎已具有可用性,並於 2008 年和 ConTeXt MkIV 一塊兒被 TUG 歸入 TeX Live,做爲用戶可選的 TeX 引擎。目前,ConTeXt MkIV 格式能夠與 LuaTeX 有比較完善的配合,可以初步支持中文排版。LaTeX 與 LuaTeX 的配合對於西文排版而言,問題不大,可是對於中文排版,須要日本 TeX 用戶開發的 LuaTeXja 的配合,具體狀況可參考 LuaTeXja-zhfonts文檔,再有不解,可去 CTeX 論壇 詢問 m6n

關於 LuaTeX 的跳票,我能夠理解。到 2020 年 LuaTeX 1.0 發佈之時,人類的計算機的運行速度確定知足 LuaTeX 的需求。若是那時人類的計算機技術仍是不好,不能流暢的運行 LuaTeX,也許它會將 1.0 的發佈時間改至 2025 年……

LuaTeX 是 TeX 引擎改革的結束麼?也許如今誰也無法說清楚,正所謂江山代有才人出,一代新人換舊人,當年即便 Knuth 也無法預料到如今會有 LuaTeX 的出現。如今,咱們也許只能預料到 LuaTeX 能夠將 TeX 用戶帶上一個新的臺階,至於未來在那個新的臺階上又會遇到什麼樣的困難,咱們也不必替將來的人擔心。

值得注意的是,TeX 引擎之因此可以曲曲折折走到今天,除了憑藉自由/開源軟件的開發模式以及衆多的黑客長期不懈的智力投入與積累以外,也跟 TeX 所面向的領域過於小衆化有重要關係。2000 年,一名記者採訪 Leslie Lamport 時問:「當前爲何沒有高質量的所見即所得 (WYSIWYG) 的排版系統?」Lamport 回答說:「門檻過高了,一個所見即所得的排版系統要作到 LaTeX 當前的水平,工做量之大不是單槍匹馬所能完成的。微軟這樣的大公司能夠作,可是市場過小了。」Lamport 算是一語道破了 TeX 雖然歷經 30 餘年迄今依然生機盎然的祕密。

TeX 發行版

其實,咱們平常掛在嘴邊的『TeX』既不是 TeX 引擎,也不是 TeX 格式,而是一個包含了 TeX 引擎、TeX 格式、宏包以及一些輔助程序的東西,它的學名叫「TeX 發行版」,它的使命是讓 TeX 用戶們不用四處奔波去尋找本身也不知道到底是否須要的 TeX 引擎以及那些 TeX 格式、宏包以及一些亂七八糟的輔助程序。爲了完成這一使命,TeX 發行版的開發者們就努力地將這個世界上公認的那些頗有用的 TeX 引擎、格式、宏包以及一些亂七八糟的輔助程序收集起來,並持續地維護下去。

雖然 TeX 發行版誰均可以作,可是隻有 TeX Live、MacTeX、MikTeX 這三個發行版所收集的 TeX 軟件比較全面且比較受歡迎,它們好像都是每一年發佈一個新版本供用戶免費下載和使用,其中 TeX Live 主要在類 Unix 系統中運行,固然它也能夠在 Windows 系統中運行的也很好,可是 Windows 用戶們卻很買 MikTeX 的帳,至於 MacTeX,顧名思義就是 Mac OS 系統中的 TeX 了。

這些 TeX 發行版一般都是大而全的。以 TeX Live 爲例,它幾乎包含了前文中所提到的全部 TeX 引擎,像 Plain TeX、LaTeX、ConTeXt 這些 TeX 格式也是照單全收,此外還有數以千計的宏包,還有一些用於字體、圖形處理的輔助程序。因爲收錄的軟件包太多,因此這些 TeX 發行版一般都是龐大的怪獸。不過,這些年隨着計算機網絡的普及,開始流行在線定製安裝的形式。用戶只須要下載一個很小的安裝程序,而後根據本身的須要選擇 所安裝的軟件包集,而後這個安裝程序會自動鏈接提供 TeX 發行版的服務器去下載所需的文件。一般,只須要下載幾百兆字節的文件就能夠獲得一個比較完善的 TeX 環境了。

本篇文檔所講的 TeX 發行版與上面所說的 TeX 發行版略有區別,咱們要使用的是 ConTeXt Minimals, 顧名思義,就是專門爲 ConTeXt 格式定製的最小化 TeX 發行版,它是由 Hans 所領導的 ConTeXt 項目組發佈的,它的任務就是把最穩定和最不穩定的各類版本的 ConTeXt 以及與之配套的 TeX 引擎提供給那些只對 ConTeXt 感興趣的 TeX 用戶們。ConTeXt Minimals 能夠跨操做系統平臺(Windows、Linux、FreeBSD、Mac OS X、Solaris 等)運行,而且能夠與系統中所安裝的其它 TeX 發行版互不干擾。

爲迎接 ConTeXt 作點準備

從如今開始,咱們就再也不旁生枝節,只將注意力放到 ConTeXt 格式 上,只關注它的 MkIV 版本(就是搭配 LuaTeX 引擎的那個),而且所使用的 TeX 發行版僅限於 ConTeXt Minimals。下面全部的內容,除非我很巧妙的申明,不然它們 默認都屬於這個環境。

在開始學習使用 ConTeXt 來排版文檔以前,須要在身體和心理上作點準備,即使你鐵了心要跟 ConTeXt 耗下去,也要準備一下。

首先,不要苛求完美。由於 ConTeXt MkIV 及 LuaTeX 都在開發狀態中,有大量大量的 bug 都是不免的,千萬不要爲此而鬱悶。實在感受很難受,能夠去 ConTeXt 郵件列表裏勇敢又巧妙地把 bug 報告給 Hans,並催促他老人家修復。

其次,不要四處亂找 ConTeXt 中文文檔,特別是 2008 年以前的那些中文文檔,它們大都是針對 ConTeXt MkII 的,而咱們這裏要學習的是 ConTeXt MkIV。

最後,若是真的感受 ConTeXt 很無聊,純粹是浪費時間,那麼最好仍是把大好的時間用來陪女友逛逛街,作點體育活動,或者用來學習不無聊也不浪費時間的知識。若是隻是把節省下來的時間用來看看電影,打打遊戲,那麼我仍是很巧妙地建議你繼續學習 ConTeXt 吧。由於 ConTeXt 中文黑客實在太少了,你不要再讓它失去一個。

參考文檔

[1] LaTeX 編輯部——TeX 簡介:http://zzg34b.w3.c361.com/hom...

[2] LaTeX 筆記:http://www.tug.org/texlive/Co...

[3] TUG 對 Hans 的專訪:http://www.tug.org/interviews...

[4] TeX 系統的演變:http://lyanry.is-programmer.c...

[5] 關於 LuaTeX 項目的一些背景:http://bbs.ctex.org/viewthrea...

相關文章
相關標籤/搜索