1. 程式人生 > 實用技巧 >LaTeX 學習小結

LaTeX 學習小結

前言

數次試圖入坑 LaTeX,但是都因為 LaTex 中各種複雜的概念被勸退,但是,在前兩天,我感覺我似乎成功入坑了,所以,準備把我入坑過程中遇到的問題總結下來。

因此,這篇部落格的內容不會涉及到多少 LaTeX 語法上的東西 ‍(`・ω・´)

基本概念

首先需要明白的是,TeX(LaTeX) 是一個頁面排版系統,因此除了 TeX 這個標記語言本身以外,還涉及到了一些其他更底層的東西,比如說光柵影象處理器 RIP 和頁面描述語言 PDL。

RIP 是數字排版中的一個重要概念,可以是硬體、韌體和軟體,通過 RIP 生成的點陣影象可以輸出到鐳射照排機或直接制版機等製版裝置,也可以輸出到印表機。而 PDL 可以作為 RIP 的輸入, 用來控制 RIP 的輸出,生成我們想要的頁面排版效果。

但是 PDL 太底層了,即不適合閱讀,也不適合編寫,因此,往往還會在 PDL 外面再加一層標記語言,方便閱讀和編寫。而 TeX 就是這樣一種標記語言。學習 TeX 時常見的如 LuaTeX、XeTeX 便是用來將 TeX 編譯為頁面描述語言的引擎, 等價於我們在編譯型語言中使用的編譯器。

另外,TeX 引擎的輸出往往是 DVI 格式,這是一種特殊的裝置無關的頁面描述語言1

,不能嵌入字型和影象,因此,往往還需要某種 驅動 程式來將 DVI 轉換為其他頁面描述語言,比如 PostScript。

類比 TeX 和 C 語言的使用過程便是:

TeX C 語言
使用 TeX 編寫文件 使用 C 語言編寫原始碼
使用 TeX 引擎將 TeX 編譯為頁面描述語言 DVI 將 C 編譯為彙編程式碼
使用 TeX 驅動將 DVI 轉換為其他頁面描述語言 將彙編程式碼編譯為機器碼
將頁面描述語言作為 RIP 的輸入生成最終結果 將機器碼作為計算機的輸入執行

字型相關

作為想要使用 LaTeX 的中文選手,避不開的一個問題就是中文的使用,雖然可以通過 CTEX 巨集包解決中文問題,但還是需要理解一些字型相關的概念。

簡單來說,就是我們編寫的文件往往並沒有直接定義文字和影象的表現形式,其中,文字的表現形式往往是儲存在 字型檔案 中的,而字型檔案本身就是與頁面排版系統密切相關的一種檔案, 理解是可以區分為三種層次:

  • 編碼層 - 通過索引定義了字符集,通過二進位制編碼定義了字元編碼格式
  • 格式層 - 定義了字形的描述方法和字型檔案的儲存格式
  • 顯示層 - 字型的外在表現形式

而編碼層,對應的就是我們編寫 TeX 文件時這一層,儲存的檔案便包含了字元的二進位制編碼,然後在編譯時,可以通過對應的字型格式得到字型字形的描述,然後輸出顯示到螢幕上。

其中,早期的 LaTeX 引擎往往需要有字型檔案對應的 tfm 檔案才能使用該字型,但是,XeTeX 可以不需要 tfm 檔案,因此,想簡單點的話,寫中文還是用 XeTeX 引擎好了。

參考:

相關問題

LaTeX 和 TeX 的區別是什麼?

TeX 是一個由美國計算機教授高德納2發明的標記語言(排版軟體),通過各種命令來控制頁面輸出,比如:

Hello, World
\bye          % marks the end of the file; not shown in the final output

LaTeX 是一個通過 TeX 編寫的巨集包,提供了很多預設的模版和樣式,能夠讓我們能夠更加容易的編寫文件,格式往往類似:

\documentclass[a4paper]{book}
\begin{document}
\section{ ... a title }
\subsection{ ... a subtitle}
%% Text goes here
\end{document}

因此,LaTeX 和 TeX 之間的關係就像是 Java 語言和各種依賴包之間的關係一樣,參考:

plain TeX 又是什麼東西?

TeX 是一種標記語言,也是一種巨集語言,當你製作了一些特別基礎的巨集,那麼你可以將其釋出為一個格式,plain TeX 便是高納德建立的一種格式,LaTeX 則是現在使用的最為廣泛的格式。

使用類似 XeLaTeX 的命令時其實便等價於 XeTeX -fmt=latex 的簡寫。

.cls 和 .sty 檔案之間的區別

這兩種檔案沒有本質上的區別,在 LaTeX 升級之前其實只有 .sty 這一種檔案,因為,所有的 TeX 巨集包某種程度上來說都是為了樣式服務的, 但是由於 LaTeX 中往往只會載入一個 documentclass,因此,後來單獨分了一個字尾名 .cls 來存在 documentclass。

使用時,往往是通過 \documentclass{} 載入一個類檔案,且只能載入一次,並通過 \usepackage{} 載入任意數量的其他巨集包。

兩者檔案的編寫原則:

  • 如果一個命令是用來控制文件結構的,則應該放到類檔案中,否則應該放到包檔案中
  • 如果一個命令可以被其他所有的文件使用,那麼將這個命令放置到一個包中,如果不是,則將它放到一個類檔案中
  • 當一個命令使上述兩條規則衝突的時候,優先考慮第一條規則。如 \section 命令幾乎在所有的文件中都使用,但因為其是用來控制文件結構的,我們將其放置到類檔案中

參考:

如何在 LaTeX 中使用中文

在 LaTeX 中使用中文的簡單方案是使用 CTEX 巨集包和 xelatex 引擎,其中,CTEX 巨集包提供了簡便的 ctexart、ctexrep、ctexbook 和 ctexbemer 文件類,但是如果想使用其他的文件類的話, 也可以單獨使用 ctex 巨集包。

還可以通過 heading 選項開啟中文風格的標題: 其中,CTEX 巨集包會使用 CJK 字型集,CJK 的含義是中日韓統一表意文字在電腦的所有字型列表,參考:

命令和環境的區別

命令通常用來來控制 LaTeX 文件的行為,常見的格式為:

\commandname[optional argument]{main argument}

% 多個引數
\multicolumn{number of columns joined}{alignment}{content} 

還有一些命令可以不要引數:

\item Text being item content

環境是一種特殊的命令,也可以有引數和選項,常見格式為:

\begin{environmentname}
  content
\end{environmentname}

參考:

結語

總的來說的話,LaTeX 本身的語法並不難,但是,學習的時候經常就是一堆概念糊到你臉上,讓人有些措手不及。

希望,這次理清了一些概念後後續的學習能夠輕鬆一點。

Footnotes

1 準確來說只能算是準頁面描述語言

2 《計算機程式設計藝術》的作者,我喜歡叫他高祖,擁有個人 維基百科頁面 的大佬