我喜欢将辅助文件放在单独的目录中,并使用以下针对 emacs/AUCTeX 的定制:
\documentclass{article}
\begin{document}
Hello world!
\end{document}
%%% Local Variables:
%%% mode: latex
%%% LaTeX-command: "pdflatex -synctex=-1 -aux-directory auto %s"
%%% End:
这对于 emacs 24.3.1 和 AUCTeX 11.86 来说运行良好。但是在新机器上,我使用 emacs 25.3.1 和 AUCTeX 12.1,使用 调用 LaTeX 会C-c C-C
产生以下结果(文件为test.tex
):
Running `LaTeX' on `test' with
``pdfpdflatex -synctex=-1 -aux-directory auto "test" -file-line-error --synctex=1 -interaction=nonstopmode "\input" "test.tex"''
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
显然,我的自定义命令LaTeX-command
被插入到了另一个 LaTeX 命令中,替换了 pdflatex 中的“latex”,这当然会出错。我找不到另一个(默认?)LaTeX 命令的定义位置。
我可以通过将自定义更改为 来解决这个问题%%% LaTeX-command: "latex -aux-directory auto"
,但这似乎是一个奇怪的黑客行为,而且它在我使用的另一台机器上不起作用。有没有更聪明的方法可以做到这一点?
答案1
LaTeX-command
我认为,为了指定要使用而进行调整并不符合 AUCTeX 的精神pdflatex
。AUCTeX 了解 TeX 引擎,并知道如何根据引擎激活 DVI 或 PDF 模式。请参阅处理器选项的文档,特别是关于TeX-engine
和:TeX-engine-alist
TeX-PDF-mode
命令:TeX-PDF-mode
(Cc Ct Cp)此命令切换 AUCTeX 的 PDF 模式,这是一种默认启用的缓冲区本地次要模式。您可以自定义 TeX-PDF-mode 以赋予其不同的默认值,或将其设置为每个文档的文件本地变量。此选项通常会导致调用 PDFTeX 或普通 TeX。
[...]
用户选项:TeX-engine
此变量允许您选择使用哪个 TeX 引擎来排版文档,即调用“TeX”或“LaTeX”命令时将使用的可执行文件。该值应为 TeX-engine-alist-builtin 或 TeX-engine-alist 中定义的符号之一。内置列表中的符号“default”、“xetex”、“luatex”和“omega”可用。
[...]
用户选项:TeX-engine-alist
TeX 引擎和相关命令的列表。每个条目都是一个最多包含五个元素的列表。第一个元素是用于标识引擎的符号。第二个是描述引擎的字符串。第三个是用于纯 TeX 的命令。第四个是用于 LaTeX 的命令。第五个是用于 ConTeXt 的“texexec”程序的“--engine”参数的命令。每个命令都可以是变量或字符串。空字符串或 nil 表示没有可用的命令。
如果你只是想改变当前文档的引擎或 PDF 与 DVI 模式,最简单的方法可能是使用命令 → TeXing 选项菜单,否则对于此处提到的特定选项(-synctex=-1 -aux-directory auto
),我相信以下变量是合适的:
用户选项:TeX-command-extra-options
带有要提供给 TeX 处理器的额外选项的字符串。例如,如果您需要启用 shell 转义功能来编译文档,请将以下行添加到源文件的局部变量列表中:
%%% TeX-command-extra-options: "-shell-escape"
默认情况下,此选项作为文件局部变量并不安全,因为启用 shell 转义后编译的特制文档可用于恶意目的。
在您的特定情况下,如果您确实想使用 Emacs 文件变量自定义您给出的参数,您可以使用以下命令:
%%% Local Variables:
%%% TeX-PDF-mode: t
%%% TeX-engine: default
%%% TeX-command-extra-options: "-synctex=-1 -aux-directory=auto"
%%% End:
例如,如果你想使用 LuaTeX 引擎而不是默认引擎(对于 LaTeX 文档,通常是 pdfTeX),只需将其替换default
为luatex
。在这种情况下,如果 AUCTeX 检测到你有一个 LaTeX 文档,它将使用命令对其进行编译lualatex
,这要归功于TeX-engine-alist-builtin
,它为你没有通过 覆盖的内容提供了默认值TeX-engine-alist
:
TeX-engine-alist-builtin is a variable defined in ‘tex.el’.
Its value is
((default "Default" TeX-command LaTeX-command ConTeXt-engine)
(xetex "XeTeX" "xetex" "xelatex" "xetex")
(luatex "LuaTeX" "luatex" "lualatex --jobname=%s" "luatex")
(omega "Omega" TeX-Omega-command LaTeX-Omega-command ConTeXt-Omega-engine))
Documentation:
Alist of built-in TeX engines and associated commands.
For a description of the format see ‘TeX-engine-alist’.
但对于 DVI 与 PDF 模式的选择,我相信我宁愿使用命令 → TeXing 选项菜单或使用 Emacs 配置中的类似以下命令全局设置模式:
;; Use nil for DVI mode
(setq-default TeX-PDF-mode t)
下面的方法也可以工作,但是如果你在启动 Emacs 时打开了许多 TeX 文件,那么效率会较低,因为每次都会为每个 TeX/LaTeX/etc 文件运行该钩子:
(add-hook 'TeX-mode-hook
#'(lambda ()
(TeX-global-PDF-mode t)))
如果您在 Emacs 中使用 desk.el,请注意它会保存和恢复变量的缓冲区局部值。当测试 Emacs 的 init 配置处理设置时自动为缓冲区局部的变量时,这可能会非常令人困惑(TeX-PDF-mode
就是其中之一,因此这适用于此处)。
附录
为了让 AUCTeX 使用与您的目录不同auto
且明确属于 AUCTeX 的目录,您可能需要自定义TeX-auto-local
和TeX-style-local
。我使用类似这样的内容:
(defun my-TeX-mode-hook ()
(setq TeX-auto-local "auctex-auto"
TeX-style-local "auctex-style")
;; Use the new dirs in `TeX-style-path' instead of the default ones,
;; otherwise AUCTeX won't find them.
(mapc #'(lambda (arg)
(when (member (car arg) TeX-style-path)
(delete (car arg) TeX-style-path)
(push (cdr arg) TeX-style-path)))
'(("auto" . "auctex-auto")
("style" . "auctex-style"))))
(add-hook 'TeX-mode-hook 'my-TeX-mode-hook)
但是,由于它有点复杂,您可能宁愿选择将您的名称重命名为其他名称,或者接受有一天 AUCTeX 在那里写入的内容与您使用可能导致在那里写入的auto
内容之间可能会发生冲突的可能性(如果仅与文件有关,则可能是安全的)。-aux-directory
-aux-directory
.aux