Как вызвать 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)))
Другие вопросы по тегам