使用 AUCTeX 为特定文件定制 pdfLaTeX?

使用 AUCTeX 为特定文件定制 pdfLaTeX?

我正在尝试使用 TikZ“外部”库,自 PGF 2.10 起可用。这需要使用选项 -shell-escape 运行 pdfLaTeX。我通常使用选项从 AUCTeX 运行 pdfLaTeX

(TeX-PDF-mode t)

所以 Cc Cc 运行 pdfLaTeX。我可以在我的 LaTeX 文件中添加一行,以便 AUCTeX 知道只对此文件使用 -shell-escape 选项运行 pdfLaTeX,因为这显然是一个安全问题,并且默认情况下仅部分启用?我不知道这是否可行,但类似的事情是可能的。例如,请参阅 tex.sx 问题为特定文件强制使用不同的 TeX 引擎。如果可能的话,这可能会使用文件变量。

如果没有,我知道可以对 .emacs 中的所有文件进行全局自定义。目前,我也不确定如何做到这一点。最好通过 Mx customize,但我发现这些菜单相当混乱

例如http://thread.gmane.org/gmane.emacs.auctex.general/538David Kastrup 似乎认为每个文件的方法都是可行的。例如:

“无论如何,您可以使用文件变量部分来更改您想要的文件中命令。”

另请参阅http://thread.gmane.org/gmane.emacs.auctex.general/710

更新:基于来自 auctex 邮件列表的输入,这里的人建议的答案应该有效。不清楚为什么它不起作用,但问题可能特定于 Debian 软件包。Marcus Frings 向我指出他的错误报告在上述帖子中。底线是 Debian 软件包似乎存在问题,它在 vanilla auctex 中不存在,而且没人知道原因。维护者本应调查此事,但不幸的是,他对此毫无兴趣。

答案1

请注意,在 TL10 中,使用 允许进行有限的 FS 访问而无需 shell 转义\write18。Miktex 可能有类似的东西。

我将以下内容添加到始终需要进行 shell 转义的文件中。

%%% LaTeX-command: "latex -shell-escape"

我的 .emacs 中还有以下代码片段,用于随时添加 shell 转义:

;; toggle shell escape using C-c C-t C-x
(defun TeX-toggle-escape nil (interactive)
  "Toggle Shell Escape"
  (setq LaTeX-command
    (if (string= LaTeX-command "latex") "latex -shell-escape" "latex")))
(add-hook 'LaTeX-mode-hook
      (lambda nil
        (local-set-key (kbd "C-c C-t x") 'TeX-toggle-escape)))

编辑:这是一个更好的功能,它可以告诉您发生了什么:

;; toggel shell escape using C-c C-t C-x
(defun TeX-toggle-escape nil (interactive)
"Toggle Shell Escape"
(setq LaTeX-command
  (if (string= LaTeX-command "latex") "latex -shell-escape"
    "latex"))
(message (concat "shell escape "
         (if (string= LaTeX-command "latex -shell-escape")
         "enabled"
           "disabled"))
     ))
(add-hook 'LaTeX-mode-hook
      (lambda nil
    (local-set-key (kbd "C-c C-t x") 'TeX-toggle-escape)))

答案2

全局自定义是通过输入

M-x customize-variable RET LaTeX-command RET

(正如 David Kastrup 所描述的http://thread.gmane.org/gmane.emacs.auctex.general/538)并更改 LaTeX 命令变量。他没有说应该将变量更改为什么,但答案来自默认值,即

latex

latex -shell-escape

如果设置并保存了它,它将在 .emacs 中显示为

(LaTeX-command "latex -shell-escape")

custom-set-variables列表中。

我仍然不知道如何根据每个文件执行此操作。

更新:前面的设置方法对我来说latex-command不起作用xelatex,但是这是对“使用 minted(源代码 LaTeX 包)和 emacs/auctex”的回答确实如此,即添加

(eval-after-load "tex" 
  '(setcdr (assoc "LaTeX" TeX-command-list)
          '("%`%l%(mode) -shell-escape%' %t"
          TeX-run-TeX nil (latex-mode doctex-mode) :help "Run LaTeX")
    )
  )

到您的.emacs文件中。

当然,使用局部变量设置每个文件比这两种方法都更好,因为-shell-escape不需要全局启用。

答案3

解决方案 1:使用局部变量。在要允许使用 shell 转义的 LaTeX 文件末尾插入以下内容:

%%% Local Variables:
%%% LaTeX-command: "latex -shell-escape"
%%% End:

请注意,这仅在文件在 emacs 中关闭并重新打开后才适用。(您需要“本地变量:”和“结束:”行)。

解决方案 2:使用 LaTeX-command-style 自动为使用 pgf 包的每个文件启用 shell 转义(有点危险?)。将以下内容放入 .emacs 中:

(setq LaTeX-command-style
  '(("^pgf$" "%(PDF)%(latex) -shell-escape %S%(PDFout)")
    ("" "%(PDF)%(latex) %S%(PDFout)")))

您也可以使用 emacs 定制系统进行设置。

答案4

Hendrik Vogt 的解决方案 1 对我来说不再有效(emacs 23.3.1,AUCTeX 版本 11.86)。相反,我使用 synctex 标志:

%%% Local Variables:
%%% TeX-source-correlate-mode: t
%%% TeX-synctex-tex-flags: "-synctex=1 -shell-escape"
%%% End:

相关内容