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

如何在emacs中调用latexmk并跳转到下一个错误,emacs,latex,build-process,auctex,latexmk,Emacs,Latex,Build Process,Auctex,Latexmk,我想用Emacs编译我的LaTeX文档。特别是我需要Emacs功能next error,它通常用C-x`调用,并跳转到文档中的下一个LaTeX错误 我想使用C-x compile或AUCTeXC-C-C调用latexmk 首先,我将latexmk设置为使用 $pdflatex = 'pdflatex -interaction=nonstopmode'; 选项1:C-x编译 我按下C-x compile并键入latexmk-pdf foo,它运行pdflatex。但是next error不会跳转

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

我想使用
C-x compile
或AUCTeX
C-C-C
调用
latexmk

首先,我将
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 
!段落在\作者完成之前结束。
\标准杆
l、 四十八
[...]
编译异常退出,代码为12
如何自动跳转到第48行中的此错误

请注意,解析latex输出的这个问题与
latexmk
没有直接关系。同样的问题也发生在我刚刚编译pdflatex-interaction=nonstopmodefoo时

选项2:AUCTeX

如何将AUCTeX设置为调用.tex文件中的
latexmk-pdf
而不是
pdflatex
?当然,我希望
下一个错误
也能在这里工作

更新:我开始了一个悬赏,因为如果这能奏效,对很多人来说,它将是一个很棒的工具。我认为,如果给出一个解决方案,可以让我在Emacs中使用“代码> LATEXMK < /代码>轻松编译我的胶乳文档,并使用<代码>下一个错误跳转到错误(当然,错误可能包含在包含.TEX文件中,不一定在主文件或当前缓冲区中)。
更新:感谢Ivan(和Chris)让AUCTeX+Latexmk发挥作用。同时,我发现使用来编译LaTeX也是一个很好的选择。它将以
gcc
和其他编译器使用的格式显示错误消息,因此它自然适用于Emacs
C-x compile
,例如
C-x compile ruber--pdf foo
,并且错误消息被正确解析。

让AucTeX与
C-C-C
一起运行latexmk相对容易。以下内容将在TeX命令列表中添加一个
Latexmk
选项:

(add-hook 'LaTeX-mode-hook (lambda ()
  (push 
    '("Latexmk" "latexmk -pdf %s" TeX-run-command nil t 
      :help "Run Latexmk on file")
    TeX-command-list)))
诀窍是让
下一个错误
起作用。如果你在AucTeX源代码中翻找,你可能会发现它在TeX输出缓冲区上使用的正则表达式;它不会自动应用于由TeX run命令创建的缓冲区。(您还可以说服
compile
模式使用此正则表达式。)


另一种方法是重新定义变量
LaTeX命令
。这有点不确定,因为我认为很多AucTeX函数都假设它们可以将命令行选项添加到此字符串上并执行结果。

很抱歉,我没有评论的能力,或者我只是将其作为评论添加。Chris Conway的答案是有效的,只是它应该使用
TeX run TeX
而不是
TeX run命令
,以便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,请展开列表
,并使用
“latexmk%(-PDF)%s”
,使其在PDF和dvi模式下都能工作。就我个人而言,我发现使用自定义更容易,尤其是在您进行实验时。

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

另请参见此远程相关问题。还有
TeX run compile
,以便您可以使用AucTeX接口启动编译过程。尝试
C-h v TeX command list RET
查看不同可用方法的完整列表。也可以通过Emacs软件包管理器(不确定在哪个repo上)查看。哇,感谢这段代码,我遇到了一个无法修复的令人恼火的问题,不知怎的,这段代码让一切都正常工作了+1如果您的评论获得250份奖励,您的答案一定非常棒!=)哦,它们太棒了