网球比分直播第一 www.gqgyzr.com.cn

歷史回顧

眾所周知,Donald E. Knuth 在排版他的傳世巨著 The Art of Computer Programming 時,忍受不了當時的數字排版技術,于是一咬牙,花了近十年開發出了偉大的排版軟件 TeX。

然而這個 TeX 本身是為 Knuth 自己服務的,普通人用起來會比較吃力。上世紀 80 年代,同樣身為計算機科學家的 Leslie Lamport 教授開發出了 LaTeX(Lamport TeX),隱藏了一些排版細節,成為了一套結構化的文檔語言。Lamport 也是在準備他的著作 The Great American Concurrency Book 時發明了 LaTeX;可等有了 LaTeX,這本書卻懶得動筆了……[1]

1992 年,LaTeX 2.09 發布,之后 Lamport 便退居二線,開發工作交給由 Frank Mittelbach 領導的 LaTeX3 團隊負責。顧名思義,這個團隊就是要代表 LaTeX 行業的發展要求,代表 LaTeX 界最新技術的前進方向,代表 LaTeX 最廣大用戶的根本利益。于是他們埋頭苦干了兩年,搞了個大新聞——推出了 LaTeX?2ε。

「LaTeX?2ε」這個名字,一看就知道來源于微積分里面的 ε-δ 語言?!?ε」比 2 大,但是作為一個無窮小量,離 3 卻還有著十萬八千里。因此過了二十多年,LaTeX3 的正式發布依然還是遙遙無期。

LaTeX?2ε 的不足

言歸正傳,我們現在要來聊一聊 LaTeX?2ε 到底有什么不足,以至于非得另起爐灶,建立一個全新的版本。

用戶層次

要完成高質量的排版,就需要對格式進行精確地控制。然而,很多時候格式控制卻沒有提供簡單易用的接口,往往需要手動修改內部定義。比如要使腳注中的編號行內居中,就需要這么做:[2]

