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

Fra*_*ank 26 emacs latex build-process auctex latexmk

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

我想打电话latexmk或使用C-x compileAUCTeX C-c C-c.

首先,我开始latexmk使用

$pdflatex = 'pdflatex -interaction=nonstopmode';
Run Code Online (Sandbox Code Playgroud)

选项1:Cx编译

我按下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 
Run Code Online (Sandbox Code Playgroud)

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

请注意,解析乳胶输出的这个问题与latexmk直接无关.我刚才也会出现同样的问题C-x compile pdflatex -interaction=nonstopmode foo.

选项2:AUCTeX

如何设置AUCTeX latexmk -pdf而不是pdflatex我的.tex文件?当然,我也想next-error在这里工作.

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

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

Iva*_*rus 28

对不起,我没有评论的能力,或者我只是将其添加为评论.克里斯康威的答案是有效的,除了它应该使用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)))
Run Code Online (Sandbox Code Playgroud)

添加类似的东西也可能是明智之举

'("%(-PDF)"
  (lambda ()
    (if (and (not TeX-Omega-mode)
             (or TeX-PDF-mode TeX-DVI-via-PDFTeX))
        "-pdf" "")))
Run Code Online (Sandbox Code Playgroud)

TeX-expand-list和使用"latexmk %(-PDF) %s",使其在PDF和DVI模式下工作.就个人而言,我发现使用自定义更容易,尤其是在进行实验时.


Chr*_*way 9

让AucTeX运行latexmk相对容易C-c C-c.以下内容将为LatexmkTeX命令列表添加一个选项:

(add-hook 'LaTeX-mode-hook (lambda ()
  (push 
    '("Latexmk" "latexmk -pdf %s" TeX-run-command nil t 
      :help "Run Latexmk on file")
    TeX-command-list)))
Run Code Online (Sandbox Code Playgroud)

诀窍是next-error开始工作.如果你在AucTeX源中挖掘,你可以找到它在TeX输出缓冲区上使用的正则表达式; 它不会自动应用于TeX-run-command创建的缓冲区.(您也可以说服compile模式使用此正则表达式.)

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