So lassen Sie AUCTeX das Skript pythontex.py automatisch starten

So lassen Sie AUCTeX das Skript pythontex.py automatisch starten

Ich muss das pythontexPaket verwenden, das ich sehr nützlich finde, wenn jemand einige Berechnungen durchführen muss, bevor er die Ergebnisse in LaTeX einfügt. Hier ist also ein Beispiel:

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

Ich bin es gewohnt, meine LaTeX-Dokumente in Emacs mit AUCTeX zu setzen. Zum Kompilieren des Dokuments verwende ich im Allgemeinen die Tasten , die an den im AUCTeX-Handbuch beschriebenen C-c C-aAUCTeX-Befehl gebunden sind :TeX-command-run-all

Kompilieren Sie das aktuelle Dokument, bis ein Fehler auftritt oder es abgeschlossen ist. Wenn die Kompilierung erfolgreich abgeschlossen ist, führen Sie den Viewer am Ende aus.

Aber mit dem oben angegebenen Beispiel erhalte ich dieses Ergebnis: Bildbeschreibung hier eingeben

Wie wir sehen, wurde das Ergebnis der Python-Berechnung durch ?? ersetzt. Dies liegt daran, dass im Pythontex-Pakethandbuch Folgendes beschrieben wird:

Das Kompilieren eines Dokuments mit Pythontex umfasst drei Schritte: 1) Ausführen einer LaTeX-kompatiblen Tex-Engine; 2) Ausführen des Skripts pythontex.py; 3) und abschließend erneutes Ausführen der TeX-Engine.

Der zweite Schritt wird vom TeX-command-run-allBefehl nicht automatisch ausgeführt, daher muss ich Emacs kurzzeitig verlassen, ein Terminal öffnen (ich verwende GNU/Linux), eingeben pythontex <myfile.tex>und dann zu Emacs zurückkehren, um erneut auszuführen TeX-command-run-all. Wie wir uns leicht vorstellen können, ist es ziemlich mühsam, dies sieben Mal zu tun.

Die Frage: Wie konfiguriere ich AUCTeX so, dass TeX-command-run-alldas pythontex.pySkript beim Aufruf automatisch gestartet wird, sodass ich kein Terminal mehr verwenden und das Skript manuell ausführen muss?

Antwort1

Ich schlage vor, dass Sie die Befehle von AUCTeX nicht ändern, sondern Ihre eigenen definieren. Sie können eine Reihe von Shell-Befehlen definieren, die über ausgeführt werden sollen TeX-command-sequence.

(TeX-Befehlsfolge COMMAND &optional RESET FILE-FN)

Führen Sie eine durch COMMAND definierte Folge von TeX-Befehlen aus.

Das Argument COMMAND kann sein

  • nil: in diesem Fall wird kein Befehl ausgeführt

  • eine Zeichenfolge mit einem Befehl vonTeX-command-list

  • eine von Null verschiedene Liste von Zeichenfolgen, die Befehle von sind TeX-command-list; der Wert von car der Liste wird als Befehl verwendet, der beim ersten Durchlauf von ausgeführt werden soll TeX-command-sequence, der Wert von cdr der Liste wird beim nächsten Durchlauf an die Funktion übergeben usw.

  • ein Funktionsname, der einen String zurückgibt, der ein Befehl von ist TeX-command-list; er wird (ohne Argumente!) aufgerufen und beim nächsten Durchlauf von erneut verwendet TeX-command-sequence.

  • Mit jedem anderen Wert TeX-command-defaultwird die Funktion verwendet, um den auszuführenden Befehl zu bestimmen, bis eine Stoppbedingung erfüllt ist.

[...] Ein von Null verschiedener Wert für das optionale Argument RESET bedeutet, dass dies der erste Durchlauf der Funktion ist und einige Variablen zurückgesetzt werden müssen.

Die grundlegende Strategie lautet also: Fügen Sie einen Eintrag für PythonTeXhinzu TeX-command-list, definieren Sie eine private Funktion, die Ihr Dokument speichert und TeX-command-sequenceentsprechend ausgeführt wird, binden Sie diese private Funktion im LaTeX-Modus an einen Schlüssel und führen Sie sie dann aus.

(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)))

Antwort2

ich denke, dasslatexmkist für solche Situationen konzipiert. Es ist in einigen TeX-Distributionen enthalten, Sie haben es also vielleicht schon. Wenn es richtig konfiguriert ist, müssen Sie es nur einmal ausführen. Es erkennt dann automatisch, ob Python ausgeführt werden muss, führt es aus und führt LaTeX bei Bedarf erneut aus. Wenn Sie es haben latexmk, führen Sie in Emacs aus M-x customize-group AUCTeX. Wählen Sie dann TeX Commandund passen Sie in diesem Menü an TeX-command-list: Fügen Sie eine Zeile hinzu

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

Jetzt sollten Sie eine Option zum Ausführen latexmkauf Ihren LaTeX-Dateien haben, also müssen Sie konfigurieren, latexmkum zu prüfen, ob pythontexdie Ausführung von Python erforderlich ist. (Ich füge auch (setq TeX-command-default "latexmk")einen entsprechenden Hook hinzu, damit dies jedes Mal ausgewertet wird, wenn ich eine Datei bearbeite .tex.) Der Autor von latexmkhat einenBeispielkonfigurationsdateizur Verwendung mit pythontex. Sie können auch im Internet nach „latexmk pythontex“ suchen. (Ich verwende Pythontex nicht, daher kann ich dafür nicht bürgen. Ich verwende Sagetex, und latexmkdamit funktioniert es wunderbar, daher würde ich erwarten, dass es mit Pythontex genauso gut funktioniert.)

verwandte Informationen