Я хотел бы использовать latexmk для компиляции моих ЛАТЕКСНЫХ документов в Emacs. Особенно мне нужна функциональность Emacs next-error
, который обычно называют с C-x' и переходит к следующей ЛАТЕКСНОЙ ошибке в документе.
Я хотел бы звонить latexmk
любое использование C-x compile
или AUCTeX C-c C-c
.
Во-первых, я установил latexmk
использовать
$pdflatex = 'pdflatex -interaction=nonstopmode';
Опция 1: компиляция C-x
Я нажимаю C-x compile
и введите latexmk -pdf foo
, который работает pdflatex
. Но next-error
не перейдет к ошибкам, даже если *компиляция* буфер будет содержать ошибки:
! Paragraph ended before \author was complete.
\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
работать здесь также.
ОБНОВЛЕНИЕ: Я запустил щедрость, потому что, если это работало, это будет большой инструмент для многих людей. Я считаю вопрос отвеченным, если решение состоит в том, учитывая, что позволяет мне легко скомпилировать свое ЛАТЕКСНОЕ использование документа latexmk
в Emacs и переходе к ошибкам с помощью next-error
(конечно, ошибки могли бы быть во включенных .tex файлах, не обязательно в основном файле или текущем буфере).
ОБНОВЛЕНИЕ: Благодаря Ivan (и Chris) для того, чтобы заставить AUCTeX+Latexmk работать. Тем временем я нашел, что использование Резины для компиляции ЛАТЕКСА является также отличным выбором. Это отобразит сообщения об ошибках в формате, используемом gcc
и другие компиляторы, таким образом, это естественно работает с Emacs C-x compile
, например. C-x compile rubber --pdf foo
, и сообщения об ошибках анализируются правильно.
Извините, у меня нет возможности комментировать, или я просто добавлю это в качестве комментария. Ответ Криса Конвея работает, за исключением того, что он должен использовать 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 с Cc Cc
. Следующее добавит вариант 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. (Вы также можете убедить режим компиляции
использовать это регулярное выражение.)
Другой подход - переопределить переменную LaTeX-command
. Это немного ненадежно, потому что я думаю, что многие функции AucTeX предполагают, что они могут привязать параметры командной строки к этой строке и выполнить результат.