Como permitir que o AUCTeX inicie automaticamente o script pythontex.py

Como permitir que o AUCTeX inicie automaticamente o script pythontex.py

Preciso usar o pythontexpacote 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-aque estão vinculadas ao comando AUCTeX TeX-command-run-alldescrito 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: insira a descrição da imagem aqui

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-allcomando 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-allo pythontex.pyscript 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 caso

  • uma string com um comando deTeX-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 de TeX-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 do TeX-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 PythonTeXto TeX-command-list, defina uma função privada que salve seu documento e seja executada TeX-command-sequenceadequadamente, 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 latexmkno Emacs, execute M-x customize-group AUCTeX. Em seguida, escolha TeX Commande, 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 latexmkem seus arquivos LaTeX, então você precisa configurar latexmkpara verificar se pythontexrequer 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 .texarquivo.) O autor latexmkforneceu 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 latexmkfunciona perfeitamente com isso, então espero que funcione igualmente bem com pythontex.)

informação relacionada