Como ligar para o LATEXMK em Emacs e pular para o próximo erro
-
25-09-2019 - |
Pergunta
Eu gostaria de usar LATEXMK Para compilar meus documentos de látex na EMACS. Especialmente eu preciso da funcionalidade do EMACS next-error
, que normalmente é chamado com CX `e salta para o próximo erro de látex no documento.
Eu gostaria de ligar latexmk
usando C-x compile
ou o auctex C-c C-c
.
Primeiro, eu ajustei latexmk
usar
$pdflatex = 'pdflatex -interaction=nonstopmode';
Opção 1: compilar CX
Eu pressiono C-x compile
e tipo latexmk -pdf foo
, que corre pdflatex
. Mas next-error
Não pulará para os erros, mesmo que o buffer * compilação * contenha erros:
! Paragraph ended before \author was complete.
<to be read again>
\par
l.48
[...]
Compilation exited abnormally with code 12
Como posso pular automaticamente para esse erro na linha 48?
Observe que esta questão de analisar a saída do látex não tem nada a ver com latexmk
diretamente. O mesmo problema ocorre quando eu apenas faço C-x compile pdflatex -interaction=nonstopmode foo
.
Opção 2: Auctex
Como posso definir o Auctex para ligar latexmk -pdf
ao invés de pdflatex
No meu arquivo .tex? Claro que quero next-error
para trabalhar aqui também.
ATUALIZAR: Eu comecei um recompensa Porque se isso funcionasse, seria uma ótima ferramenta para muitas pessoas. Considero a pergunta respondida se for dada uma solução que me permita compilar facilmente meu documento de látex usando latexmk
em Emacs e pule para os erros usando next-error
(Claro, os erros podem estar em incluído Os arquivos .tex, não necessariamente no arquivo mestre ou no buffer atual).
ATUALIZAR: Agradecemos a Ivan (e Chris) por fazer o Auctex+LateXMK funcionar. Enquanto isso, descobri que usando Borracha Para compilar o látex também é uma excelente opção. Ele exibirá mensagens de erro no formato usado por gcc
e outros compiladores, então funciona naturalmente com o Emacs C-x compile
, por exemplo C-x compile rubber --pdf foo
, e as mensagens de erro são analisadas corretamente.
Solução
Desculpe, não tenho a capacidade de comentar, ou apenas acrescentaria isso como um comentário. A resposta de Chris Conway funciona, exceto que deve usar TeX-run-TeX
ao invés de TeX-run-command
para que o Auctex saiba processar as mensagens de erro.
(add-hook 'LaTeX-mode-hook (lambda ()
(push
'("Latexmk" "latexmk -pdf %s" TeX-run-TeX nil t
:help "Run Latexmk on file")
TeX-command-list)))
Também pode ser aconselhável adicionar algo como
'("%(-PDF)"
(lambda ()
(if (and (not TeX-Omega-mode)
(or TeX-PDF-mode TeX-DVI-via-PDFTeX))
"-pdf" "")))
para TeX-expand-list
E use "latexmk %(-PDF) %s"
para que funcione no modo PDF e DVI. Pessoalmente, acho mais fácil usar personalizar, especialmente quando você está experimentando.
Outras dicas
É relativamente fácil conseguir que o Auctex execute o LATEXMK C-c C-c
. O seguinte adicionará um Latexmk
Escolha para a lista de comandos 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)))
O truque está recebendo next-error
trabalhar. Se você cavar as fontes do Auctex, provavelmente poderá encontrar o regex que ele usa nos buffers de saída Tex; Não é aplicado automaticamente ao buffer criado pelo Tex-Run-Command. (Você também pode ser capaz de convencer compile
modo para usar este regex.)
Outra abordagem é redefinir a variável LaTeX-command
. Isso é um pouco duvidoso, porque acho que muitas funções do Auctex assumem que elas podem colocar opções de linha de comando nessa string e executar o resultado.
A adição de %(modo) fornece ao LateXMK mais algumas opções, como não interativo, se estiver definido no 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)))