2010-02-04 4 views
26

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

Я бы хотел позвонить по телефону latexmk с использованием C-x compile или AUCTeX C-c C-c.

Во-первых, я установил latexmk использовать

$pdflatex = 'pdflatex -interaction=nonstopmode'; 

Вариант 1: C-х компилировать

нажатии C-x compile и тип latexmk -pdf foo, который работает pdflatex. Но next-error не прыгнет к ошибкам, даже если * компиляции * буфер содержит ошибки:

! 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 работать здесь тоже.

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

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

+0

См. Также этот удаленный вопрос http://stackoverflow.com/questions/738755/dont-make-me. – Frank

+0

Существует также 'TeX-run-compile', так что вы можете использовать интерфейс AucTeX для запуска процесса компиляции. Попробуйте 'C-h v TeX-command-list RET', чтобы просмотреть полный список доступных методов. –

+0

См. Также https://github.com/tom-tan/auctex-latexmk, доступный через менеджеров пакетов Emacs (не уверен, на каком репо). – Blaisorblade

ответ

27

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

+0

Спасибо, что работает! – Frank

+0

Если ваши комментарии получат 250 бонусов, ваши ответы должны быть превосходными! =) –

+0

О, они превосходны. :) –

9

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

+0

Ничего себе благодаря этому хорошему коду кода. У меня возникла проблема с безумием, которую я не мог исправить, и каким-то образом этот фрагмент заставил все работать. +1 – mcheema

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))) 
Смежные вопросы