在 Emacs 中生活惯了的人,比如我,慢慢会形成什么文本编辑都要在Emacs中进行的习惯和需求。如果有什么文本编辑非得到其他编辑器里面干,就会心里痒痒浑身不舒服。这估计也是一种病吧。 LaTeX 也是如此。特别是,在Emacs中还有 AucTeX 这样的神器,就更有理由把这个工具链搭配好,来享受行云流水般的工作快感和 心流。
注:关于 AucTeX 的强大功能,参见其示例网页 https://www.gnu.org/software/auctex/screenshots.html
熟悉 LaTeX 工作流程的同学可能知道,如果 LaTeX 里面没有引用参考文献,那么编译起来可谓一泻千里。如果你开始用 bibtex 并不断往 tex 文件里添加引用参考文献(~~学术狗的日常!),那么你经常性的要反复交替运行 latex (或 pdflatex)和 bibtex 以解决 aux、bbl、tex 等文件的互相依赖问题。
有些情况下,这个过程可以达到令人发指的十几遍。 这个时候,make 工具的威力就显现出来了:如同对有些计算机语言程序的编译和链接过程,make 工具可以递归地、一遍遍自动调用 latex 和 bibtex,直到输出文件最终稳定。
一个用于 Emacs-LaTeX 工作流的 makefile 脚本的例子
注意以下几个要点
LATEXOPTIONS = -src-specials -interaction=nonstopmode
PDFVIEWER = sumatrapdf -reuse-instance -inverse-search "c:\emacs\bin\emacsclientw.exe +%l \"%f\""
BIBOPTIONS = -include-directory=$(BIBDIR) 及 vpath
如果需要 pdf 文件也具备逆向搜索功能, 即,通过点击 pdf 文件中的字段访问 tex 文件中的字段 (如同在 DVI 文件里一样), 你需要在 tex 文件头部加入 /usepackage{pdfsync}
REBUILDABLES 里列出了可以被自动清除的文件的扩展名 -- 运行 make clean 把它们都清理掉。
#+NAME: makefile 脚本具体内容
#+BEGIN_SRC makefile
MAIN=maintex
EPS=img/*.eps
TEX=tomo_spectra.tex
BIB=da.bib
REBUILDABLES = \
*.log \
*.blg \
*.bbl \
*.aux \
*.lof \
*.lot \
LATEXOPTIONS = -src-specials -interaction=nonstopmode
PDFVIEWER = sumatrapdf -reuse-instance -inverse-search "c:\emacs\bin\emacsclientw.exe +%l \"%f\""
BIBDIR = "C:/H/Bib"
BIBOPTIONS = -include-directory=$(BIBDIR)
vpath %.bib /cygdrive/c/H/Bib
viewpdf : $(MAIN).pdf
$(PDFVIEWER) $(MAIN).pdf &
dvi : $(MAIN).dvi
yap -1 $(MAIN).dvi
$(MAIN).pdf : $(MAIN).dvi
pdfclosem $(MAIN).pdf ; dvipdfm $(MAIN).dvi
$(MAIN).dvi : $(MAIN).bbl $(EPS)
latex $(LATEXOPTIONS) $(MAIN)
if ( grep 'Rerun' $(MAIN).log > /dev/null ) ; then\
latex $(LATEXOPTIONS) $(MAIN) ; \
else :; fi
$(MAIN).bbl : $(TEX)
rm -f $(MAIN).aux *.bbl; latex $(LATEXOPTIONS) $(MAIN); bibtex $(BIBOPTIONS) $(MAIN)
clean :
rm -f $(REBUILDABLES)
#+END_SRC
如果不用 make 和 makefile, 我们还可以使用 latex 系统原生的工具 latexmk
#+BEGIN_SRC shell-script
which latexmk
latexmk is /cygdrive/c/CTEX/MiKTeX/miktex/bin/latexmk
#+END_SRC
查看 latexmk 是否正常运行:
#+BEGIN_SRC shell-script
latexmk -v
Latexmk, John Collins, 5 February 2015. Version 4.43a
#+END_SRC
用下面的 samatrapdf 命令调用实现 pdf 文件的自动预览 (自动检测本地 pdf 文件变化并自动更新显示)。
sumatrapdf -reuse-instance paper.pdf
# for viewing pdf but not locking the file
alias pdfview='sumatrapdf -reuse-instance'
# for easily use latexmk
alias mklatex='latexmk -pvc -pdf'
# -f for non stop
alias mktex='latexmk -f -pvc -pdf -view=pdf'
我的 latexmk 的设置:
$pdf_previewer = 'sumatrapdf -reuse-instance %O %S';
$clean_ext = 'paux lox pdfsync out';
注意:
我在此文件中设定了 sumatrapdf 作为默认 pdf viewer
我在此文件中设定了 paux lox pdfsync out 等需要被自动清理的文件类型。

