在 HTML 中,在過去十年左右的時間裡,人們大力推動內容結構和樣式的完全分離。現在,大多數網站都是使用 HTML 進行結構標記,並使用 CSS 來表示該標記。這使得在相同的內容上應用不同的樣式變得非常容易:如果您不知道它有多強大,請參閱例如http://www.csszengarden.com/。有一個 W3c 文件說明了這一點語意標記和表示標記的分離。
我對 LaTeX 比較陌生,但我設計網站已經有一段時間了。是的,他們是不同的領域,但他們都在努力做同樣的事情:好好呈現內容。過去 6 個月的 LaTeX 體驗讓我感覺到這種內容和風格分離的概念在 TeX 世界中並沒有發揮太大作用。例如,要在 HTML+CSS 中定義表格單元格的換行規則,只需向單元格添加一個類,然後向 CSS 文件添加一行即可。在 LaTeX 中,你需要做像這樣可怕的事情。
那麼,我是否遺漏了什麼,還是 LaTeX? LaTeX 的設計中是否使用了這種內容與風格分離的概念?只是執行不力嗎?在未來的版本中它可能會得到更好的實現嗎(LaTeX3?ConTeXt?)?
注意:我無意冒犯 LaTeX 開發人員:出於許多其他原因,該系統確實非常好。我只是看到了這個巨大的漏洞,並且很少有圍繞它的討論,我想知道為什麼。
答案1
歷史
Knuth 在 20 世紀 70 年代末編寫了 TeX,因為考慮到他自己的知識和當時可用的技術的限制,他想盡可能地排版材料。人們普遍認為他做得很好,但他肯定不想做的是分離結構和風格。
Lamport 在 20 世紀 80 年代中期編寫了 LaTeX,當時他看到需要更清晰地分離這兩個區域。 LaTeX 在 20 世紀 90 年代初進行了修訂,當前的核心可以追溯到 1994 年(當然,也修復了錯誤)。這比 HTML + CSS 模型早了一段時間,技術限制再次意味著 LaTeX 不可能更複雜。 (1994 年,LaTeX 對於許多 PC 來說幾乎太大了,團隊非常努力地將其壓縮。)
在 HTML 世界中,可以新增標籤,但會被不認識它們的渲染器忽略。 TeX 的情況並非如此:未知的控制序列就是錯誤。因此,我們不能只是添加新概念並期望現有文件能夠發揮作用:這是真的重要的。因此 1994 年所做的決定對今天的 LaTeX 仍然具有重要意義。
ConTeXt 較新,並且確實比 LaTeX“開箱即用”分離出更多的設計。 ConTeXt 也採取了與 LaTeX 不同的穩定性方法,對核心的開發前景更加積極。然而,ConTeXt 方法在某些方面更像普通 TeX,而不是 LaTeX,從某種意義上說,ConTeXt 比 LaTeX 讓設計「更貼近用戶」。
輸入輸出
在 HTML 世界中,文件被完全讀入記憶體以建立用於渲染的 DOM。 TeX 不是這樣運作的,至少除非我們自己編程。相反,TeX 會讀取一行並對其進行處理,然後再轉到下一行。 (LuaTeX 可以改變這一點,但我認為即使在 ConTeXt 中,TeX 模型仍然是主要模型。)因此,改變外觀所需的方法非常不同。
在考慮這個領域時要記住的一個關鍵問題是人們想要的產出是什麼。在 TeX 世界中,我們專注於高品質的排版。因此,幾乎總是會對設計進行一些手動調整以反映內容的現實。這不是「編寫良好」的 HTML 中發生的情況,儘管它可以用 XML 表示,但它肯定打破了嚴格的分離。我和其他人認為這並不是壞事:您確實需要手動幹預才能獲得最佳結果。
表格
問題中特別提到了表格,我認為它們本身就值得考慮。在 HTML 中,表格有多種用途。在 TeX 中,對錶的處理受到更多限制。在 TeX 世界中,表格是出了名的複雜野獸,Knuth 確實指出,它們能夠工作真是太神奇了!在大多數排版文件中,表格主要用於“正式表格”,並且這些表格的“良好”外觀範圍相當有限。因此,不太需要提供全套類似 CSS 的控制項。
正如 canaaerus 在他的回答中所說,TeX 世界不是由一個委員會而是由任何人管理的,因此實現什麼取決於個人使用者的需求。有一系列適用於 LaTeX 的表格包,以及 ConTeXt 方法和\halign
plain TeX 中的原始包。然而,他們主要是試圖解決其他問題,這告訴你用戶的優先順序在哪裡。
展望未來
作為 LaTeX3 專案的成員,我知道我們當然正在討論更好地分離內容和設計。這裡值得記住的一個問題是 HTML + CSS 模型並不總是能很好地轉化為我們想要的排版效果。這兩個領域之間存在一些顯著差異,這意味著事情永遠不會那麼簡單。
任何更好的方法都必須與 TeX 配合使用,無論是在程式碼方面還是在介面方面。我們有實驗程式碼處理對象之間的關係('l3ldb'),加上的想法設計“模板”,兩者都在這個區域。
答案2
儘管這種內容和標記的分離對於 TeX 開發人員和使用者來說肯定不陌生,但 TeX 和 HTML 及其社群的工作方式之間存在一些根本差異。
HTML 本質上是集中組織的。有一個委員會(即 W3C)負責制定網路標準。然後,所有 HTML 文件的作者都必須根據這些標準進行編寫,並且 HTML 解釋器(即主要是 Web 瀏覽器)的開發人員必須實現這些標準。
另一方面,對於 TeX,事情的發生卻大不相同。沒有明確的標準。當然,大多數東西都是基於 Knuth 的原始 TeX。但添加了很多東西。例如,現在有不同的巨集包,ConTeXt 和 LaTeX。在那裡你可以很容易地看到,基本語法還沒有固定。任何人都可以說他想使用/
巨集而不是\
像 LaTeX 那樣。此外,當今使用的許多功能都是作為套件添加的。它們使 TeX 具有極強的可擴展性。
這讓我們看到了差異的技術部分。 TeX 是圖靈完備的!相反,HTML 只是一種標記語言。在 HTML 中,您指定文件的內容、結構和樣式,在 TeX 中,您會編寫如何建立文件的演算法。
當然,在最簡單的情況下,您不必使用複雜的程式設計結構,因此 TeX 文件看起來與用標記語言編寫的沒有什麼不同。但我認為,就這些類型的文件而言,內容和標記的分離在 TeX 中應用得很好。
如果你看這個例子您給出的,這正是文檔不再像標記一樣的點。
答案3
LaTeX 的設計中是否使用了這種內容與風格分離的概念?只是執行不力嗎?
已經用了,也不一定不好已實施(請參閱其他答案以了解歷史觀點)。相反,它是在相當低級。
你能絕對要在 LaTeX 中嚴格分離內容和樣式(事實上我強烈建議這樣做)。但為了做到這一點,您需要利用 LaTeX 定義巨集的功能。
LaTeX 有一個很少語意宏,例如\chapter
and \emph
(當然還有更多)。有文件類別和套件為您提供更多選項。例如,KOMA-script 類別提供了一整套巨集來客製化LaTeX 提供的語意宏的外觀和感覺。
但實際上,您需要哪種語義很大程度上取決於您正在編寫的文檔類型。因此,有一些文件類別scrlttr2
為寫信的特定任務提供語義宏,但這些是例外:LaTeX 不是提供大量高度特定於領域的語義宏,而是提供了一種用於構建特定於領域的宏的語言。
最終,您的文件應該沒有實體佈局宏,而只使用語意宏。\textbf
?不,使用巨集描述為什麼你想要粗體文字。
因為它們是特定於領域的,所以您需要的大多數巨集可能是由您自己編寫的。這就是為什麼許多 LaTeX 軟體包為您提供了盡可能簡單的工具。例如,有一些套件可以自訂圖形的顯示(或建立自訂圖形類型;請參閱caption
或float
);有一些軟體包可以幫助編寫強大的巨集(etoolbox
以及大多數 LaTeX3)。還有許多特殊用例的包,例如突出顯示原始程式碼。
有了這些,在大多數情況下,將一組可在整個文件中使用的簡單語義巨集組合在一起相對簡單。儘管如此,我的碩士論文的宏觀定義大約佔整個文件的六分之一(在 SLOC 中,註釋被刪除)。
答案4
我當然同意結構和風格的分離是 LaTeX 和 ConTeXt 的基本優勢之一。也就是說,在實踐中很難避免將它們完全混合。事實證明,只有非常簡單的文件才能將樣式和內容完全分開。即使是一本中等大小的書的現實生活案例,幾乎總是需要一些最後一刻的微調,這有效地破壞了它們的分離。對於我作為出版商來說,實現 100% 分離的最實用的解決方案是始終將內容保留在定義文件結構的 xml 文件中,並將所有與樣式相關的指令放在 ConTeXt 文件中。 ConTeXt 剛好是一個非常實用的 xml 處理器。當然,您可以使用 XSLT 從 xml 中輕鬆建立 LaTeX 文件,如果您願意,也可以使用 LaTeX。在這種情況下,您應該將所有與樣式相關的指令放入您的 xsl 檔案中。