標籤:

關於能否基於XML重新實現TeX?

在學習LaTeX和HTML、XML時,覺得有很多相似之處。那麼,能否基於XML重新實現TeX,並開發出類似於瀏覽器之類的能快速獲得可列印文檔?


能看到 LaTeX 與 HTML 的相似之處這很正常,因為 LaTeX 的產生本來就是為了規範各種不統一的 TeX 寫法,節省排版上的氣力,將作者從排版細節中解放出來。在理想上,就是 Lamport 所謂:

LaTeX is your typographic designer, and TeX is its typesetter.

這必然導致 LaTeX 是讓人把宏語言當作標記語言來用。因而 LaTeX 有個著名的說法是:

As you are writing your document, you should be concerned with its logical structure, not its visual appearance. The LaTeX approach to typesetting can therefore be characterized as logical design.

在實踐中,填寫固定模板向學術刊物投稿的多數學者也確實是這樣做的,儘管時不時也會打破這種理想,回到醜惡的現實中去。(順帶一提,李阿玲說不相似,強調的是醜惡的現實面。)

┏━━━━━━━━━ 閑話插入 ━━━━━━━━━┓

現在理一理原來可能有些模糊的概念:

  • TeX 是個面向印刷的排版工具,輸入要排版的文字與控制排版的宏代碼,輸出機器無關的印刷用格式。
  • LaTeX 是個面向寫作者的文檔處理工具,輸入要排版的內容與表述內容邏輯的標記,中間轉換到 TeX 底層代碼,輸出機器無關的印刷用格式。實際上,LaTeX 是用 TeX 語言寫的一組宏。

不過可能仍然使人迷惑的是,TeX 這個詞可能同時指 TeX 程序(引擎)、整個 TeX 家族的軟體總體、基本的 TeX 語言、特定的 Plain TeX 格式,或是用來輸入計算機的 tex 命令。LaTeX 這個詞也被類似地以各種涵義用著。

於是乎,問題就可能把一些概念表述得有些含混了。LaTeX 是一種格式,是諸多 TeX 文檔格式中常見的一種;而所謂「實現 TeX」則是指實現 TeX
引擎,是把 TeX 文檔轉換為 DVI/PDF 等格式的編譯器。把 HTML 這種標記語言與 LaTeX
的基本子集對應是問題不大的,但能被實現的那個 TeX 引擎則要與瀏覽器這種東西對應。

人們通常會說基於 Webkit 實現瀏覽器,使用 C++ 實現瀏覽器,但不大會說基於 XML、HTML 實現瀏覽器——XML、HTML 只是瀏覽器的工作對象。類似地,「基於 XML 重新實現 TeX」也同樣不大通,TeX 引擎是一種編譯器,一般是會基於原有的 Pascal 代碼或某些 C 代碼版本開發。

所以,基於誰,又重新實現誰,這個問題我是搞不清了。

而問題中的「並開發出類似於瀏覽器之類的能快速獲得可列印文檔」,也有些所指未明。這是希望把現有的網頁自動排版列印成 PDF 呢?(瀏覽器本來就能列印。)還是希望用 XML 這種標記語言代替 LaTeX 這種宏語言來排版文檔呢?(基於 SGML 的排版軟體早有了。)

┗━━━━━━━━━ 閑話結束 ━━━━━━━━━┛

既然 LaTeX 與 HTML 這類標記語言有不少相似之處,那麼能不能給它們建立一些聯繫呢?當然能。

一、能不能我來寫 LaTeX 文檔,實際輸出 HTML 網頁呢?能。有一本書叫做《The LaTeX Web Companion: Integrating TeX, HTML, and XML》,就專門討論這個話題。

而這方面的一個重大實踐項目,就是《The LaTeX Companion》第二版的 epub 格式的完成:Now available as ebook: The LaTeX Companion 2ed

相關的困難比如:

  • LaTeX 中實際能寫出任意複雜的 TeX 代碼,甚至還經常嵌入輸出的 PostScript、PDF 代碼。完全轉換為既原汁原味又保留內在邏輯關聯的網頁相當困難。
  • 網頁輸出未必有固定的行寬,穩定的排版結果無法實現,美觀的斷行演算法耗費時間;網頁沒有固定大小的頁面概念,TeX 產生的一些排版結果也沒有意義;網頁中字體不確定、資源缺失之類的情況是常態,TeX 的輸出結果無法保證。

當然也有成果,比如用 JavaScript 寫的 Knuth-Plass 斷行演算法就能在瀏覽器上達成像 TeX 一樣高質量的段落輸出。

二、能不能我隨便找個 HTML 網頁,就交給 TeX 輸出高質量的 PDF 呢?能。像 Pandoc 這種萬能轉換器,就可以完成一定限度的 HTML 到 LaTeX 代碼的轉換,進而輸出印刷格式。

當然,這也會遇到前面 LaTeX 轉換 HTML 相似的問題:HTML 網頁也可以任意複雜,甚至 JavaScript 這種互動式腳本,在印刷中無對應的內容;網頁編寫時不會考慮分頁之類排版問題,轉換結果可能無法達到高質量。

三、能不能我還按內容與格式分離、邏輯結構統率輸出結果之類的想法,用 XML 之類的嚴格標記語言來編寫文檔,或者說讓界面友好的文檔處理軟體生成這樣的 XML 格式文檔,然後由 TeX 輸出呢?能。LyX 就是這樣一種工具。

這種工具能不能脫離 TeX,單獨實現呢?能。TeXmacs 就是這種想法的產物。

當然了,這些東西現在還粗糙得很,沒有完整的 LaTeX 功能那麼強。

——不過,這些都不叫重新實現 TeX,遑論基於 XML 了。


題主的意思是什麼?

是做一個把(基於某種格式規範的)XML 變換成文檔(如 pdf)?那不就是 XSL-FO 嗎?


ConTeXt 就有 XML 的前端,不用重新發明輪子了。


我覺得可以。

題主如果看過Lisp的話,應該就能給xml設計出一套宏來回復 @李阿玲 的質疑。

或者是像HTML那樣加ScriptEngine。

就算再不濟,咱不是還有XMLSchema/XSLT呢,想辦法在上面做手腳啊。

好吧。

Office Open XML


你想找的是TeXML或者LaTeXML嗎


這要看題主所謂的「重新實現」是什麼意思。

如果要從語法層面實現,這肯定不行,這兩者的語法相差太大。如果題主說的LaTeX內容和格式分離的基本思想,那麼實際上HTML+CSS就已經是「重現」了(如果我們把HTML勉強看成XML,或者就討論XHTML)。事實上,HTML5的一大改進就是新的semantic element,同時鼓勵人們少用&, &, width參數,這都是「內容和形式相分離」的體現。

比如HTML5裡面可以有這樣的代碼(來自http://www.w3schools.com/html/html5_semantic_elements.asp)

& &The Pulpit Rock
&Fig1. - The Pulpit Rock, Norway.& &

這和LaTeX代碼的含義不是很像么

egin{figure}
includegraphics[w=304, h=228]{pic_mountain.jpg}
caption{Fig1. - The Pulpit Rock, Norway.}
end{figure}

至於編程,完全可以用Javascript實現。


推薦閱讀:

TAG:編程 | XML | LaTeX |