【省時(shí)省力寫LaTeX】cdlatex中快速輸入數(shù)學(xué)符號(hào)和字體與自定義設(shè)置
本期我們開始介紹 Emacs 的 cdlatex 插件。今天我們將講解如何使用 cdlatex 快速插入數(shù)學(xué)字母, 符號(hào)和字體, 以及如何自定義新的快捷鍵.
Table of Contents
AucTeX 和 cdlatex 基本設(shè)置
Emacs 中的 LaTeX 編輯主要是依賴 AucTeX 和 cdlatex 這兩個(gè)插件. AucTeX 提供了編輯 LaTeX 的基本功能, 而 cdlatex 主要提供了大量簡(jiǎn)化和易設(shè)置的輸入方式. ?為了安裝并在 LaTeX 編輯時(shí)啟用這兩個(gè)插件, 我們需要在 init.el 中加入代碼:
使用 straight.el 的用戶需要根據(jù)注釋內(nèi)容適當(dāng)調(diào)整. 在 (use-package cdlatex ...) 中我們指定了 :after tex, 是為了保證 cdlatex 在 auctex 之后加載. 把 cdlatex 代碼塊置于 auctex 之后也實(shí)現(xiàn)了相同效果; 而加了這一行后, 代碼塊次序可以隨意調(diào)整.
LaTeX-mode-hook 是我們打開 LaTeX 文件時(shí)需要加載的設(shè)置, 這里我們定義了一個(gè)新的函數(shù) my/latex-hook (名字可隨意), 這樣方便我們?nèi)蘸蠹尤敫嗟墓δ? 函數(shù)的第一行 (turn-on-cdlatex) 就是打開 tex 文件時(shí)加載 cdlatex 的命令.
成功設(shè)置后, 當(dāng)我們打開 tex 文件時(shí), 大家應(yīng)當(dāng)可以看到模式欄中的 LaTeX/P 和 CDL, 就表示加載了 AucTeX 和 cdlatex. 通過 C-h m (m 表示 mode) 可以查看當(dāng)前加載的所有主要模式和次要模式.
數(shù)學(xué)符號(hào)輸入
這里的數(shù)學(xué)符號(hào)也包括各種非拉丁字母如 \alpha, \aleph 等. 輸入方法是用反引號(hào) (Tab 上方) 加另一個(gè)鍵組成的快捷鍵輸入.
插入希臘字母
希臘字母可以用 ` + 對(duì)應(yīng)拉丁字母插入, 包括大小寫. 例如
` + a: \alpha
` + b: \beta
` + g: \gamma
` + G: \Gamma
` + S: \Sigma
如果你不熟悉希臘字母對(duì)應(yīng)的拉丁字母, 沒有關(guān)系, 只要在按下 ` 后稍稍停頓, 就會(huì)彈出一個(gè)提示界面. 大家剛開始使用時(shí)可以多查看這個(gè)提示界面.
數(shù)學(xué)符號(hào)
大家在提示界面可以看到, 除了希臘字母以外, 我們還可以用同樣的方法快速插入數(shù)學(xué)符號(hào). cdlatex 預(yù)置了很多好記的默認(rèn)設(shè)置. 例如, ` + 8 插入 \infty, 因?yàn)閿?shù)字8放平就是無窮, 又如, ` + * 插入 \times 乘號(hào), ` + + 插入 \cup (并集), ` + > 插入 \rightarrow (右箭頭) 等.
第二和第三層目錄
cdlatex 中連續(xù)按下兩次反引號(hào) ` 可以打開第二層目錄. 第二層通常用于希臘字母的變體, 如
`e 插入 \epsilon, ``e 插入 \varepsilon
`r 插入 \rho, ``r 插入 \varrho
又或者是一些類似的符號(hào), 如
`> 插入 \rightarrow, ``> 插入 \longrightarrow
或者是多個(gè)符號(hào)最直觀的快捷鍵相同, 但是頻率最高的放在第一層, 頻率低的放在第二層, 如
`d 插入 \delta, ``d 插入 \partial (求偏導(dǎo)符號(hào))
這個(gè)目錄還有第3層, 這里綁定的快捷鍵就更少了. 默認(rèn)的是一些數(shù)學(xué)函數(shù)的符號(hào), 如 \sin, \exp 等
如何插入 LaTeX 左雙引號(hào) ? ``
反引號(hào)在 LaTeX 中寫作幾乎不會(huì)用到, 除了用于左雙引號(hào) ? ?(LaTeX 的右雙引號(hào)是 `''` ). 這很好解決: 在 AucTeX 默認(rèn)設(shè)置下, 第一個(gè)輸入的雙引號(hào) <kbd>"</kbd> 會(huì)自動(dòng)轉(zhuǎn)換成為 <kbd> 插入, 第二個(gè)輸入的雙引號(hào) " 會(huì)轉(zhuǎn)換為 '' . 例如, "word" 將插入 ?word'' ``.
當(dāng)然, 你也可以把反引號(hào)修改成其它的鍵, 但是既然無須擔(dān)心雙引號(hào)輸入的問題, 我覺得改的意義不大. 反引號(hào)已經(jīng)是很好的選擇.
自定義數(shù)學(xué)符號(hào)快捷鍵
Emacs 的最大優(yōu)勢(shì)就是我們可以自由地設(shè)置. 前面反引號(hào) ` 觸發(fā)的快捷輸入, 我們也可以添加自己需要的符號(hào)或調(diào)整已有的設(shè)置.
這里的所有設(shè)置保存在一個(gè)叫 cdlatex-math-symbol-alist 的變量中. 我們接下來講解在 Emacs 如何設(shè)置一個(gè)變量, 保存設(shè)置以及加載設(shè)置. 這對(duì)其它的變量也是一樣.
打開設(shè)置界面
雖然所有的變量設(shè)置都可以通過 init.el 里面的 (setq ...) 語句完成, 對(duì)于 cdlatex-math-symbol-alist 這種結(jié)構(gòu)非常復(fù)雜的變量, 新手還是建議用 Emacs 自帶的設(shè)置界面.
打開一個(gè)變量的設(shè)置界面主要有兩種方式 (以 cdlatex-math-symbol-alist 為例)
通過 customize-variable 命令: M-x customize-variable RET M-x cdlatex-math-symbol-alist RET
從變量的幫助界面進(jìn)入設(shè)置界面: C-h v cdlatex-math-symbol-alist RET 并點(diǎn)擊 Customize
設(shè)置實(shí)例
我們想調(diào)換 `e 和 ``e 原本的快捷鍵設(shè)置, 即實(shí)現(xiàn)如下效果: ?`e 插入 \varepsilon, ``e 插入 \epsilon. (這么做的原因是 \varepsilon 更常用).
打開 cdlatex-math-symbol-alist 的設(shè)置界面
點(diǎn)擊 INS 插入一個(gè)新條目
在 character 后輸入 e
在 Repeat 后按 INS, 新插入的一行輸入 \varepsilon
在 Repeat 后按 INS, 新插入的一行輸入 \epsilon
這就完成了基本設(shè)置. 如果大家想綁定 ```e 和 ````e 等, 只需要再加入新的行以及你需要的 LaTeX 宏命令即可.
這里因?yàn)?`e 已經(jīng)在 cdlatex 的默認(rèn)設(shè)置中, 所以我們是覆蓋了原有設(shè)置. 你可以在一開始的按下 ` 的提示界面中看到默認(rèn)設(shè)置, 或者通過查看變量 cdlatex-math-symbol-alist-default.
保存與加載設(shè)置
設(shè)置完畢我們會(huì)點(diǎn)擊 Apply and Save.
Apply: 改變了當(dāng)前 cdlatex-math-symbol-alist 的値, 重啟 Emacs 后失效
Save: 保存設(shè)置, 重啟后仍生效.
但是已經(jīng)打開的 tex 文件是看不到更新的設(shè)置的. 想要重新加載 cdlatex 的設(shè)置. 這有3種方法:
重啟 Emacs
一個(gè)是打開新的 tex 文件
在原來的 .tex 文件緩沖區(qū), 按下 C-c C-n.
第三種方法可以刷新 LaTeX 模式設(shè)置, 也適用于其它與 cdlatex 的設(shè)置. 此時(shí), 大家按下反引號(hào) ` 就可以看到更新后的列表了.
怎么選擇快捷鍵
原則上這個(gè)機(jī)制可以插入任意的數(shù)學(xué)表達(dá)式, 如 \stackrel{\mathrm{a.s.}}{=}=, 但是建議只綁定原子化的數(shù)學(xué)符號(hào). 復(fù)雜的表達(dá)式更適合用 cdlatex 的命令補(bǔ)全功能.
快捷鍵要易記, 直觀, 憑你的第一感覺就能找到. 否則不能提高輸入速度. 大家也可以查看默認(rèn)的設(shè)置尋找靈感. 反例就是把左箭頭 \leftarrow 綁到 `> 上.
如果一個(gè)鍵上綁定了多層快捷鍵, 要考慮不同命令使用的頻率, 把最常用的放在第一層, 次常用的放在第二層, 依此類推. 像上面的 \epsilon 和 \varepsilon 的例子.
你也可以綁定自己定義的宏命令. 例如, 我的 `e 綁定的是 \eps, 而在我的 LaTeX 文檔引言區(qū)中會(huì)定義 \newcommand{\eps}{\varepsilon}. 這樣的好處可以提高代碼的可讀性, 方便交流. 畢竟你的導(dǎo)師, 你的合作者未必用 Emacs, 長(zhǎng)長(zhǎng)的 \varepsilon 會(huì)讓人眼花. 但是我輸入時(shí)想到的是希臘字母 epsilon 就應(yīng)該用 `e 輸入.
這里有很大的發(fā)揮空間, 因?yàn)榈诙雍偷谌龑踊径际强盏? 每個(gè)鍵還分大小寫, 可以自由設(shè)置100多個(gè)快捷鍵. 所以盡情發(fā)揮吧.
數(shù)學(xué)字體修飾
數(shù)學(xué)字體
cdlatex 還可以快速插入不同的數(shù)學(xué)字體, 像 \mathrm{}, \mathbf{} 等等. 例如, 我們常常用粗體 R 表示實(shí)數(shù)域, 也就是 \mathbf{R}. 我們可以按3個(gè)鍵完成輸入: R + ' + b
R: 輸入字母 R
' (單引號(hào)): 打開數(shù)學(xué)字體列表. 作用相當(dāng)于前面的 `
b: 在字母 R 外面插入表示粗體的 LaTeX 宏命令 \mathbf{}
按單引號(hào) ' 默認(rèn)會(huì)改變前一個(gè)字母的字體, 也包括希臘字母, 但只是前面一個(gè)字母. 例:
`a'b 插入 \mathbf{\alpha}
ab'b 插入 a\mathbf.
如果需要改變多個(gè)字母的字體可以先選擇字體, 再輸入文本. 這就是第二種方法. 但是輸入單引號(hào)時(shí)前面要是空格或者 $, { 這種功能性字符. 例:
$'babc 插入 $\mathbf{abc}$.
$a'bc 插入 $\mathbf{a}c$.
可以用于改變多個(gè)字符的字體.
其它修飾
這種插入方式也可以推廣到一切 LaTeX 宏命令 + 一對(duì)花括號(hào)內(nèi)一段文本的結(jié)構(gòu). 除了像 \mathbf{}, \mathrm{} 這種數(shù)學(xué)字體, 還可以輸入
數(shù)學(xué)公式中對(duì)字母的其它修飾, 如
這里默認(rèn)的快捷捷非常直觀, 大家也可以按下單引號(hào) ' 稍等以查看提示界面.
'> 插入 \vec{}
'^ 插入 \hat{}
'- 插入 \bar{}
非數(shù)學(xué)公式中的文本字體, 如
'b 插入 \textbf{}
'i 插入 \textit{}
這里同樣的 'b, 用在數(shù)學(xué)公式內(nèi)就是 \mathbf{}, 用在文本中就是 \textbf{}. cdlatex 會(huì)自動(dòng)檢測(cè)當(dāng)前環(huán)境是否為數(shù)學(xué)環(huán)境.
嵌套修飾
觸發(fā)字體修飾的第三種方法是選先高亮選中一段文本, 再選擇修飾. 例如, 選中數(shù)學(xué)環(huán)境外的 blabla, 然后按 'b, 則 blabla 會(huì)變成 \textbf{blabla}. 如果 blabla 在數(shù)學(xué)環(huán)境內(nèi), 則變成 \mathbf{blabla}
第一種方法只能修飾一個(gè)字母, 所以嵌套修飾只能使用第二種或第三種方法. 例:
'-'bR 插入 \bar{\mathbf{R}}.
R'b 插入 \mathbf{R}, 然后高亮選中按下 '-, 變成 \bar{\mathbf{R}}
自定義字體修飾
這里需要設(shè)置的變量是 cdlatex-math-modify-alist. 打開設(shè)置界面的方法和前面一樣, 輸入 M-x customize-variable RET cdlatex-math-modify-alist RET
現(xiàn)在我們舉一個(gè)例子. 假設(shè)我們想用 't 在數(shù)學(xué)公式中插入空心粗體 \mathbb{}. 操作如下
打開 cdlatex-math-modify-alist 設(shè)置界面
點(diǎn)擊 INS 新建一個(gè)條目
第一行 character 輸入 t
第二行: \mathbb
第三行: 保持空白, 因?yàn)槲谋灸J较聸]有空心粗體, 或者輸入 \text, 這是 cdlatex 的默認(rèn)設(shè)置.
第四行: Type 改成 command. 兩種方式幾乎等價(jià)但是 command 現(xiàn)在更常用.
第五, 第六行: 不變
我們修改完之后, 按 Apply and Save 保存, 然后在 tex 文件緩沖區(qū)中用 C-c C-n 刷新設(shè)置, 這樣我們?cè)跀?shù)學(xué)環(huán)境中按下 ' 就能插入空心粗體 \mathbb{} 了.
customize-variable 設(shè)置保存位置
我們的 init.el 設(shè)置里面有這樣兩行:
這樣 Emacs 會(huì)把通過 customize-variable 設(shè)置的變量保存在我們自定義的 custom.el 的文件中. 內(nèi)容大概像這樣:
這里包含了我們前面對(duì) cdlatex-math-modify-alist 和 cdlatex-math-symbol-alist 的設(shè)置.
如果沒有特別的設(shè)置, customize-variable 設(shè)置的變量默認(rèn)會(huì)由 Emacs 保存到 init.el 文件的最后. 我們的設(shè)置可以區(qū)分自己的設(shè)置和 Emacs 保存的設(shè)置.
當(dāng)然, 你也可以手動(dòng)把 custom-set-variables 中的內(nèi)容用 (setq ...) 語句寫在你的 init.el 當(dāng)中, 尤其可以放在相應(yīng)插件的 use-package 代碼塊中. 這樣的好處是方便單獨(dú)管理每個(gè)插件的設(shè)置, 并且利用 use-package 的延遲加載功能加快打開 Emacs 的時(shí)間. 當(dāng)我們的 cdlatex 設(shè)置很長(zhǎng)的時(shí)候, 這樣做可以把 Emacs 的啟動(dòng)時(shí)間從10多秒減少到1秒以下. 大家可以在熟悉了 Emacs 的設(shè)置后再做嘗試, 新手不推薦這么做.
總結(jié)
Emacs 中的 cdlatex 插件利用反引號(hào) ` 和單引號(hào) ' 開始的快捷鍵可以快速插入數(shù)學(xué)字母, 符號(hào)和字體. 我們可以通過設(shè)置 cdlatex-math-symbol-alist 和 cdlatex-math-modify-alist 這兩個(gè)變量修改和增加自己喜歡的快捷鍵.
在下期視頻中我們將介紹 cdlatex 中 Tab 的命令/模板補(bǔ)全功能. 它可以幫助我們輸入一些更復(fù)雜的宏命令, 或者插入環(huán)境模板等等.