Cómo permitir que AUCTeX inicie automáticamente el script pythontex.py

Cómo permitir que AUCTeX inicie automáticamente el script pythontex.py

Necesito usar el pythontexpaquete que me parece muy útil si alguien tiene que hacer algún cálculo antes de insertar los resultados en LaTeX. Entonces aquí hay un ejemplo:

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

Estoy acostumbrado a componer mis documentos LaTeX en Emacs con AUCTeX. Para compilar el documento generalmente uso las claves C-c C-aque están vinculadas al comando AUCTeX TeX-command-run-alldescrito en el manual de AUCTeX como:

Compile el documento actual hasta que ocurra un error o esté finalizado. Si la compilación finaliza correctamente, ejecute el visor al final.

Pero con el ejemplo proporcionado arriba obtengo este resultado: ingrese la descripción de la imagen aquí

Como podemos ver, el resultado del cálculo de Python ha sido reemplazado por ?? . Esto se debe a que, como se describe en el manual del paquete pythontex:

Compilar un documento con pythontex implica tres pasos: 1) ejecutar un motor tex compatible con LaTeX; 2) ejecutar el script pythontex.py; 3) y finalmente ejecutar nuevamente el motor TeX.

El segundo paso no lo realiza automáticamente el TeX-command-run-allcomando, por lo que necesito salir momentáneamente de Emacs, abrir una terminal (estoy en GNU/Linux) y escribir pythontex <myfile.tex>, y regresar a Emacs para ejecutarlo nuevamente TeX-command-run-all. Como podemos imaginar fácilmente, es algo doloroso hacer esto siete veces.

La pregunta: ¿Cómo configurar AUCTeX de manera que cuando llame TeX-command-run-allel pythontex.pyscript se inicie automáticamente para que ya no sea necesario usar una terminal y ejecutar el script manualmente?

Respuesta1

Le sugiero que no piratee los comandos de AUCTeX sino que defina uno propio. Puede definir una serie de comandos de shell para ejecutar a través de TeX-command-sequence.

(Comando TeX-command-sequence y RESTABLECER ARCHIVO-FN opcional)

Ejecute una secuencia de comandos TeX definidos por COMMAND.

El argumento COMMAND puede ser

  • nil: en este caso no se ejecutará ningún comando

  • una cadena con un comando deTeX-command-list

  • una lista no nula de cadenas, que son comandos de TeX-command-list; el auto de la lista se usa como comando a ejecutar en la primera ejecución TeX-command-sequence, el cdr de la lista se pasará a la función en la siguiente ejecución, etc.

  • un nombre de función, que devuelve una cadena cuyo comando es TeX-command-list; se llamará de manera funcional (¡sin argumentos!) y se usará nuevamente en la próxima ejecución de TeX-command-sequence.

  • con cualquier otro valor, la función TeX-command-defaultse utiliza para determinar el comando a ejecutar, hasta que se cumpla una condición de parada.

[...] Un valor distinto de nulo para el argumento opcional RESET significa que esta es la primera ejecución de la función y algunas variables deben restablecerse.

Entonces, la estrategia básica es: agregar una entrada para PythonTeX, TeX-command-listdefinir una función privada que guarde su documento y se ejecute TeX-command-sequenceapropiadamente, vincule esta función privada a una clave en modo LaTeX y luego ejecútela.

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

Respuesta2

Creo quelátexestá diseñado para este tipo de situación. Está incluido en algunas distribuciones de TeX, por lo que es posible que ya lo tengas. Una vez que esté configurado correctamente, solo debería ejecutarlo una vez y automáticamente detectará si es necesario ejecutar Python, lo ejecutará y luego volverá a ejecutar LaTeX si es necesario. De todos modos, una vez que lo tenga latexmk, en Emacs, ejecute M-x customize-group AUCTeX. Luego elija TeX Commandy dentro de ese menú, personalice TeX-command-list: agregue una línea

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

Ahora debería tener una opción para ejecutar latexmksus archivos LaTeX, por lo que debe configurarlo latexmkpara verificar si pythontexes necesario ejecutar Python. (También agrego (setq TeX-command-default "latexmk")un enlace apropiado para que se evalúe cada vez que edito un .texarchivo). El autor de latexmkha proporcionado unarchivo de configuración de muestrapara usar con pythontex. También puedes hacer una búsqueda en Internet de "latexmk pythontex". (No uso pythontex, así que no puedo garantizar esto. Uso sagetex y latexmkfunciona muy bien con eso, por lo que esperaría que funcione igualmente bien con pythontex).

información relacionada