Preciso usar o pythontex
pacote que considero muito útil caso alguém precise fazer algum cálculo antes de inserir os resultados no LaTeX. Então aqui está um exemplo:
\documentclass{article}
\usepackage{pythontex}
\begin{document}
If we add five to eight we get \py{5+8}.
\end{document}
Estou acostumado a digitar meus documentos LaTeX no Emacs com AUCTeX. Para compilar o documento geralmente uso as chaves C-c C-a
que estão vinculadas ao comando AUCTeX TeX-command-run-all
descrito no manual AUCTeX como:
Compile o documento atual até que ocorra um erro ou seja concluído. Se a compilação terminar com sucesso, execute o visualizador no final.
Mas com o exemplo fornecido acima obtenho este resultado:
Como podemos ver, o resultado do cálculo python foi substituído por ?? . Isso ocorre porque conforme descrito no manual do pacote pythontex:
Compilar um documento com pythontex envolve três etapas: 1) executar um mecanismo tex compatível com LaTeX; 2) executando o script pythontex.py; 3) e finalmente executando o mecanismo TeX novamente.
O segundo passo não é executado automaticamente pelo TeX-command-run-all
comando então preciso sair momentaneamente do Emacs, abrir um terminal (estou no GNU/Linux) e digitar pythontex <myfile.tex>
, e retornar ao Emacs para executar novamente TeX-command-run-all
. Como podemos facilmente imaginar, é um tanto doloroso fazer isso sete vezes.
A questão: Como configurar o AUCTeX de forma que quando eu chamo TeX-command-run-all
o pythontex.py
script seja iniciado automaticamente para que não haja mais necessidade de usar um terminal e executar o script manualmente?
Responder1
Eu sugiro que você não hackeie os comandos do AUCTeX, mas defina o seu próprio. Você pode definir uma série de comandos shell para serem executados via TeX-command-sequence
.
(COMANDO de sequência de comando TeX e RESET FILE-FN opcional)
Execute uma sequência de comandos TeX definidos por COMMAND.
O argumento COMMAND pode ser
nil
: nenhum comando será executado neste casouma string com um comando de
TeX-command-list
uma lista não nula de strings, que são comandos de
TeX-command-list
; o carro da lista é usado como comando a ser executado na primeira execução deTeX-command-sequence
, o cdr da lista será passado para a função na próxima execução, etc.um nome de função, retornando uma string que é o comando from
TeX-command-list
; será funcall'd (sem argumentos!) e usado novamente na próxima execução doTeX-command-sequence
.com qualquer outro valor, a função
TeX-command-default
é usada para determinar o comando a ser executado, até que uma condição de parada seja atendida.[...] Um valor diferente de nulo para o argumento opcional RESET significa que esta é a primeira execução da função e algumas variáveis precisam ser redefinidas.
Portanto, a estratégia básica é: Adicione uma entrada para PythonTeX
to TeX-command-list
, defina uma função privada que salve seu documento e seja executada TeX-command-sequence
adequadamente, vincule essa função privada a uma chave no modo LaTeX e então execute-a.
(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)))
Responder2
eu penso issolátexmkfoi projetado para esse tipo de situação. Ele está incluído em algumas distribuições do TeX, então talvez você já o tenha. Depois de configurado corretamente, você deverá executá-lo apenas uma vez e ele detectará automaticamente se o Python precisa ser executado, executá-lo e, em seguida, executar novamente o LaTeX, se necessário. De qualquer forma, depois de ter feito isso latexmk
no Emacs, execute M-x customize-group AUCTeX
. Em seguida, escolha TeX Command
e, dentro desse menu, personalize TeX-command-list
: adicione uma linha
("latexmk" "latexmk %t" TeX-run-command nil t)
Agora você deve ter a opção de executar latexmk
em seus arquivos LaTeX, então você precisa configurar latexmk
para verificar se pythontex
requer a execução do Python. (Eu também adiciono (setq TeX-command-default "latexmk")
um gancho apropriado para que seja avaliado sempre que eu edito um .tex
arquivo.) O autor latexmk
forneceu umarquivo de configuração de exemplopara usar com pythontex
. Você também pode fazer uma pesquisa na Internet por "latexmk pythontex". (Eu não uso pythontex, então não posso garantir isso. Eu uso sagetex e latexmk
funciona perfeitamente com isso, então espero que funcione igualmente bem com pythontex.)