Мне нужно использовать 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.)