AUCTeX を自動的に起動する方法 pythontex.py スクリプト

AUCTeX を自動的に起動する方法 pythontex.py スクリプト

LaTeX に結果を挿入する前に計算を行う必要がある場合は、非常に便利なパッケージを使用する必要がありますpythontex。次に例を示します。

\documentclass{article}
  \usepackage{pythontex}
  \begin{document}
    If we add five to eight we get \py{5+8}.
   \end{document}

C-c C-a私は、Emacs で AUCTeX を使用して LaTeX 文書をタイプセットすることに慣れています。文書をコンパイルするには、通常、AUCTeX マニュアルに記載されているAUCTeX コマンドにバインドされているキーを使用しますTeX-command-run-all

エラーが発生するか終了するまで、現在のドキュメントをコンパイルします。コンパイルが正常に終了した場合は、最後にビューアを実行します。

しかし、上記の例では次の結果が得られます。 ここに画像の説明を入力してください

ご覧のとおり、Python 計算の結果は ?? に置き換えられています。これは、pythontex パッケージのマニュアルに記載されているとおりです。

pythontex を使用してドキュメントをコンパイルするには、1) LaTeX 互換の tex エンジンを実行する、2) pythontex.py スクリプトを実行する、3) 最後に TeX エンジンを再度実行する、という 3 つの手順が必要です。

2 番目のステップはコマンドによって自動的に実行されないTeX-command-run-allため、Emacs を一時的に終了し、ターミナル (GNU/Linux を使用) を開いて と入力しpythontex <myfile.tex>、Emacs に戻って再度 を実行する必要がありますTeX-command-run-all。容易に想像できるように、これを 7 回繰り返すのはかなり面倒です。

質問TeX-command-run-all: AUCTeX を設定して、スクリプトを呼び出すと自動的に起動されるようにすればpythontex.py、ターミナルを使用してスクリプトを手動で実行する必要がなくなりますか?

答え1

AUCTeX のコマンドをハックするのではなく、独自のコマンドを定義することをお勧めします。 を介して実行する一連のシェル コマンドを定義できますTeX-command-sequence

(TeXコマンドシーケンス COMMAND &optional RESET FILE-FN)

COMMAND で定義された一連の TeX コマンドを実行します。

COMMAND引数は

  • nil: この場合はコマンドは実行されません

  • コマンドの文字列TeX-command-list

  • からのコマンドである文字列の非 nil リスト。 TeX-command-listリストの car は、 の最初の実行で実行されるコマンドとして使用されTeX-command-sequence、リストの cdr は次回の実行で関数に渡されます。

  • 関数名。 からのコマンドである文字列を返します TeX-command-list。これは funcall (引数なし) され、 の次回の実行時に再び使用されますTeX-command-sequence

  • その他の値の場合、関数はTeX-command-default停止条件が満たされるまで実行するコマンドを決定するために使用されます。

[...] オプション引数 RESET の値が nil 以外の場合、これは関数の最初の実行であり、いくつかの変数をリセットする必要があることを意味します。

PythonTeXしたがって、基本的な戦略は次のようになります。にエントリを追加し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)

これで、LaTeXファイルで実行するためのオプションができたはずです。そのため、 Pythonの実行が必要かどうかを確認するようにlatexmk設定する必要があります。(また、適切なフックを追加して、ファイルを編集するたびにこれが評価されるようにしました。)の著者は、latexmkpythontex(setq TeX-command-default "latexmk").texlatexmkサンプル設定ファイルで使用しますpythontex。インターネットで「latexmk pythontex」を検索することもできます。(私は pythontex を使用していないので、これについては保証できません。私は sagetex を使用しており、latexmkそれでうまく動作しているので、pythontex でも同様にうまく動作すると期待しています。)

関連情報