Necesito usar el pythontex
paquete 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-a
que están vinculadas al comando AUCTeX TeX-command-run-all
descrito 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:
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-all
comando, 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-all
el pythontex.py
script 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 comandouna cadena con un comando de
TeX-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ónTeX-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 deTeX-command-sequence
.con cualquier otro valor, la función
TeX-command-default
se 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-list
definir una función privada que guarde su documento y se ejecute TeX-command-sequence
apropiadamente, 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 Command
y 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 latexmk
sus archivos LaTeX, por lo que debe configurarlo latexmk
para verificar si pythontex
es necesario ejecutar Python. (También agrego (setq TeX-command-default "latexmk")
un enlace apropiado para que se evalúe cada vez que edito un .tex
archivo). El autor de latexmk
ha 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 latexmk
funciona muy bien con eso, por lo que esperaría que funcione igualmente bien con pythontex).