\makeatletter
\renewcommand\@makefntext[1]{%
  \hspace*{-2em}%
  \parindent 0em%
  \noindent
  \[email protected]1.8em{\hss
    \@thefnmark. }%
  #1}
\makeatother

一個簡單的例子尚且如此,稍微復雜一些的就需要使用各種補丁、鉤子,以及種種骯臟技巧,顯得十分不優雅。

另外的辦法就是借用別人造好的輪子,調用各種各樣的宏包。后果便是,一旦文章寫長了,導言區就會成為宏包集錦,一堆 \usepackage,外加各種奇技淫巧般的設置。

當然,針對這個問題,解決方案似乎已經有現成的。比如 KOMA-Script 或者 memoir 文檔類(國內用的人不是很多),它們大致把一些常用功能集中在了一起,用戶接口也比較統一。

編程層次

另一方面,LaTeX?2ε 缺乏良好的編程界面,簡單的流程控制語句也相當繁瑣和低效。更不用提喪心病狂的宏展開:[3]

\def\CTeX@replacecommand#1#2#3{%
  \expandafter\expandafter\expandafter\let\expandafter
    \csname #1#3\expandafter\endcsname
    \csname #2#3\endcsname
  \expandafter\expandafter\expandafter\def\expandafter
    \csname #2#3\expandafter\endcsname
    {\csname #1#3\endcsname}}

而且,很多時候 LaTeX?2ε 中的編程是 TeX、帶注釋的 LaTeX、不帶注釋的 LaTeX 的混合,還會從奇奇怪怪的宏包里面弄來奇奇怪怪的東西。命名也常常隨意且風騷,最后的結果就是可讀性與可維護性很差,搞不好還會遇到各種沖突。

內容 vs 格式

更加重大的問題還在于,LaTeX?2ε 并沒有很好地實現內容與格式分離的原則。

剛才提到,Knuth 十年磨一劍最終推出的 TeX,盡管號稱「排版神器」,但作者對字體、字號、對齊,甚至斷行分頁算法等方方面面都要了解,也只有神人才能駕馭得了。而之后,Lamport 不僅考慮了天才的個人奮斗,而且兼顧了凡人的歷史進程。他的 LaTeX 把眾多排版細節用「傻瓜式」的命令封裝起來,因而一經推出便風靡全球。

所謂「內容與格式分離」,在 LaTeX 的語境中,就是盡量使用帶有語義的命令來進行標記,而不是直接規定文本的樣式。比如:

  • 通過指明 \documentclassarticle、reportbook,即表明這是篇幅較短的文章、篇幅中等的報告,或篇幅較長的書籍。LaTeX 會據此定義不同的樣式(包括章節標題、頁眉頁腳等),而無需作者操心。

  • \emph 而非 \textit 表示強調,這是因為 \emph 就是強調的意思(emphasize),而 \textit 則只是一種格式聲明,盡管標準文檔類中二者效果基本一致(嵌套的話會有差別)。

  • \thanks 而非 \footnote 給出作者的額外信息(常用在 \author 中),它會用特殊符號進行標記,以區分于一般的腳注。

這樣的好處,一方面使得文章結構明確,條理清晰;另一方面,一旦有修改格式的需求,操作起來也會比較輕松。

然而事情并不總是那么完美的。LaTeX 的內核很?。?code style="font-size: inherit; line-height: inherit; overflow-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0px 2px; color: rgb(233, 105, 0); background: rgb(248, 248, 248);">latex.ltx 約 8500 行,article.cls 約 600 行,size10.clo 約 200 行),要么缺乏相關功能的支持,要么就是格式寫死了沒法改。總之,除非完全按照八股文的方式,只要你稍微想做一些格式上的更改,就只有 Google 半天再自己寫上一長串啰里啰嗦、不知所云的代碼。

時代總是在發展的,Till Tantau 教授在準備他的博士論文答辯時,編寫了 beamer 文檔類,用以構建幻燈片(為此,他還編寫了繪圖包 PGF/TikZ,簡直令人嘆為觀止)。就架構而言,beamer 的設計是高度創造性的。它劃分了 3 個層次:

  • 幻燈片作者只需要了解 frame、theorem、emph 這些與演示相關的命令或環境,只需選擇相應的主題(theme),就可以完成制作;

  • 模板 / 主題設計師,可以用 \setbeamertemplate、 \setbeamercolor、 \setbeamerfont 等命令來設置各成分的格式,但卻無需考慮演示文稿的具體內容;

  • 高級設計師(或者 TeX 程序員),對于每種語義成分,又可以獨立調控,直接操縱具體實現細節。

這種層次化的界面,自然就把用戶分成了三類,于是內容編寫、格式設計與具體實現就可以徹底分離。

如果熟悉前端技術,會發現這是極其相似的:

  • HTML 負責描述網頁內容、標記語義元素;

  • CSS 定義樣式,規定相應的 HTML 元素應如何顯示;

  • 瀏覽器端負責網頁的最終渲染,即呈現樣式。

從某種程度上說,前端技術的爆炸式發展給了 LaTeX3 相當多的經驗。在未來,我們完全有理由相信,HTML/CSS 技術和 TeX 技術可以互相兼容。

LaTeX3 與 `expl3`

總而言之,LaTeX?2ε 盡管是目前最流行的 TeX 格式,卻也有著相當大的局限性,而且這種局限性不是小修小補能夠解決的,必須另起爐灶,重新搭建一套新的格式——LaTeX3。

所謂格式,就是對 TeX 提供的原語(primitive)進行封裝,以方便使用。常見的有 plain TeX、LaTeX以及 Con-TeXt。LaTeX3 就是下一代 LaTeX 格式。當然,鑒于 LaTeX?2ε 無可撼動的地位,這套格式也不會被放棄,LaTeX3 格式只會作為額外的選擇。至于 LaTeX3 什么時候可以真的被做成一個完整的格式文件(.fmt),目前仍是一個未知數。

目前,LaTeX3 的主要開發工作集中在 expl3 宏包中。expl3 提供了豐富的編程接口,我們之后所要介紹的內容,都是圍繞這個宏包進行的。expl3 不僅可以運行在 LaTeX 中,也可以在 plain TeX 和 Con-TeXt 中使用。

expl3 是 1992 年推出的,至今已經十多年了。目前,有不少宏包已經開始 expl3,也就是使用 LaTeX3 語法了。比如:

  • ctex-kit 中的 CTeX、xeCJK、xpinyin、zhnumber 等,當前主要由李清、劉海洋和黃晨成等人開發、維護

  • LaTeX3 團隊成員 Will Robertson 維護的 fontspec、unicode-math,以及 Joseph Wright 維護的 siunitx

  • 本人所編寫的 fduthesiszhlipsum

所有已注冊的 LaTeX3 宏包(其實是??槊┘捌溆泄匭畔⒖梢栽?l3prefixes 中找到。

個人想法

以下純屬個人觀點,不保證其準確、客觀。

  • 作為標記語言,LaTeX 火候剛好:HTML 略顯冗余并不適合直接拿來寫文章(盡管有 Emmet),Markdown 簡潔清楚但標記元素過于貧乏。相比之下,LaTeX 的標記則靈活的多,要長則長,要短則短。

  • 作為編程語言,(LA)TeX 實際上非常繁瑣,提供可靠、便捷的核心語法及標準庫,大概才是 LaTeX3當下的主要攻堅目標。

  • 其實 LaTeX 相當于 HTML+CSS+JavaScript,既要負責標記,又要管理樣式,還要能自由、靈活地實現各種奇幻需求。這種靈活性固然使得「內容與格式分離」的原則得不到徹底貫徹,但試想,所有的格式修改,哪怕只出現一次,也要額外做一個語義標記,又是否確有必要呢?畢竟,排版的 edge cases 實在太多了。

  • 眾所周知,LaTeX 的流行主要是由于強大的數學公式處理能力,以至于一直有人搞不清 LaTeX 和 MathType、MathJax 等的關系。但就這方面而言,LaTeX3 本身并不能改變多少(倒是 unicode-math 很可能成為未來的方向)。

  • 相比網頁排版有 W3C 和一眾廠商的推進,桌面排版也有 Adobe 和微軟的巨額投入,TeX 界幾乎可以說全憑社區的努力。這顯然是杯水車薪的,所以對進度也不必有太多指望。即使 LaTeX3 最后爛尾,目前的成果(expl3 編程接口)也不會付諸東流。

注釋

  1. LaTeX: A Document Preparation System - The Writings of Leslie Lamport

  2. 李清. LaTeX 腳注要怎么在行內垂直居中呢?- 知乎

  3. 2015 年 CTeX 宏集進行了較為徹底的重構,這里給出的代碼實際上已經不再使用,但仍然保留在代碼庫中。參考:劉海洋. 多個 \expandafter 的展開過程是怎樣的?- 知乎

參考

點擊閱讀下一篇:LaTeX3 教程(二)—— 語法概要


選自:https://stone-zeng.github.io/2019-02-24-l3tutorial-background/#%E5%8E%86%E5%8F%B2%E5%9B%9E%E9%A1%BE