Как разрешить AUCTeX автоматически запускать скрипт pythontex.py

Как разрешить AUCTeX автоматически запускать скрипт pythontex.py

Мне нужно использовать pythontexпакет, который я нахожу очень полезным, если кому-то нужно выполнить какие-то вычисления перед вставкой результатов в LaTeX. Вот пример:

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

Я привык набирать документы LaTeX в Emacs с помощью AUCTeX. Для компиляции документа я обычно использую клавиши C-c C-a, привязанные к команде AUCTeX, TeX-command-run-allописанной в руководстве AUCTeX как:

Компилировать текущий документ до тех пор, пока не возникнет ошибка или он не будет завершен. Если компиляция завершится успешно, запустить просмотрщик в конце.

Но с помощью приведенного выше примера я получаю такой результат: введите описание изображения здесь

Как мы видим, результат вычисления python был заменен на ?? . Это потому, что, как описано в руководстве по пакету pythontex:

Компиляция документа с помощью pythontex состоит из трех этапов: 1) запуск совместимого с LaTeX движка tex; 2) запуск скрипта pythontex.py; 3) и, наконец, повторный запуск движка TeX.

Второй шаг не выполняется автоматически командой, TeX-command-run-allпоэтому мне нужно на мгновение выйти из Emacs, открыть терминал (я работаю в GNU/Linux) и набрать pythontex <myfile.tex>, а затем вернуться в Emacs, чтобы снова запустить TeX-command-run-all. Как мы легко можем себе представить, это довольно болезненно делать семь раз.

Вопрос: Как настроить AUCTeX таким образом, чтобы при вызове TeX-command-run-allскрипта pythontex.pyон автоматически запускался, и больше не было необходимости использовать терминал и выполнять скрипт вручную?

решение1

Я предлагаю вам не хакать команды AUCTeX, а определить свою собственную. Вы можете определить ряд команд оболочки для запуска через TeX-command-sequence.

(Команда TeX-последовательности-КОМАНДА и необязательно СБРОС ФАЙЛА-FN)

Выполнить последовательность команд TeX, определенную COMMAND.

Аргумент COMMAND может быть

  • nil: в этом случае команда не будет выполнена

  • строка с командой изTeX-command-list

  • ненулевой список строк, которые являются командами из TeX-command-list; car списка используется как команда, которая будет выполнена при первом запуске TeX-command-sequence, cdr списка будет передан функции при следующем запуске и т. д.

  • имя функции, возвращающей строку, которая является командой из TeX-command-list; она будет вызвана функцией (без аргументов!) и использована снова при следующем запуске TeX-command-sequence.

  • при любом другом значении функция TeX-command-defaultиспользуется для определения команды, которая будет выполняться, пока не будет выполнено условие остановки.

[...] Ненулевое значение необязательного аргумента RESET означает, что это первый запуск функции и некоторые переменные необходимо сбросить.

Итак, основная стратегия такова: добавьте запись для PythonTeX, TeX-command-listопределите частную функцию, которая сохранит ваш документ и запустится TeX-command-sequenceсоответствующим образом, привяжите эту частную функцию к клавише в режиме LaTeX, а затем запустите ее.

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

решение2

я думаю чтолатексмкпредназначен для таких ситуаций. Он включен в некоторые дистрибутивы TeX, так что он у вас уже может быть. После правильной настройки вам нужно будет просто запустить его один раз, и он автоматически определит, нужно ли запускать Python, запустит его, а затем повторно запустит LaTeX, если это необходимо. В любом случае, как только у вас есть latexmk, в Emacs запустите M-x customize-group AUCTeX. Затем выберите TeX Command, и в этом меню настройте TeX-command-list: добавьте строку

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

Теперь у вас должна быть возможность запуска latexmkна ваших файлах LaTeX, поэтому вам нужно настроить latexmkпроверку, pythontexтребуется ли запуск Python. (Я также добавляю (setq TeX-command-default "latexmk")соответствующий хук, чтобы он оценивался всякий раз, когда я редактирую файл .tex.) Автор latexmkпредоставилпример файла конфигурациидля использования с pythontex. Вы также можете поискать в интернете "latexmk pythontex". (Я не использую pythontex, поэтому не могу за это поручиться. Я использую sagetex, и он latexmkпрекрасно работает с ним, поэтому я ожидаю, что он будет работать так же хорошо и с pythontex.)

Связанный контент