Как связать latexmk с одним ключом в Emacs и показать ему ошибки, если они есть
Я использую AUCTeX, и я хотел бы привязать ключ, например. C-0
, который выполняет следующие действия:
- Сохраняет активный файл без запроса.
- Запускает
latexmk
в активном файле без запроса.
- Показывает мне ошибки, если
latexmk
встречается с любым.
Моя проблема заключается не в том, как связать ключ (для которого Тайлер разместил ссылку в комментарии ниже), но как придумать функцию, которая выполняет пункт 1-3.
Я вызываю Latexmk на
(add-hook 'LaTeX-mode-hook (lambda ()
(push
'("Latexmk" "latexmk %s" TeX-run-TeX nil t
:help "Run Latexmk on file")
TeX-command-list)))
Это мой .latexmkrc
$pdf_mode = 1;
$recorder = 1;
$latex = 'latex -recorder -halt-on-error -interaction=nonstopmode -shell-escape';
$pdflatex = 'pdflatex -recorder -halt-on-error -interaction=nonstopmode -shell-escape';
Я использую Emacs 23.3 и AUCTeX 11.86.
Ответы
Ответ 1
Что-то вроде этого?
(require 'tex-buf)
(defun run-latexmk ()
(interactive)
(let ((TeX-save-query nil)
(TeX-process-asynchronous nil)
(master-file (TeX-master-file)))
(TeX-save-document "")
(TeX-run-TeX "latexmk" "latexmk" master-file)
(if (plist-get TeX-error-report-switches (intern master-file))
(TeX-next-error t)
(minibuffer-message "latexmk done"))))
(add-hook 'LaTeX-mode-hook
(lambda () (local-set-key (kbd "C-0") #'run-latexmk)))
Edit:
TeX-save-document
сохраняет ваш основной файл и любые подфайлы (если у вас есть только один файл, это ваш основной файл), а когда TeX-save-query
равен нулю, он не запрашивает подтверждение. Затем TeX-run-TeX
запускает latexmk, используя механизм, обычно используемый для запуска TeX
, который включает в себя разбор сообщений об ошибках, но поскольку он обычно запускает асинхронный процесс, мы устанавливаем TeX-process-asynchronous
на nil, чтобы дождаться его завершения. Нечетная форма plist-get
является документированным способом проверки ошибок из TeX-run-TeX
(см. Комментарии в tex-buf.el
), и если есть ошибки, мы переходим к первому; если ошибок нет, мы показываем сообщение в минибуфере только для удовольствия.
Наконец, local-set-key
является одним из способов привязки ключа к функции.
Ответ 2
Это делает то, что вы хотите?
(defun my-tex ()
"Saves the current buffer and runs LaTeX, all with no prompts or further interaction."
(interactive)
(save-buffer)
(TeX-command "LaTeX" 'TeX-master-file -1))
Я не использую latexmk, но для выполнения этой работы все, что вам нужно сделать, это переключить строку "LaTeX" для строки имени, которую вы используете для latexmk в TeX-command-list
(что, вероятно, просто "latexmk" или "Latexmk" ").
Я рад, что вы спросили, как это будет полезно для меня сейчас!
Ответ 3
Предполагая, что вы уже использовали ответ в Как вызвать latexmk в emacs и перейти к следующей ошибке, чтобы добавить latexmk
в список команд для AUCTeX, вы можете использовать следующую функцию:
(defun run-latexmk ()
(interactive)
(save-buffer)
(TeX-command "Latexmk" 'TeX-master-file 0)
(if (plist-get TeX-error-report-switches (intern (TeX-master-file)))
(next-error))) ;; 0 -> suppress confirmation
И используйте любой из методов привязки ключей для привязки к C-0
; здесь, который локален в режиме TeX:
(define-key TeX-mode-map (kbd "C-0") 'run-latexmk)
Функция run-latexmk
основана на копании через TeX-command-master
и упрощает ее в соответствии с вашими потребностями. Обратите внимание, что вызов (next-error)
может не всегда происходить, потому что LaTeX может запутаться вашей ошибкой и приостановить ожидание ввода