LaTeX 與 TeX 有什麼本質區別?
說 LaTeX 是用 TeX 寫的,那為什麼要用專門的程序來編譯,而不是直接用 TeX。
這裡造成混淆的一個可能原因是平時用詞的多義性。TeX/LaTeX 既可以表示所指的宏語言/格式,也可以表示實現該宏語言的整套軟體,也可以表示軟體中的一兩個可執行程序命令。
我們說,LaTeX 是用 TeX 寫的,是指 LaTeX 是使用 TeX 這種宏語言所編寫的一集宏,並作為一種格式(format)固定下來。在這個意義上說,LaTeX 就是在你系統上查看 source2e 文檔時看到的那些源代碼。去除文檔注釋後的代碼分布在 TEXMF 樹的 tex/latex/base 路徑下(以 Linux TeX Live 2016 為例就是 /usr/local/texlive/2016/texmf-dist/tex/latex/base),LaTeX 代碼的內核就是 latex.ltx 文件。你會看到,LaTeX 的內核(latex.ltx)就是用 TeX 語言編寫的,比如 center 環境就是這樣定義的:defcenter{ rivlist centeringitem
elax}
defendcenter{endtrivlist}
然後下面還能找到 rivlist 的定義,centering 的定義,item 的定義,等等。整個 LaTeX 的代碼成千上萬的命令,最終會被歸結到幾百個 TeX primitive 命令中。這就是所謂「LaTeX 是用 TeX 寫的」。
而用什麼程序來編譯,這是另一回事。
首先,正如 C 語言有不同的編譯器一樣,實現 TeX 語言的也有不同的程序。不同的實現一般被稱為不同的 TeX 引擎,除了 Knuth 最早用 Pascal 語言編寫的實現,有後來用 web2c 轉換為 C 語言的 web2c 實現,有在 web2c 基礎上繼續開發得到的 pdfTeX、XeTeX、pTeX、upTeX 等等,還有不依賴於 web2c 重新編寫的 LuaTeX、ApTeX 等等。這些 TeX 實現(引擎)各自都有自己的可執行程序,不同程序上也可以執行 Plain TeX、LaTeX、texinfo 等等不同格式(宏代碼集)。這些可執行程序通常是通過命令行選項來確定使用哪種格式的及其他功能的,例如對於 TeX Live,編譯 LaTeX 文件並輸出 PDF 文件可以用:pdftex -fmt=latex foo.tex
編譯 Plain TeX 文件並輸出 PDF 文件可以用
pdftex -fmt=plain foo.tex
編譯 LaTeX 文件並輸出 DVI 文件可以用
pdftex -fmt=latex -dvi foo.tex
等等。
只是命令參數過多不方便輸入,為了方便,就新定義一個 latex 命令,等價於 pdftex -fmt=latex -dvi;定義一個 pdflatex 命令,等價於 pdftex -fmt=latex;原來的 pdftex 命令等價於默認加了 -fmt=plain 選項。在不同的系統下,這樣定義不同的命令的方式不同。在 Linux 下面,通常採用符號鏈接的方式,給一個程序不同的名字,讓 C 代碼通過測試 argv[0] 確定當前使用的名字;在 Windows 下面符號鏈接不方便使用,通常是把整個 TeX 引擎編譯為一個 .dll 動態庫,然後不同的名字命令都調用相同的動態庫,裡面測試 argv[0] 確定程序名。我們以李阿玲的 ApTeX 為例(ptex-ng/aptex-src.c at master · clerkma/ptex-ng · GitHub),函數 aptex_commands_init 就是處理命令行參數的。其中這幾句: if (aptex_env.aptex_fmt == NULL)
format_name = remove_suffix(xbasename(av[0]));
else
format_name = xstrdup(aptex_env.aptex_fmt);
就是在沒有指定 --format 選項時,通過命令名(av[0])來確定 format 的。
這就是我們通常會採用不同命令來編譯 Plain TeX 和 LaTeX 源文件的原因。&> du -h /usr/local/texlive/2015/bin/x86_64-darwin/pdf{tex,latex}
2.1M /usr/local/texlive/2015/bin/x86_64-darwin/pdftex
4.0K /usr/local/texlive/2015/bin/x86_64-darwin/pdflatex
&> du -h /usr/local/texlive/2015/bin/x86_64-darwin/xe{tex,latex}
22M /usr/local/texlive/2015/bin/x86_64-darwin/xetex
4.0K /usr/local/texlive/2015/bin/x86_64-darwin/xelatex
&> du -h /usr/local/texlive/2015/bin/x86_64-darwin/{tex,latex}
404K /usr/local/texlive/2015/bin/x86_64-darwin/tex
4.0K /usr/local/texlive/2015/bin/x86_64-darwin/latex
我想這多少能說明一些問題。
更直接一點:
ls -al /usr/local/texlive/2015/bin/x86_64-darwin/xelatex
lrwxr-xr-x 1 useruseruser wheel 5 10 20 2015 /usr/local/texlive/2015/bin/x86_64-darwin/xelatex -&> xetex
TeX新手。自己的一點筆記,也不知道對不對。
TeX是排版引擎,是給機器下指令的。它有好多種具體的實現。
LaTeX是宏包,方便用戶調用TeX。
另外,比如
XeTeX同樣也是排版引擎,是TeX的一種實現,增加了對萬國碼的支持。
XeLaTeX是宏包,是指使用宏包LaTeX調用排版引擎XeTeX。
推薦閱讀:
