2010-02-04 17 views
26

Me gustaría usar latexmk para compilar mis documentos LaTeX en Emacs. Especialmente necesito la funcionalidad de Emacs next-error, que normalmente se llama con C-x `, y salta al siguiente error de LaTeX en el documento.Cómo llamar a latexmk en emacs, y saltar al siguiente error

Me gustaría llamar al latexmk utilizando C-x compile o AUCTeX C-c C-c.

Primero, puse latexmk utilizar

$pdflatex = 'pdflatex -interaction=nonstopmode'; 

Opción 1: C-x compilar

presiono C-x compile y tipo latexmk -pdf foo, que corre pdflatex. Pero next-error no saltará a los errores, incluso si la compilación * * búfer contiene errores:

! Paragraph ended before \author was complete. 
<to be read again> 
        \par 
l.48 
[...] 
Compilation exited abnormally with code 12 

¿Cómo puedo saltar automáticamente a este error en la línea 48?

Tenga en cuenta que esta cuestión de analizar la salida de látex no tiene nada que ver con latexmk directamente. El mismo problema ocurre cuando acabo de hacer C-x compile pdflatex -interaction=nonstopmode foo.

Opción 2: AUCTeX

¿Cómo puedo configurar AUCTeX llamar latexmk -pdf en lugar de pdflatex en mi archivo .tex? Por supuesto, quiero next-error para trabajar aquí también.

ACTUALIZACIÓN: empecé una recompensa porque si esto funcionó sería una gran herramienta para muchas personas. Considero la pregunta respondida si se proporciona una solución que me permite compilar fácilmente mi documento LaTeX usando latexmk en Emacs y saltar a los errores usando next-error (por supuesto, los errores pueden estar en incluidos .tex archivos, no necesariamente en el maestro archivo o el buffer actual).

ACTUALIZACIÓN: Gracias a Ivan (y Chris) para hacer trabajos AUCTeX + latexmk. Mientras tanto, descubrí que usar Rubber para compilar LaTeX también es una excelente opción. Mostrará los mensajes de error en el formato utilizado por gcc y otros compiladores, por lo que naturalmente funciona con Emacs C-x compile, p. C-x compile rubber --pdf foo, y los mensajes de error se analizan correctamente.

+0

Consulte también esta pregunta remotamente relacionada http://stackoverflow.com/questions/738755/dont-make-me. – Frank

+0

También hay 'TeX-run-compile' para que pueda usar la interfaz AucTeX para iniciar el proceso de compilación. Pruebe 'C-h v TeX-command-list RET' para ver la lista completa de los diferentes métodos disponibles. –

+0

Véase también https://github.com/tom-tan/auctex-latexmk, disponible a través de los gestores de paquetes de Emacs (no estoy seguro de qué repositorio). – Blaisorblade

Respuesta

27

Lo siento, no tengo la capacidad de comentar, o simplemente agregaría esto como un comentario. La respuesta de Chris Conway funciona, excepto que debería usar TeX-run-TeX en lugar de TeX-run-command para que AucTeX sepa que procesa los mensajes de error.

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

También podría ser conveniente añadir algo como

'("%(-PDF)" 
    (lambda() 
    (if (and (not TeX-Omega-mode) 
      (or TeX-PDF-mode TeX-DVI-via-PDFTeX)) 
     "-pdf" ""))) 

a TeX-expand-list y utilizar "latexmk %(-PDF) %s" por lo que va a trabajar tanto en modo PDF y DVI. Personalmente, me resulta más fácil usar personalizar especialmente cuando estás experimentando.

+0

¡Gracias, eso funciona! – Frank

+0

¡Si sus comentarios obtienen 250 recompensas, sus respuestas deben ser excelentes! =) –

+0

Oh, son excelentes. :) –

9

Es relativamente fácil hacer que AucTeX ejecute latexmk con C-c C-c. A continuación se añadirá una opción Latexmk a la lista de comandos de 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))) 

El truco es conseguir next-error para trabajar. Si busca en las fuentes de AucTeX, probablemente pueda encontrar la expresión regular que utiliza en los búferes de salida TeX; no se aplica automáticamente al buffer creado por TeX-run-command. (También puede convencer al modo compile para usar esta expresión regular.)

Otro enfoque es redefinir la variable LaTeX-command.Esto es un poco dudoso porque creo que muchas de las funciones de AucTeX asumen que pueden pegar opciones de línea de comandos en esta cadena y ejecutar el resultado.

+0

Wow gracias por este bonito código Estaba teniendo un problema enloquecedor que no podía solucionar y de alguna manera este fragmento hizo que todo funcionara. +1 – mcheema

3

Al agregar% (modo), le da al latexmk algunas opciones más, como no interactivas, si está configurado en 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))) 
Cuestiones relacionadas