轉自:https://ridiqulous.com/latex-notes-details/
By Jueqin
12 Min read
In Blog
April 23, 2016
強
最近一段時間迷上了 (La)TeX,也看了不少資料。LaTeX 排版過程中有不少 de facto(約定俗成的)規則,它們不是必須,但是是區別「熟練掌握 LaTeX」與「會使用 LaTeX」的關鍵因素。我本身就是對細節有強迫症的人,比如修改了 WordPress 的 style.css 後我可以對所有文章的代碼都修改一遍,僅僅只爲了圖片和圖注之間的間隔更加美觀一些……
過一段時間後也許我會不記得這些 LaTeX 的小細節,因此這裏稍加記錄,以作備忘。
• 嚴格區分文字和公式
這一條應該是 LaTeX 用於科學文章排版的最基本要求。在文本輸入中應該嚴格避免出現 \mathbf{}
、\mathrm{}
等語句,同理,在公式的編輯中也應該嚴格避免出現 \textbf{}
、\textrm{}
等。當然,如果使用了 AMSMath 宏包,則 \text{}
是在公式中輸入文本的一種很好的方法。雖然大部分情況下讀者是無法分辨一個公式中 \mathbf{}
和 \textbf{}
的區別,但是這畢竟是應該遵守的語法規則。
• 正確處理單詞間距
這一條僅適用於英文排版,中文中水平間距的講究要少得多,基本用一個 xeCJK 就都幫你搞定。
英文排版時 TeX 通常默認句號 .
表示一句話的結束,因此在處理句號時會留出稍寬一點的水平間距。但是有些情況下,句號並不代表句子的結尾,比如「i.e. a word」和「e.g. a word」。按照 TeX 默認規則,這裏的寬度會比正常句中單詞之間的間隔稍大一些,因此我們需要使用 \
(即一個反斜槓 + 一個空格)來消除這個過大的間距:i.e.\ a word
以及 e.g.\ a word
。
然而還有一種特殊情況下,TeX 並不會認爲句號表示句子的結尾,那就是句號跟在一個大寫字母的後面。此時 TeX 會認爲這個句號表示人名縮寫的間隔符,因此仍然按照正常間距來排版,比如 「A. Einstein」。然而這個看似貼心的規則在一些情況下會適得其反,比如一句話明明以縮略語結尾,TeX 反而認爲這並不是一句話的結尾:「…… in NBA. He…」。此時,排版出的「He」之前的空格會小於正常的句間間距。這種情況下,需要使用 \@.
(反斜槓 + @ + 句號 + 空格)來取代原先的句號,即 ... in NBA\@. He...
。\@
用來強制告訴 TeX 這裏的的確確是一個句子的結尾。
如下所示:
Two people i.e. you and me...
Two people i.e.\ you and me...
... played in NBA. He was ...
... played in NBA\@. He was ...
以上規則除句號外,同樣適用於感嘆號和問號。
• 公式中的間距設置
積分公式中的微分符號 前應該加入一個間距 \,
,這個大多數人都知道。不僅如此,一條公式結尾處的標點符號和公式之間,也應該有一個間距 \,
。另外,對於積分公式,積分符號 與被積項之間通常間距過大,這個時候可以利用 \!
來縮小這一間距。差別如下(上式爲偷懶寫法,下式爲強迫症寫法):
$\int_a^bf(x)dx = \alpha.$\\
$\int_a^b\!f(x)\,dx = \alpha\,.$
• 連字符(Hyphens)、連接號(En-dashes)、破折號(Em-dashes)及減號(Minus signs)
連字符 -
通常用來連接複合詞,比如 daughter-in-law
。
連接號 --
通常用來表示範圍,比如 see pages 5--7
。如果真的希望連續輸入兩個連字符,使用 {-}{-}
。
破折號 ---
是一個正規的標點符號,用來表示轉折或者承上啓下。要注意的是,破折號與其前後的單詞之間不應該存在空格,例如 A specter is haunting Europe---the specter of Communism.
。
排版中的減號應該比連字符要長,因此用來表示減號或者負號時,請嚴格使用數學模式 $-5$
而不要使用文字模式 -5
。
以上四種區別如下:
• 轉置符號
我搜了一下好像轉置符號並沒有嚴格的規定,好幾種都在普遍被使用。但是有一點是明確的,轉置符號不能是斜體。常見的轉置符號大概有四種(自定義的不算):
$\mathbf{A}^\mathrm{T}$
$\mathbf{A}^\top$
$\mathbf{A}^\mathsf{T}$
$\mathbf{A}^\intercal$
各自效果如下圖所示:
我個人傾向於使用第三或者第四個。其中 \intercal
符號需要使用 AMS 的字符包: \usepackage{amssymb}
。
• 數學公式中的括號和斜除號
不要粗暴地使用 \left(...\right)
(\left[...\right]
、\left\{...\right\}
同理),用 \big
、\bigg
、\Big
、\Bigg
會更美觀。在寫單邊括號時我個人還喜歡使用 \bigl\{
或 \bigr\}
這種。
對於一些需要用到斜除號的地方,如果斜除號兩邊的字符比較高,用常規的 /
會導致式子很不協調,這個時候可以使用 \middle/
來使得斜除號的高度與兩側字符高度相匹配。如下所示:
$x = a^\frac{1}{2}/b$
$x = \left.a^\frac{1}{2}\middle/b\right.$
• 序號
英文中的序號 1st、2nd、3rd 等,通常用文字模式輸入就可以,但是在數學中,經常會涉及「nth element,第 n 個元素」等序號問題。一般會使用連字符來表示,比如 $n$-th
。有的時候可能需要使用上標的方法,那麼一般使用 $n^{\text{th}}$
。如果再強迫症一點,可以使用 $n^{\text{\tiny th}}$
使上標稍小一些。文字模式下,可以使用 \textsuperscript{th}
來顯示爲上標。或者使用 nth 宏包來方便輸入(需要使用 [super] 選項來輸入上標)。
以上幾種方式總結如下:
\documentclass{article}
\usepackage[super]{nth}
\usepackage{amsmath}
\begin{document}
$n$th
$n$-th
$n^{\text{th}}$
$n^{\text{\tiny th}}$
1\textsuperscript{st}\quad 2\textsuperscript{nd}\quad n\textsuperscript{th}
\nth{1}\quad \nth{2}\quad \nth{4}
\end{document}
各自效果如下圖:
• 避免數字出現在行首
這個細節大部分人應該都瞭解,使用 ~
來代替空格可以避免交叉引用或者輸入人名時尷尬地被打破成兩行,例如 如圖~\ref{Fig1} 所示
,或者 as A.~Einstein said...
。
• 中英混排時空格的使用
對於中文排版或中英混排,推薦使用 xeCJK 而非古老的 CJK 或 CTeX。在 xeCJK 下(其他兩個我沒試過)(更正:這個其實是 XeLaTeX 的功勞,與 xeCJK 無關),中文與英文(或數字)之間,沒有必要手動敲入一個空格,編譯時會自動爲中文與英文(或數字)之間添加合適的間距。但是有一個情況比較特殊,就是在交叉引用時,這個空格是需要手動敲入的,否則這個間距會消失。如下圖所示:
\documentclass{article}
\usepackage{amsmath}
\usepackage{xeCJK}
\begin{document}
\begin{equation}
\int_a^b\!f(x)\,dx = \alpha\,.
\label{eq1}
\end{equation}
\begin{center}
... 在式~\eqref{eq1}中,...
... 在式~\eqref{eq1} 中,...
\end{center}
\end{document}
• 其他
- 波浪號(經常在頁面的 url 中出現)可以使用
\~{}
來輸入,但是這樣會造成位於偏上的位置,像 這樣。這個時候可以通過$\sim$
來解決,效果爲 。 - 斜槓用來表示「或者」的關係時,最好不要簡單地使用
/
,比如read/write
,因爲這樣 TeX 會認爲這兩個單詞是一個整體,不允許在它們之間加入斷號,導致有些情況下一行文字過密或過疏。這個時候推薦使用read\slash write
,即允許排版時把這兩個單詞隔在兩行。而在輸入單位的時候,仍然使用/
即可,比如5 MB/s
。 - 用
\mbox{}
來避免一個單詞中兩個字母粘在一起的情況。比如爲了防止「Sheffield」的兩個 f 以及 f 和 i 之間相鄰過近,可以寫成Shef\mbox{}f\mbox{}ield
。 - arydshln 宏包跟 array 宏包有衝突(也可能是 tabulary),需要把
\usepackage{arydshln}
放在最後。但是這會導致編譯速度變得很慢。類似的做法也適合其他明明看上去很正常但是就是無法正確編譯的情況,試試把某些宏包的聲明放到最後。 - (參考自這裏)使用
align
環境時,應該在對齊符號&
前後使用一個佔位符{}
來避免不正確的縮進。比如\begin{align*} x+2y={}&1\\ 2x+y={}&1\\ &{}+1 \end{align*}
另外還有以下幾點,不算細節的問題,但是是我這段時間學習到的一些經驗:
• 謹慎使用 BibLaTeX
其實我是更偏向於使用 BibLaTeX,畢竟可定製化的地方更多一些,功能也更爲強大。但是有不少的期刊並不接受 BibLaTeX,原因應該是 BibLaTeX 出現的時間太晚(2006年),而那些期刊早就有了自己固定的樣式文件。例如我最近準備向 OSA 投稿,但是 OSA 提供的 LaTeX 模板中明確指定了使用 natbib 來生成參考文獻。因此我的建議是,對於一些不是太正式的文檔,可以利用 BibLaTeX 來生成文獻引用,但是對於一些投稿的文檔,則必須注意接稿方的要求,謹慎使用 BibLaTeX。
• 寫文本之前明確文檔類型
對於沒有模板的文檔,或者自己從頭開始編寫的文檔,一定要先確定好文檔類型,是 article 還是 report 還是 book。因爲對於不同的文檔類型,TeX 的層次結構是不一樣的,如果寫到一半時對文檔類型進行變動,所有的層次、交叉引用的編號都會亂套。尤其對於中文排版,如果在導言區中自定義了一些針對不同層級的 renewcommand,結果會更慘…… 雖然可以通過一些方法對這個問題進行挽救,但是在寫文檔前就應該考慮清楚文檔類型,儘量避免這種不必要的麻煩。
• 允許 MathJax 使用單美元符號輸入行內公式
最後再補充一點跟排版無關的內容。我使用 MathJax 來使 WordPress 支持 (La)TeX,但是 MathJax 的默認配置是不允許使用單美元符號 $ ... $
來輸入行內公式的,而必須使用括號形式 \( ... \)
。官方的理由是單美元符號 $ 出現頻率太高,因此用括號的形式能夠避免一些不必要的麻煩。但是在大部分的 .tex 文檔中,我們往往習慣使用單美元符號來輸入行內公式,這個時候,只需要在主題的 header.php 文件中加入 MathJax 的配置說明:
MathJax.Hub.Config({
tex2jax: {
inlineMath: [['
,'
], ['\\(','\\)']],
processEscapes: true}
});
這段配置通常放在原有調用 MathJax 語句下面即可,這時候 header.php 文件應該是這個樣子:
References
- Stack Exchange, What is the best symbol for vector/matrix transpose?, http://tex.stackexchange.com/questions/30619/what-is-the-best-symbol-for-vector-matrix-transpose
- Martin J. Osborne, some common (la)tex errors, https://www.economics.utoronto.ca/osborne/latex/LTXERR.HTM
- Will Robertson, Correct punctuation spaces, http://latex-alive.tumblr.com/post/827168808/correct-punctuation-spaces
- Dr How, 強迫症玩轉 LaTeX, http://zhuanlan.zhihu.com/p/19683504
- Tobias Oetiker et.al., The Not So Short Introduction to LaTeX2ε, https://tobi.oetiker.ch/lshort/
- Stack Exchange, bibtex vs. biber and biblatex vs. natbib, http://tex.stackexchange.com/questions/25701/bibtex-vs-biber-and-biblatex-vs-natbib
- Wilson_NJUer, LaTeX 寫作新手須知, http://weibo.com/ttarticle/p/show?id=2309403955741387052924