![如何让AUCTeX自动启动pythontex.py脚本](https://linux22.com/image/399919/%E5%A6%82%E4%BD%95%E8%AE%A9AUCTeX%E8%87%AA%E5%8A%A8%E5%90%AF%E5%8A%A8pythontex.py%E8%84%9A%E6%9C%AC.png)
pythontex
如果有人需要在将结果插入 LaTeX 之前进行一些计算,我需要使用我发现非常有用的包。以下是一个例子:
\documentclass{article}
\usepackage{pythontex}
\begin{document}
If we add five to eight we get \py{5+8}.
\end{document}
C-c C-a
我习惯使用 AUCTeX 在 Emacs 中排版我的 LaTeX 文档。为了编译文档,我通常使用与 AUCTeX 命令绑定的键,TeX-command-run-all
如 AUCTeX 手册中所述:
编译当前文档,直到出现错误或完成。如果编译成功完成,则最后运行查看器。
我们可以看到,python 计算的结果已被 ?? 替换。这是因为如 pythontex 包手册中所述:
使用 pythontex 编译文档包括三个步骤:1)运行与 LaTeX 兼容的 tex 引擎;2)运行 pythontex.py 脚本;3)最后再次运行 TeX 引擎。
第二步不是由TeX-command-run-all
命令自动执行的,所以我需要暂时离开 Emacs,打开一个终端(我在 GNU/Linux 上)并输入pythontex <myfile.tex>
,然后返回 Emacs 再次运行TeX-command-run-all
。我们可以很容易地想象,这样做七次会有些痛苦。
问题:如何配置 AUCTeX,以便当我调用TeX-command-run-all
脚本时pythontex.py
自动启动,这样就不再需要使用终端并手动执行脚本?
答案1
我建议你不要修改 AUCTeX 的命令,而是定义你自己的命令。你可以定义一系列 shell 命令通过 来运行TeX-command-sequence
。
(TeX 命令序列 COMMAND 和可选的 RESET FILE-FN)
运行由 COMMAND 定义的一系列 TeX 命令。
COMMAND 参数可能是
nil
:在这种情况下不会运行任何命令带有来自的命令的字符串
TeX-command-list
一个非零的字符串列表,它们是来自的命令
TeX-command-list
;列表的 car 用作在第一次运行中执行的命令TeX-command-sequence
,列表的 cdr 将在下一次运行中传递给函数,等等。一个函数名,返回一个来自的命令字符串
TeX-command-list
;它将被调用(不带参数!)并在下一次运行中再次使用TeX-command-sequence
。与任何其他值一起,该函数
TeX-command-default
用于确定要运行的命令,直到满足停止条件。[...] 可选参数 RESET 的非零值意味着这是该函数的第一次运行,并且需要重置一些变量。
因此,基本策略是:为PythonTeX
to添加一个条目TeX-command-list
,定义一个保存文档并TeX-command-sequence
适当运行的私有函数,将这个私有函数绑定到 LaTeX 模式下的某个键,然后运行它。
(with-eval-after-load "tex"
(add-to-list 'TeX-command-list
'("PythonTeX" "pythontex %s" TeX-run-command nil (latex-mode)
:help "Run PythonTeX script")
t))
(defun my/TeX-run-TeX-pythontex ()
"Save current master file, run LaTeX, PythonTeX and start the viewer."
(interactive)
(unless (featurep 'tex-buf)
(require 'tex-buf))
(TeX-save-document (TeX-master-file))
(TeX-command-sequence '("LaTeX" "PythonTeX" "LaTeX" "View")
t))
(add-hook 'LaTeX-mode-hook
(lambda ()
(local-set-key (kbd "C-c p") #'my/TeX-run-TeX-pythontex)))
答案2
我觉得latexmk是为这种情况而设计的。它包含在一些 TeX 发行版中,因此您可能已经拥有它。正确配置后,您只需运行一次,它就会自动检测是否需要运行 Python,然后运行它,并在需要时重新运行 LaTeX。无论如何,一旦您拥有latexmk
,在 Emacs 中运行M-x customize-group AUCTeX
。然后选择TeX Command
,并在该菜单中自定义TeX-command-list
:添加一行
("latexmk" "latexmk %t" TeX-run-command nil t)
现在你应该有一个在 LaTeX 文件上运行的选项latexmk
,因此你需要配置latexmk
来检查是否pythontex
需要运行 Python。(我还添加了(setq TeX-command-default "latexmk")
一个适当的钩子,这样每当我编辑文件时都会对其进行评估.tex
。)latexmk
提供了一个示例配置文件供使用pythontex
。您也可以在互联网上搜索“latexmk pythontex”。(我不使用 pythontex,所以我不能保证这一点。我使用 sagetex,并且latexmk
与它配合得很好,所以我希望它与 pythontex 配合得也一样好。)