在我的.emacs
我有
'(TeX-PDF-mode t)
设置。所以我使用 PDFLaTeX。我不确定为什么现在这不是默认设置。我还设置了
'(LaTeX-command "latex -shell-escape")
事后看来,这是个坏主意,但直到我试图让 SyncTeX 工作时我才意识到这一点,但它却不行。后来我才意识到,因为我手动设置了 LaTeX 命令,所以我覆盖了
--synctex=1
通常会有这个选项。
这就引出了我的问题。
- 是否需要
LaTeX-command
修改命令来添加该-shell-escape
选项,如果是 - 添加选项的正确方法是什么
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 才有向编译器轻松添加选项的功能(至少我总是找不到它)。我认为至少有三种策略可以遵循:
- 编辑
LaTeX-command-style
(如果要为所有文档激活 shell 转义,建议使用此方法) - 添加新元素
TeX-engine-alist
- 添加新元素
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
为默认引擎
现在您可以将新的虚拟引擎设置为所有文档的默认引擎
- 通过自定义
TeX-engine
(M-xcustomize-varaiable
RETTeX-engine
RET)并Default with shell escape
在下拉菜单中选择Value Menu
,或 - 通过取消注释(即删除
;;
开头的)
(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命令,所以要小心。