Как вызвать latexmk в emacs и перейти к следующей ошибке
Я хотел бы использовать latexmk для компиляции моих документов LaTeX в Emacs. Особенно мне нужна функциональность Emacs next-error
, который обычно вызывается с помощью Cx `и переходит к следующей ошибке LaTeX в документе.
Я хотел бы позвонить latexmk
либо используя C-x compile
или AUCTeX C-c C-c
,
Сначала я установил latexmk
использовать
$pdflatex = 'pdflatex -interaction=nonstopmode';
Вариант 1: компиляция Cx
я нажимаю C-x compile
и введите latexmk -pdf foo
, который работает pdflatex
, Но next-error
не будет переходить к ошибкам, даже если буфер *compilation* содержит ошибки:
! Paragraph ended before \author was complete.
<to be read again>
\par
l.48
[...]
Compilation exited abnormally with code 12
Как я могу автоматически перейти к этой ошибке в строке 48?
Обратите внимание, что этот вопрос синтаксического анализа вывода латекса не имеет ничего общего с latexmk
непосредственно. Та же проблема возникает, когда я просто делаю C-x compile pdflatex -interaction=nonstopmode foo
,
Вариант 2: AUCTeX
Как я могу установить AUCTeX для вызова latexmk -pdf
вместо pdflatex
в моем.tex файле? Конечно я хочу next-error
работать здесь тоже.
ОБНОВЛЕНИЕ: я начал щедрость, потому что, если бы это сработало, это было бы отличным инструментом для многих людей. Я считаю, что на вопрос дан ответ, если дано решение, которое позволяет мне легко скомпилировать документ LaTeX, используя latexmk
в Emacs и перейти к ошибкам, используя next-error
(конечно, ошибки могут быть во включенных файлах.tex, необязательно в мастер-файле или текущем буфере).
ОБНОВЛЕНИЕ: Спасибо Ивану (и Крису) за то, что они заставили AUCTeX+Latexmk работать. Тем временем я обнаружил, что использование Rubber для компиляции LaTeX также является отличным выбором. Он будет отображать сообщения об ошибках в формате, используемом gcc
и другие компиляторы, так что это естественно работает с Emacs C-x compile
например, C-x compile rubber --pdf foo
и сообщения об ошибках анализируются правильно.
3 ответа
Извините, у меня нет возможности комментировать, или я бы просто добавил это как комментарий. Ответ Криса Конвея работает, за исключением того, что он должен использовать TeX-run-TeX
вместо TeX-run-command
так что AucTeX знает, как обрабатывать сообщения об ошибках.
(add-hook 'LaTeX-mode-hook (lambda ()
(push
'("Latexmk" "latexmk -pdf %s" TeX-run-TeX nil t
:help "Run Latexmk on file")
TeX-command-list)))
Также было бы целесообразно добавить что-то вроде
'("%(-PDF)"
(lambda ()
(if (and (not TeX-Omega-mode)
(or TeX-PDF-mode TeX-DVI-via-PDFTeX))
"-pdf" "")))
в TeX-expand-list
и использовать "latexmk %(-PDF) %s"
так что он будет работать в режиме pdf и dvi. Лично мне легче использовать настройку, особенно когда вы экспериментируете.
Относительно легко заставить AucTeX запускать latexmk с C-c C-c
, Следующее добавит Latexmk
выбор списка команд TeX:
(add-hook 'LaTeX-mode-hook (lambda ()
(push
'("Latexmk" "latexmk -pdf %s" TeX-run-command nil t
:help "Run Latexmk on file")
TeX-command-list)))
Трюк становится next-error
работать. Если вы покопаетесь в источниках AucTeX, вы, вероятно, сможете найти регулярное выражение, которое он использует в выходных буферах TeX; он не применяется автоматически к буферу, созданному командой TeX-run-command. (Вы также можете убедить compile
Режим использования этого регулярного выражения.)
Другой подход заключается в переопределении переменной LaTeX-command
, Это немного ненадежно, потому что я думаю, что многие функции AucTeX предполагают, что они могут прикрепить параметры командной строки к этой строке и выполнить результат.
Добавление%(mode) дает latexmk еще несколько опций, таких как неинтерактивный, если он установлен в auctex.
(add-hook 'LaTeX-mode-hook (lambda ()
(push
'("Latexmk" "latexmk -pdf %(mode) %s" TeX-run-TeX nil t
:help "Run Latexmk on file")
TeX-command-list)))