用Auctex写Latex

本文是《从零开始——Emacs 安装配置使用教程 2015》(简称《从零开始》)的姊妹篇,总结了我在这几个月中使用Auctex模式的经验。建议优先阅读《从零开始》,以理解安装配置emacs的基本操作。我使用Tex Live2014作为Latex的编译环境。本文并不以介绍Latex以及Auctex为重点,仅仅止于描述基本的使用场景。

Auctex简介

背景知识

本文以《从零开始》中使用的设置为基础,如需额外设置均有提及。

本文中,init-auctex代表auctex的初始化文档。可以是一个独立的文件。如果你只有一个初始化文件,那么对应其中初始化auctex的部分。

emacs中,有些指令会在当前窗口的左侧或右侧调出一个临时区域,提供一个选项列表。一般光标会自动切换到这个区域中。其中,使用方向键或者np可以上下移动,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即可。
    除了公式外,插入的图片、表格等,都可以预览。

进阶技巧

包含子文件的文档

<a name="multifile"></a>编写较大的文档时,经常会使用\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即可。

注:

  1. Arara是Latex的扩展包,TexLive2014默认集成。
  2. 使用Arara编译文档报错后调试Bug时,按<code>C-c `</code>会打开一个名叫 "runscript.tlu"的文件。千万别改里面的代码。emacs打开这个文件只是为了提示你哪一步出错了。如果不小心改了代码,网上可以凑到源文件。替换回来即可。

Forward-Inverse Search

写完长长的一篇Latex文档,想在预览PDF时让阅读器自动定位到光标所在的位置,怎么办?预览PDF时,发现某个地方需要修改,如何在tex文档中自动定位相关位置?如标题所示,这两个功能的名字分别叫Forward SearchInverse Search,需要PDF阅读器的支持。启用需两个步骤。

  1. 开启同步。
    参考Forward and Inverse Search。我使用的是synctex方法,需Latex扩展包SyncTeX
    这一步是为了让编译器自动生成一个.synctex.gz文档,里面包含了PDF和Tex源码之间位置上的对应关系。

  2. 开启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,希望以指令citetcitep的方式引用文献。如果想借助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类似。

推荐阅读更多精彩内容