LaTeX-command-style

LaTeX-command-style

在我的.emacs我有

'(TeX-PDF-mode t) 

设置。所以我使用 PDFLaTeX。我不确定为什么现在这不是默认设置。我还设置了

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

事后看来,这是个坏主意,但直到我试图让 SyncTeX 工作时我才意识到这一点,但它却不行。后来我才意识到,因为我手动设置了 LaTeX 命令,所以我覆盖了

--synctex=1

通常会有这个选项。

这就引出了我的问题。

  1. 是否需要LaTeX-command修改命令来添加该 -shell-escape选项,如果是
  2. 添加选项的正确方法是什么LaTeX-command

@David Carlisle 建议

(setq LaTeX-command (concat LaTeX-command " -shell-escape"))

这似乎是正确的,但是却给出了错误:

 Symbol's value as variable is void: LaTeX-command

注意:评估LaTeX-command只给出“latex”,因此这可能不是正确的附加内容。

答案1

从 AUCTeX 11.88 版本开始,您可以使用文件局部变量向 TeX 处理器添加一个选项TeX-command-extra-options

%%% TeX-command-extra-options: "-shell-escape"

作为手册中有说明,您必须手动将此变量作为局部变量安全地保存,因为它可能会打开安全漏洞。

笔记:这个问题启发了我添加这个功能。


直到版本 11.87,AUCTeX 才有向编译器轻松添加选项的功能(至少我总是找不到它)。我认为至少有三种策略可以遵循:

  1. 编辑LaTeX-command-style(如果要为所有文档激活 shell 转义,建议使用此方法)
  2. 添加新元素TeX-engine-alist
  3. 添加新元素TeX-command-list

我将尝试概述 1 和 2。3 在精神上与 2 相似。

笔记:在之前版本的答案中,我建议编辑LaTeX-command,但该变量应保留为实际的latex二进制名称。将其设置为latex -shell-escape不利于正向/反向搜索(对于好奇的人来说:TeX-source-correlate-determine-method会失败,因为没有latex -shell-escape二进制文件,因此正向/反向搜索将回退到源特殊情况,即使 SyncTeX 实际上可用)。


LaTeX-command-style

此变量允许更改传递给编译器的选项,但其语法有点麻烦。此外,这不是文件局部变量,因此您无法(默认情况下)根据每个文档设置它。

定制方式

问题M-x customize-variable RET LaTeX-command-style RET。在String变量的字段-shell-escape后添加%(latex)。例如,如果字段的值为

%(PDF)%(latex) %S%(PDFout)"

将其改为

%(PDF)%(latex) -shell-escape %S%(PDFout)"

为我做的方式

将以下代码添加到您的.emacs.

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

TeX-engine-alist

插入一个新元素,例如名为default-shell-escape,类似于default的元素TeX-engine-alist-builtin。您可以使用自定义界面或将 Elisp 代码添加到 来完成此操作.emacs

创建此新引擎后,您将能够使用菜单激活它Command > TeXing Options > Use Default with shell escape。如果您想为所有文档或每个文档默认设置它,请参见下文。

定制方式

问题M-x customize-variable RET TeX-engine-alist RET。按下INS按钮并按以下方式填写字段:

  • 象征:default-shell-escape
  • 姓名:Default with shell escape
  • 普通 TeX 命令:tex -shell-escape
  • LaTeX 命令:latex -shell-escape
  • ConTeXt 命令:留空

为我做的方式

将以下代码添加到您的.emacs

(eval-after-load "tex"
  '(progn
     (add-to-list
      'TeX-engine-alist
      '(default-shell-escape "Default with shell escape"
     "pdftex -shell-escape"
     "pdflatex -shell-escape"
     ConTeXt-engine))
     ;; (setq-default TeX-engine 'default-shell-escape)
     ))

将引擎设置default-shell-escape为默认引擎

现在您可以将新的虚拟引擎设置为所有文档的默认引擎

  1. 通过自定义TeX-engineM-x customize-varaiable RET TeX-engine RET)并Default with shell escape在下拉菜单中选择Value Menu,或
  2. 通过取消注释(即删除;;开头的)
(setq TeX-engine 'default-shell-escape)

前面 Elisp 代码中的行。

default-shell-escape根据每个文档使用引擎

default-shell-escape或者,您可以保留默认引擎,只在实际需要的文档中使用该引擎。在这些文档中,发出M-x add-file-local-variable RET TeX-engine default-shell-escape RET

答案2

为了总结@giordano 的答案以供 Elisp 初学者使用,您应该将其添加到 TeX 文档的底部:

% Local Variables:
% TeX-command-extra-options: "-shell-escape"
% End:

您应该将其添加到您的初始化文件中:

(with-eval-after-load 'tex
  (add-to-list 'safe-local-variable-values
               '(TeX-command-extra-options . "-shell-escape")))

为了在不重新启动 Emacs 的情况下使更改生效,您应该运行M-: (load user-init-file) RET然后M-x normal-mode在 TeX 缓冲区中输入。

请注意,对初始化文件的这一更改意味着使用 AUCTeX 编译恶意 TeX 代码可以运行任意shell命令,所以要小心。

相关内容