如何在emacs中调用latexmk,并跳转到下一个错误

时间:2010-02-04 12:38:42

标签: emacs latex build-process auctex latexmk

我想使用latexmk在Emacs中编译我的LaTeX文档。特别是我需要Emacs功能next-error,它通常用C-x`调用,然后跳转到文档中的下一个LaTeX错误。

我想使用latexmk或AUCTeX C-x compile致电C-c C-c

首先,我将latexmk设置为使用

$pdflatex = 'pdflatex -interaction=nonstopmode';

选项1:C-x编译

我按C-x compile并输入运行latexmk -pdf foo的{​​{1}}。但是pdflatex不会跳转到错误,即使* compilation * buffer包含错误:

next-error

如何在第48行自动跳转到此错误?

请注意,解析乳胶输出的这个问题与! Paragraph ended before \author was complete. <to be read again> \par l.48 [...] Compilation exited abnormally with code 12 直接无关。当我执行latexmk时会出现同样的问题。

选项2:AUCTeX

如何设置AUCTeX在我的.tex文件上调用C-x compile pdflatex -interaction=nonstopmode foo而不是latexmk -pdf?当然,我也希望pdflatex能在这里工作。

更新:我开始了赏金,因为如果这样可行,对很多人来说这将是一个很棒的工具。我认为如果给出了一个解决方案可以让我在Emacs中使用next-error轻松编译我的LaTeX文档并使用latexmk跳转到错误(当然,错误可能包含在中) .tex文件,不一定在主文件或当前缓冲区中。)

更新:感谢Ivan(和Chris)让AUCTeX + Latexmk工作。与此同时,我发现使用Rubber编译LaTeX也是一个很好的选择。它将以next-error和其他编译器使用的格式显示错误消息,因此它自然适用于Emacs gcc,例如C-x compile,并正确解析错误消息。

3 个答案:

答案 0 :(得分:27)

抱歉,我无法发表评论,或者我只是将其添加为评论。 Chris Conway的回答是有效的,除了它应该使用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模式下运行。就个人而言,我发现使用自定义更容易,尤其是在进行实验时。

答案 1 :(得分:9)

让AucTeX与C-c C-c一起运行latexmk相对容易。以下内容将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函数都假设它们可以将命令行选项添加到该字符串并执行结果。

答案 2 :(得分:3)

添加%(模式)为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)))