本文是《从零开始——Emacs 安装配置使用教程 2015》(简称《从零开始》)的姊妹篇,总结了我在这几个月中使用Auctex模式的经验。建议优先阅读《从零开始》,以理解安装配置emacs的基本操作。我使用Tex Live2014作为Latex的编译环境。本文并不以介绍Latex以及Auctex为重点,仅仅止于描述基本的使用场景。
Auctex简介
背景知识
本文以《从零开始》中使用的设置为基础,如需额外设置均有提及。
本文中,init-auctex
代表auctex的初始化文档。可以是一个独立的文件。如果你只有一个初始化文件,那么对应其中初始化auctex的部分。
emacs中,有些指令会在当前窗口的左侧或右侧调出一个临时区域,提供一个选项列表。一般光标会自动切换到这个区域中。其中,使用方向键或者n
、p
可以上下移动,RET
键确认选择。
LaTex快捷键
核心操作
编译文档
C-c C-c
对主文档执行各种命令,如编译、预览PDF等。如果没有额外设置,默认主文档为当前正在编辑的文档。比如,使用Latex编译当前文档,C-c C-c latex
。或者,预览当前文档,C-c C-c view
。预览PDF
C-c C-v
,相当于C-c C-c view
的快捷版。
其他操作
原则上,Latex源码可以用任何文档编辑器编写。使用emacs,只要知道编译和预览指令的快捷键,就足够应对一般需求了。但毕竟用的是大名鼎鼎的auctex模式,不去使用那些特色功能就太可惜了。
放大字体
C-x C-+
添加章节
C-c C-s
文档目录
C-c =
,体验非常赞。添加各类环境
一个环境以\begin{env name}
开始,以\end{env name}
结束。使用C-c C-e
来快速添加一个指定环境,比如C-c C-e equation
,并且可以快速指定相关属性,比如label。快速引用label
Latex中,许多地方都可以添加label属性,比如章节、公式块、图表等。C-c )
可以快速引用指定label。右侧会自动打开一个窗口,键入RET
选择以label名的形式引用,键入p
以页码的形式引用。接下来,程序会检索整个文档,生成引用数据,所以请稍微等一下。然后窗口顶部提示“SELECT A LABEL TYPE”,键入相关快捷键后,比如e
(equation),程序会列出文档中的全部有label的公式,选中后即可插入。另外,emacs会智能检测当前位置的文本环境。比如,如果你在单词“section”后面调用C-c )
,那么程序会直接列出所有的"section label"。"equation"、"figure"也有类似的效果。如果修改了源文档中的label,记得在列出所有label的窗口内键入r
来刷新label目录。
文献的引用比较特殊,参见RefTex插入引入文献。
更多功能,请参考RefTeX-in-a-Nutshell
- Auctex文档内预览Latex
auctex的核心功能之一。编辑完一个公式块后,只想预览公式本身编译的结果,而非整个文档,该功能便派上用场了。保证光标在公式块内,键入C-c C-p C-e
即可。这时,相应位置的Latex代码会被替换为渲染后的图片。光标进入到图片区域内部时,会显示Latex源码,移出源码区后,会显示图片,很方便吧?当然,修改过代码后,需要再次键入C-c C-p C-e
来重新生成图片。对于大文档,局部预览可以节省许多时间。
如果想要移除当前文档内的全部预览结果,键入C-c C-p C-c C-d
即可。
除了公式外,插入的图片、表格等,都可以预览。
进阶技巧
包含子文件的文档
编写较大的文档时,经常会使用\include
或者\input
命令来将主要章节分离为独立的文件。在编写这些子文档时,可不可以在键入编译或预览等命令时,让auctex自动定位主文档并执行命令?参见Multifile Documents。在init-auctex
中添加
;; Query for master file.
(setq-default TeX-master nil)
之后,在文档中键入编译命令时,emacs会首先判断当前正在编辑的文档是否为主文档。如果不是,则询问主文档的位置。指定后,emacs自动将该位置添加到文档末尾,以备后续调用,比如:
%%% Local Variables:
%%% mode: latex
%%% TeX-master: "master"
%%% End:
对应主文档名为master.tex
。如果手动添加上述命令到文档结尾,记得重新打开该文档,让上述文件变量生效。
另外,这一步也是RefTex、Forward-Invserse Search等功能在多文件文档中能正常工作的前提。
自动执行多步编译
使用Arara,在init-auctex
中添加
(eval-after-load "tex"
'(add-to-list 'TeX-command-list
'("Arara" "arara %s" TeX-run-TeX nil t :help "Run Arara.")))
参见Arara integration in Emacs。然后在需要编译的主文档顶部添加需要顺序执行的指令。比如
% arara: pdflatex
% arara: bibtex
% arara: pdflatex
% arara: pdflatex
\documentclass {article}
...
配置好后,编译文档时,键入C-c C-c arara
即可。
注:
- Arara是Latex的扩展包,TexLive2014默认集成。
- 使用Arara编译文档报错后调试Bug时,按
C-c `
会打开一个名叫 "runscript.tlu"的文件。千万别改里面的代码。emacs打开这个文件只是为了提示你哪一步出错了。如果不小心改了代码,网上可以凑到源文件。替换回来即可。
Forward-Inverse Search
写完长长的一篇Latex文档,想在预览PDF时让阅读器自动定位到光标所在的位置,怎么办?预览PDF时,发现某个地方需要修改,如何在tex文档中自动定位相关位置?如标题所示,这两个功能的名字分别叫Forward Search和Inverse Search,需要PDF阅读器的支持。启用需两个步骤。
开启同步。
参考Forward and Inverse Search。我使用的是synctex方法,需Latex扩展包SyncTeX。
这一步是为了让编译器自动生成一个.synctex.gz
文档,里面包含了PDF和Tex源码之间位置上的对应关系。开启PDF阅读器支持。
我使用的是windows系统下的Sumatra。参考Sync Emacs AUCTeX with Sumatra PDF。
总结下,在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
编译文档,那么应该使用% arara: pdflatex: { synctex: on }
。另外,对于包含子文件的文档,记得设置主文档。
RefTex插入引用文献
以bibtex为例。
默认快捷键是C-c [
,如果无效,请使用C-h f reftex-citation
查阅绑定的快捷键。另外,多文档文件,记得指定主文档。也可直接调用函数,M-x reftex-citation
。
第一步是在mini buffer中输入需检索的关键词,如果留空则会返回文献数据库的全部内容。第二步,emacs会尝试在右侧新建一个临时区域,名字为RefTex Select
,用以展示检索结果。光标自动切换到该区域后,除了普通的移动和选择外,f
还可以继续在左侧打开新窗口,浏览文献数据库中的完整信息,而且两个窗口会保持同步滚动。
另外,写论文时经常需要以作者名加年份的方式引用,具体的引用格式称为Citation Style。参考Citation Styles,Latex中有许多包可以自定义格式的引用。假定使用natbib,希望以指令citet
、citep
的方式引用文献。如果想借助RefTex自动插入指令,需要将reftex-cite-format
改为natlib
。可以参考那篇文章中的操作步骤设置。设置好后,键入C-c [
会出现许多新选项。各选项对应的效果可以参考Reference sheet for natbib usage。另外,latex主文档中也应进行相应设置,参考Natbib In-Text Citation displays (author?),即在具体调用bibtex的地方使用\bibliographystyle{plainnat}
。
其实更方便的是手动输入引用格式的代码,比如\citep{}
,然后光标移动到{}
中,键入C-c [
引用文献,auctex会智能识别你已经写好了引用的格式,而只插入文献的索引关键词。这点同引用label类似。