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

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

26
задан Jason Hemann 12 September 2019 в 04:48
поделиться

2 ответа

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

28
ответ дан 28 November 2019 в 07:27
поделиться

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

9
ответ дан 28 November 2019 в 07:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: