如何让AUCTeX自动启动pythontex.py脚本

如何让AUCTeX自动启动pythontex.py脚本

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 的非零值意味着这是该函数的第一次运行,并且需要重置一些变量。

因此,基本策略是:为PythonTeXto添加一个条目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 配合得也一样好。)

相关内容