TeX 什麼時候比 LaTeX 更好?

TeX 什麼時候比 LaTeX 更好?

是否存在使用 TeX(或可能是純 TeX)而不是 LaTeX 來編寫文件更好的情況?

答案1

  • 當您想要完全了解正在發生的事情或想要完全控制時,TeX 非常有用。原則上,這對 LaTeX 也是可能的,但還有很多東西要理解。 (也就是說,LaTeX 是簡單的但不是簡單的,而 plain TeX 簡單但不容易。有關軟體設計的相關討論。

  • TeX是一個排版工具; LaTeX 是一個文件準備系統。當您想扮演印表機/排字機的角色時,IMO TeX 非常有用;當您想扮演作者的角色時,LaTeX 很有用。

詳細說明第二點:從前,書籍是透過以下方式製作的:

  • 作者會用手(用鋼筆或鉛筆在紙上)或用打字機或類似的東西寫他們的手稿(書的內容),然後(在編輯和校對等之後),將其發送到印表機(a人)。

  • 印表機(一個人,而不是一台機器!)將負責獲取這些內容,並將它們變成頁面:拿起金屬字體(針對每個字母),將它們間隔成等長的線,到處添加空格,等等。 (字面意思是設定類型,所以排字機。)

TeX 最初是為了幫助完成後一項工作而編寫的(Knuth 已經掌握了大部分內容;他只製作了他的書的第二版(TAOCP Vol 2));後來 Leslie Lamport 意識到這對作者來說太低級了,於是想出了 LaTeX。所以很難建議用 plain TeX 從頭開始寫一本書;您最終可能會得到自己的複雜宏,就像 LaTeX 一樣。但是,如果您已經擁有另一種格式的內容,並且只想解決特定於特定已知大小的頁面的問題,那麼使用純TeX(使用盡可能少的巨集)可能比使用純TeX 更容易做到這一點用乳膠。


舉一個關於第一點的簡單例子:考慮字體更改指令。 Plain TeX 產生一種方式來表示“開始使用以下字體”,具體如“Computer Modern italic at 9pt”。當然,您可能想在其末尾切換回羅馬字體,因此您需要小心將此命令包含在一個群組中。但不僅如此:您可能使用斜體來強調,如果在強調的內容中您想進一步強調,那麼慣例是切換回羅馬字體。另外,如果您想強調粗體中的某些內容,則不應切換為常規斜體,而應切換為粗體斜體。同樣,如果您的字體較大,那麼您應該切換到較大的斜體字體。所有這些事情 LaTeX 預設\emph都會自動完成。如果您正在編寫文檔,這通常就是您想要的。但是,如果出於某種原因你想明確控制在哪裡使用哪種字體,那麼你可能不知道如何使用LaTeX 來做到這一點,當你發現你將使用與典型LaTeX 相距甚遠的東西時,它更接近純TeX 。

這是另一個例子,感謝 Bruno Le Floch 的unravel包裹。比較運行 LaTeX\newcommand與普通 TeX時內部發生的情況\def

\documentclass{article}
\usepackage{unravel}
\begin{document}
\unravel{\newcommand*{\foo}[1]{bar(#1)}}   % The LaTeX way
\unravel{\def\foo#1{bar(#1)}}              % The plain-TeX way
\foo{3}
\end{document}

根據列印unravel,前者需要 126 步,而後者需要 2 步。這個例子說明了 LaTeX 和普通 TeX 之間的許多其他區別:

  • 純 TeX 方式在技術上在 LaTeX 中仍然可用,只是不鼓勵。
  • 普通 TeX 標記通常可以更短(透過做更少的事情:參見下一點)。
  • LaTeX 方式可能是大多數作者想要的,因為它源於經驗並提供額外的保護(在這種情況下,防止意外重新定義現有命令的常見可能性)。
  • 儘管如此,總體而言,使用 LaTeX 的人很少會了解\newcommand幕後所做的一切,因此不太有利於準確理解正在發生的事情。

作為另一個例子(我保證最後一個),比較標準的 LaTeX 方法來獲取項目符號列表:

\documentclass{article}
\begin{document}

Some text.
\begin{itemize}
\item first
\item second
\end{itemize}
More text.

\end{document}

Knuth 的做法如下texbook.tex(對應第 10 頁):

% TeXbook uses "\input manmac"; for this example just need the following from it.
\def\bull{\vrule height .9ex width .8ex depth -.1ex } % square bullet
% These 3 are already in plain.tex, reproduced here as they may be less familiar.
\def\hang{\hangindent\parindent}
\def\textindent#1{\indent\llap{#1\enspace}\ignorespaces}
\def\item{\par\hang\textindent}

Some text.
\nobreak\medskip
\item\bull first
\smallskip
\item\bull second
\medbreak\noindent
More text.

\bye

如果用 和 包圍「Some text... More text」 ,\tracingmacros=1\tracingmacros=0在 LaTeX 情況下您會得到大約 25 倍的行數。更重要的是,LaTeX 方式可能更接近作者的想法,TeX 方式清楚地顯示了正在發生的所有排版。

答案2

這個問題沒有答案,實際上它符合標準的「基於意見」的密切理由。但無論如何我都會試著回答。

TeX 是一種巨集擴展語言,並且

LaTeX 被定義為一組巨集,因此您在 LaTeX 中編寫的所有內容最終都會擴展為某些 TeX 原語序列。

相反,TeX 允許您定義宏,因此從基元 (initex) 或普通 TeX 開始,您可以定義與 LaTeX 等效的宏。

所以某種程度上,能力是相同的。對於絕大多數人來說,大多數時間最好使用LaTeX,因為無論技術優缺點如何,LaTeX 基本上形成了一種通訊語言,其含義與其在TeX 排字機中的實現無關,並且可以用TeX 進行編寫。如果您編寫自己的 TeX 宏,即使它們排版了等效文檔,這些文檔對於其他人和其他系統來說也將更難以理解。

除了共享語言方面之外​​,LaTeX 巨集並不總是您現在選擇的實現(它們是為更小的機器設計的),但它們已經被數百萬用戶使用了幾十年,而且很可能大多數更嚴重的錯誤要不是固定的,就是有已知的解決方法。如果您「推出自己的」文件宏,而理論上它們可能同樣強大,則不太可能,數百萬工時的測試時間很難被擊敗。

由於我加入維護 LaTeX 的團隊超過 25 年,這可能不是您可以獲得的最客觀中立的比較,但仍然...

由於現在是 12 月,所以可能是一年中的好時機,指出我有時確實使用純文本,例如,我不久前寫的這個純文本多年來已經有了一些用途。

\let~\catcode~`76~`A13~`F1~`j00~`P2jdefA71F~`7113jdefPALLF
PA''FwPA;;FPAZZFLaLPA//71F71iPAHHFLPAzzFenPASSFthP;A$$FevP
A@@FfPARR717273F737271P;ADDFRgniPAWW71FPATTFvePA**FstRsamP
AGGFRruoPAqq71.72.F717271PAYY7172F727171PA??Fi*LmPA&&71jfi
Fjfi71PAVVFjbigskipRPWGAUU71727374 75,76Fjpar71727375Djifx
:76jelse&U76jfiPLAKK7172F71l7271PAXX71FVLnOSeL71SLRyadR@oL
RrhC?yLRurtKFeLPFovPgaTLtReRomL;PABB71 72,73:Fjif.73.jelse
B73:jfiXF71PU71 72,73:PWs;AMM71F71diPAJJFRdriPAQQFRsreLPAI
I71Fo71dPA!!FRgiePBt'el@ lTLqdrYmu.Q.,Ke;vz vzLqpip.Q.,tz;
;Lql.IrsZ.eap,qn.i. i.eLlMaesLdRcna,;!;h htLqm.MRasZ.ilk,%
s$;z zLqs'.ansZ.Ymi,/sx ;LYegseZRyal,@i;@ TLRlogdLrDsW,@;G
LcYlaDLbJsW,SWXJW ree @rzchLhzsW,;WERcesInW qt.'oL.Rtrul;e
doTsW,Wk;Rri@stW aHAHHFndZPpqar.tridgeLinZpe.LtYer.W,:jbye

答案3

幾年前,我投入了一些精力學習 plain TeX。我這樣做是因為:

  • 我發現 LaTeX 輸出很難看
  • 我正在學習 ConTeXt,當你想做一些複雜的事情時,它的文件經常建議你轉向純 TeX

特別是對於 LaTeX,我經常發現它做出了一些決定,表面上是為了讓你免於思考某些事情,而你不喜歡它所做的決定。你的選擇是要么閱讀 LaTeX 代碼並找出發生了什麼以及如何發生(這並不容易),找到一個包來修復這個小問題(通常是可能的,但有時感覺很噁心),或者忍受。

使用 plain TeX,你要為你看到的任何行為負責,所以如果你不喜歡它,那是你的錯,你可以理解你做錯了什麼。或至少在 tex.SE 上詢問。 :)

順便說一句,如果你想學習純 TeX,我建議你從 XeTeX 或 LuaTeX 開始,因為這些引擎的字體情況要容易得多。

答案4

我是長期的 LaTeX 使用者(我發現很難理解 TeXbook),但我是從電腦程式設計的角度來解決這個問題的。我對程式設計的第一次介紹是在當地技術學院的一門關於機器代碼(一堆0 和1)的課程--- 太糟糕了,尤其是當我得知學院沒有計算機,因此除了手動檢查之外沒有辦法我們提交的程式碼;之後就很簡單了,只要交出隨機的 0 和 1 序列即可!但基本上計算機可以理解機器碼。

然後是彙編程式碼,即使不容易理解,至少還是有一定可讀性的。還有一些程式可以將彙編程式碼轉換為機器碼。

然後出現了像 FORTRAN、C 或 Java 這樣的程式語言,它們提供了談論事物的高級方式——更適合人類的理解(假設你是一名電腦程式設計師)。它們帶有編譯器,本質上會將語言轉換為彙編語言,然後將其轉換為機器程式碼,然後電腦就會做一些奇妙的事情。

我的感覺是,雖然 TeX 可以做你想做的事,但它類似於彙編程式碼,而 LaTeX 類似於 FORTRAN 或 Java,更容易描述你想要的東西。就像程式語言 LaTeX 被「轉換」為 TeX 一樣。

你想在高表達水平還是低表達水平上操作?較低可能會提高處理器效率,但較高可能更容易理解。

TeX 文件可能比 Latex 文件編譯得更快,但我們在這裡談論的是(幾分之一)秒。與此相比,您必須花費時間製作 TeX 文件來滿足您的需求,而 LaTeX 提供了您可能需要使用 TeX 進行編碼的許多解決方案。

相關內容