如何讓 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}

我習慣使用 AUCTeX 在 Emacs 中排版 LaTeX 文件。為了編譯文檔,我通常使用與AUCTeX 手冊中描述的C-c C-aAUCTeX 命令綁定的鍵,如下所示:TeX-command-run-all

編譯目前文檔,直到出現錯誤或完成。如果編譯成功完成,最後執行檢視器。

但透過上面提供的範例,我得到以下結果: 在此輸入影像描述

我們可以看到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-命令序列命令和可選的重置檔案-FN)

執行 COMMAND 定義的一系列 TeX 命令。

COMMAND 參數可以是

  • nil:在這種情況下不會執行任何命令

  • 帶有命令的字串TeX-command-list

  • 一個非零的字串列表,它們是來自 TeX-command-list;的命令列表中的 car 作為第一次運行時執行的命令TeX-command-sequence,列表中的 cdr 將在下次運行時傳遞給函數,等等。

  • 一個函數名,傳回一個來自命令的字串 TeX-command-list;它將被 funcall'd(不帶參數!)並在下一次運行中再次使用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

我覺得乳膠就是針對這種情況而設計的。它包含在某些 TeX 發行版中,因此您可能已經擁有它。一旦配置正確,您只需運行一次,它就會自動檢測是否需要運行 Python,運行它,然後在需要時重新運行 LaTeX。不管怎樣,一旦你latexmk在 Emacs 中運行了M-x customize-group AUCTeX.然後選擇TeX Command,並在該選單中自訂TeX-command-list:新增一行

("latexmk" "latexmk %t" TeX-run-command nil t)

現在您應該可以選擇latexmk在 LaTeX 檔案上運行,因此您需要配置latexmk以檢查是否pythontex需要運行 Python。 (我還添加了(setq TeX-command-default "latexmk")一個適當的鉤子,以便每當我編輯文件時都會對其進行評估.tex。)的作者latexmk提供了一個範例設定檔與 一起使用pythontex。您也可以在網路上搜尋“latexmk pythontex”。 (我不使用 pythontex,所以我不能保證這一點。我使用 sagetex,並且可以latexmk很好地使用它,所以我希望它能夠與 pythontex 同樣良好地工作。)

相關內容