26

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

我想调用latexmkusingC-x compile或 AUCTeX C-c C-c

首先,我设置latexmk使用

$pdflatex = 'pdflatex -interaction=nonstopmode';

选项 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 

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

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

选项 2:AUCTeX

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

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

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

4

3 回答 3

28

抱歉,我没有能力发表评论,或者我只是将其添加为评论。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" "")))

toTeX-expand-list和 use"latexmk %(-PDF) %s"以便它可以在 pdf 和 dvi 模式下工作。就个人而言,我发现使用自定义更容易,尤其是在您进行实验时。

于 2010-02-11T22:01:08.030 回答
9

让 AucTeX 运行 latexmk 相对容易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 创建的缓冲区。(您也许还可以说服compilemode 使用此正则表达式。)

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

于 2010-02-04T14:01:22.373 回答
3

如果在 auctex 中设置了 %(mode),则添加 %(mode) 会为latexmk 提供更多选项,例如非交互式。

(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)))
于 2012-07-10T13:38:33.420 回答