本文是《從零開(kāi)始——Emacs 安裝配置使用教程 2015》(簡(jiǎn)稱(chēng)《從零開(kāi)始》)的姊妹篇,總結(jié)了我在這幾個(gè)月中使用Auctex模式的經(jīng)驗(yàn)。建議優(yōu)先閱讀《從零開(kāi)始》,以理解安裝配置emacs的基本操作。我使用Tex Live2014作為L(zhǎng)atex的編譯環(huán)境。本文并不以介紹Latex以及Auctex為重點(diǎn),僅僅止于描述基本的使用場(chǎng)景。
Auctex簡(jiǎn)介
背景知識(shí)
本文以《從零開(kāi)始》中使用的設(shè)置為基礎(chǔ),如需額外設(shè)置均有提及。
本文中,init-auctex
代表auctex的初始化文檔??梢允且粋€(gè)獨(dú)立的文件。如果你只有一個(gè)初始化文件,那么對(duì)應(yīng)其中初始化auctex的部分。
emacs中,有些指令會(huì)在當(dāng)前窗口的左側(cè)或右側(cè)調(diào)出一個(gè)臨時(shí)區(qū)域,提供一個(gè)選項(xiàng)列表。一般光標(biāo)會(huì)自動(dòng)切換到這個(gè)區(qū)域中。其中,使用方向鍵或者n
、p
可以上下移動(dòng),RET
鍵確認(rèn)選擇。
LaTex快捷鍵
核心操作
編譯文檔
C-c C-c
對(duì)主文檔執(zhí)行各種命令,如編譯、預(yù)覽PDF等。如果沒(méi)有額外設(shè)置,默認(rèn)主文檔為當(dāng)前正在編輯的文檔。比如,使用Latex編譯當(dāng)前文檔,C-c C-c latex
?;蛘?,預(yù)覽當(dāng)前文檔,C-c C-c view
。預(yù)覽PDF
C-c C-v
,相當(dāng)于C-c C-c view
的快捷版。
其他操作
原則上,Latex源碼可以用任何文檔編輯器編寫(xiě)。使用emacs,只要知道編譯和預(yù)覽指令的快捷鍵,就足夠應(yīng)對(duì)一般需求了。但畢竟用的是大名鼎鼎的auctex模式,不去使用那些特色功能就太可惜了。
放大字體
C-x C-+
添加章節(jié)
C-c C-s
文檔目錄
C-c =
,體驗(yàn)非常贊。添加各類(lèi)環(huán)境
一個(gè)環(huán)境以\begin{env name}
開(kāi)始,以\end{env name}
結(jié)束。使用C-c C-e
來(lái)快速添加一個(gè)指定環(huán)境,比如C-c C-e equation
,并且可以快速指定相關(guān)屬性,比如label。快速引用label
Latex中,許多地方都可以添加label屬性,比如章節(jié)、公式塊、圖表等。C-c )
可以快速引用指定label。右側(cè)會(huì)自動(dòng)打開(kāi)一個(gè)窗口,鍵入RET
選擇以label名的形式引用,鍵入p
以頁(yè)碼的形式引用。接下來(lái),程序會(huì)檢索整個(gè)文檔,生成引用數(shù)據(jù),所以請(qǐng)稍微等一下。然后窗口頂部提示“SELECT A LABEL TYPE”,鍵入相關(guān)快捷鍵后,比如e
(equation),程序會(huì)列出文檔中的全部有l(wèi)abel的公式,選中后即可插入。另外,emacs會(huì)智能檢測(cè)當(dāng)前位置的文本環(huán)境。比如,如果你在單詞“section”后面調(diào)用C-c )
,那么程序會(huì)直接列出所有的"section label"。"equation"、"figure"也有類(lèi)似的效果。如果修改了源文檔中的label,記得在列出所有l(wèi)abel的窗口內(nèi)鍵入r
來(lái)刷新label目錄。
文獻(xiàn)的引用比較特殊,參見(jiàn)RefTex插入引入文獻(xiàn)。
更多功能,請(qǐng)參考RefTeX-in-a-Nutshell
- Auctex文檔內(nèi)預(yù)覽Latex
auctex的核心功能之一。編輯完一個(gè)公式塊后,只想預(yù)覽公式本身編譯的結(jié)果,而非整個(gè)文檔,該功能便派上用場(chǎng)了。保證光標(biāo)在公式塊內(nèi),鍵入C-c C-p C-e
即可。這時(shí),相應(yīng)位置的Latex代碼會(huì)被替換為渲染后的圖片。光標(biāo)進(jìn)入到圖片區(qū)域內(nèi)部時(shí),會(huì)顯示Latex源碼,移出源碼區(qū)后,會(huì)顯示圖片,很方便吧?當(dāng)然,修改過(guò)代碼后,需要再次鍵入C-c C-p C-e
來(lái)重新生成圖片。對(duì)于大文檔,局部預(yù)覽可以節(jié)省許多時(shí)間。
如果想要移除當(dāng)前文檔內(nèi)的全部預(yù)覽結(jié)果,鍵入C-c C-p C-c C-d
即可。
除了公式外,插入的圖片、表格等,都可以預(yù)覽。
進(jìn)階技巧
包含子文件的文檔
<a name="multifile"></a>編寫(xiě)較大的文檔時(shí),經(jīng)常會(huì)使用\include
或者\input
命令來(lái)將主要章節(jié)分離為獨(dú)立的文件。在編寫(xiě)這些子文檔時(shí),可不可以在鍵入編譯或預(yù)覽等命令時(shí),讓auctex自動(dòng)定位主文檔并執(zhí)行命令?參見(jiàn)Multifile Documents。在init-auctex
中添加
;; Query for master file.
(setq-default TeX-master nil)
之后,在文檔中鍵入編譯命令時(shí),emacs會(huì)首先判斷當(dāng)前正在編輯的文檔是否為主文檔。如果不是,則詢(xún)問(wèn)主文檔的位置。指定后,emacs自動(dòng)將該位置添加到文檔末尾,以備后續(xù)調(diào)用,比如:
%%% Local Variables:
%%% mode: latex
%%% TeX-master: "master"
%%% End:
對(duì)應(yīng)主文檔名為master.tex
。如果手動(dòng)添加上述命令到文檔結(jié)尾,記得重新打開(kāi)該文檔,讓上述文件變量生效。
另外,這一步也是RefTex、Forward-Invserse Search等功能在多文件文檔中能正常工作的前提。
自動(dòng)執(zhí)行多步編譯
使用Arara,在init-auctex
中添加
(eval-after-load "tex"
'(add-to-list 'TeX-command-list
'("Arara" "arara %s" TeX-run-TeX nil t :help "Run Arara.")))
參見(jiàn)Arara integration in Emacs。然后在需要編譯的主文檔頂部添加需要順序執(zhí)行的指令。比如
% arara: pdflatex
% arara: bibtex
% arara: pdflatex
% arara: pdflatex
\documentclass {article}
...
配置好后,編譯文檔時(shí),鍵入C-c C-c arara
即可。
注:
- Arara是Latex的擴(kuò)展包,TexLive2014默認(rèn)集成。
- 使用Arara編譯文檔報(bào)錯(cuò)后調(diào)試Bug時(shí),按<code>C-c `</code>會(huì)打開(kāi)一個(gè)名叫 "runscript.tlu"的文件。千萬(wàn)別改里面的代碼。emacs打開(kāi)這個(gè)文件只是為了提示你哪一步出錯(cuò)了。如果不小心改了代碼,網(wǎng)上可以湊到源文件。替換回來(lái)即可。
Forward-Inverse Search
寫(xiě)完長(zhǎng)長(zhǎng)的一篇Latex文檔,想在預(yù)覽PDF時(shí)讓閱讀器自動(dòng)定位到光標(biāo)所在的位置,怎么辦?預(yù)覽PDF時(shí),發(fā)現(xiàn)某個(gè)地方需要修改,如何在tex文檔中自動(dòng)定位相關(guān)位置?如標(biāo)題所示,這兩個(gè)功能的名字分別叫Forward Search和Inverse Search,需要PDF閱讀器的支持。啟用需兩個(gè)步驟。
開(kāi)啟同步。
參考Forward and Inverse Search。我使用的是synctex方法,需Latex擴(kuò)展包SyncTeX。
這一步是為了讓編譯器自動(dòng)生成一個(gè).synctex.gz
文檔,里面包含了PDF和Tex源碼之間位置上的對(duì)應(yīng)關(guān)系。開(kāi)啟PDF閱讀器支持。
我使用的是windows系統(tǒng)下的Sumatra。參考Sync Emacs AUCTeX with Sumatra PDF。
總結(jié)下,在init-auctex
添加
;; forward and inverse search
(setq TeX-source-correlate-mode t)
(setq TeX-source-correlate-method 'synctex)
(setq TeX-source-correlate-start-server t)
;; use Sumatra PDF to preview pdf
(eval-after-load 'tex
'(progn
(assq-delete-all 'output-pdf TeX-view-program-selection)
(add-to-list 'TeX-view-program-selection '(output-pdf "Sumatra PDF"))
))
注意替換Sumatra安裝路徑。
另外,需要讓Sumatra支持Inverse Search。Sumatra中,Settings->Options, 在set Set inverse search command line那里添加
c:\emacs\bin\emacsclient.exe" --no-wait +%l "%f
注意替換emacs路徑。
注:如果同Arara配合使用,需要配套使用{ synctex: on }
。參考1.1.2 Arara。比如,如果使用pdflatex
編譯文檔,那么應(yīng)該使用% arara: pdflatex: { synctex: on }
。另外,對(duì)于包含子文件的文檔,記得設(shè)置主文檔。
RefTex插入引用文獻(xiàn)
以bibtex為例。
默認(rèn)快捷鍵是C-c [
,如果無(wú)效,請(qǐng)使用C-h f reftex-citation
查閱綁定的快捷鍵。另外,多文檔文件,記得指定主文檔。也可直接調(diào)用函數(shù),M-x reftex-citation
。
第一步是在mini buffer中輸入需檢索的關(guān)鍵詞,如果留空則會(huì)返回文獻(xiàn)數(shù)據(jù)庫(kù)的全部?jī)?nèi)容。第二步,emacs會(huì)嘗試在右側(cè)新建一個(gè)臨時(shí)區(qū)域,名字為RefTex Select
,用以展示檢索結(jié)果。光標(biāo)自動(dòng)切換到該區(qū)域后,除了普通的移動(dòng)和選擇外,f
還可以繼續(xù)在左側(cè)打開(kāi)新窗口,瀏覽文獻(xiàn)數(shù)據(jù)庫(kù)中的完整信息,而且兩個(gè)窗口會(huì)保持同步滾動(dòng)。
另外,寫(xiě)論文時(shí)經(jīng)常需要以作者名加年份的方式引用,具體的引用格式稱(chēng)為Citation Style。參考Citation Styles,Latex中有許多包可以自定義格式的引用。假定使用natbib,希望以指令citet
、citep
的方式引用文獻(xiàn)。如果想借助RefTex自動(dòng)插入指令,需要將reftex-cite-format
改為natlib
。可以參考那篇文章中的操作步驟設(shè)置。設(shè)置好后,鍵入C-c [
會(huì)出現(xiàn)許多新選項(xiàng)。各選項(xiàng)對(duì)應(yīng)的效果可以參考Reference sheet for natbib usage。另外,latex主文檔中也應(yīng)進(jìn)行相應(yīng)設(shè)置,參考Natbib In-Text Citation displays (author?),即在具體調(diào)用bibtex的地方使用\bibliographystyle{plainnat}
。
其實(shí)更方便的是手動(dòng)輸入引用格式的代碼,比如\citep{}
,然后光標(biāo)移動(dòng)到{}
中,鍵入C-c [
引用文獻(xiàn),auctex會(huì)智能識(shí)別你已經(jīng)寫(xiě)好了引用的格式,而只插入文獻(xiàn)的索引關(guān)鍵詞。這點(diǎn)同引用label類(lèi)似。