AUCTeX 自定义命令在新版本中损坏了吗?

AUCTeX 自定义命令在新版本中损坏了吗?

我喜欢将辅助文件放在单独的目录中,并使用以下针对 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-alistTeX-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),只需将其替换defaultluatex。在这种情况下,如果 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-localTeX-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

相关内容