Подтвердить что ты не робот

Как вызвать latexmk в emacs и перейти к следующей ошибке

Я хотел бы использовать latexmk для компиляции моих документов LaTeX в Emacs. Особенно мне нужна функциональность Emacs next-error, которую обычно вызывают с помощью C-x `, и переходит к следующей ошибке LaTeX в документе.

Я хотел бы назвать 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 не будет переходить на ошибки, даже если в буфере * 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 работать здесь тоже.

ОБНОВЛЕНИЕ: Я начал bounty, потому что если бы это сработало, это было бы отличным инструментом для многих людей. Я рассматриваю вопрос, отвечающий, если дано решение, позволяющее легко скомпилировать мой документ LaTeX с помощью latexmk в Emacs и перейти к ошибкам с помощью next-error (конечно, ошибки могут быть включены в .tex файлы, не обязательно в главный файл или текущий буфер).

ОБНОВЛЕНИЕ: Благодаря Ивану (и Крису) за работу AUCTeX + Latexmk. Тем временем я обнаружил, что использование Rubber для компиляции LaTeX также является отличным выбором. Он отображает сообщения об ошибках в формате, используемом gcc и другими компиляторами, поэтому он, естественно, работает с Emacs C-x compile, например. C-x compile rubber --pdf foo, и сообщения об ошибках обрабатываются правильно.

4b9b3361

Ответ 1

Извините, у меня нет возможности комментировать, или я просто добавлю это как комментарий. Ответ Криса Конвей работает, за исключением того, что он должен использовать 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. Лично мне легче использовать настройку, особенно когда вы экспериментируете.

Ответ 2

Относительно легко получить 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 предполагают, что они могут привязать параметры командной строки к этой строке и выполнить результат.

Ответ 3

Добавление% (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)))