sirve - emacs tutorial
Cómo llamar a latexmk en emacs y saltar al siguiente error (3)
Me gustaría usar latexmk para compilar mis documentos LaTeX en Emacs. Especialmente necesito el next-error
funcionalidad de Emacs, que normalmente se llama con Cx `, y salta al siguiente error de LaTeX en el documento.
Me gustaría llamar a latexmk
usando Cx compile
o AUCTeX Cc Cc
.
Primero, configuro latexmk
para usar
$pdflatex = ''pdflatex -interaction=nonstopmode'';
Opción 1: compilación Cx
latexmk -pdf foo
Cx compile
y latexmk -pdf foo
, que ejecuta pdflatex
. Pero next-error
no saltará a los errores, incluso si el búfer * compilation * 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 Cx compile pdflatex -interaction=nonstopmode foo
.
Opción 2: AUCTeX
¿Cómo puedo configurar AUCTeX para que llame a latexmk -pdf
lugar de pdflatex
en mi archivo .tex? Por supuesto, quiero que el next-error
funcione aquí.
ACTUALIZACIÓN: Comencé una recompensa porque si esto funcionara, sería una gran herramienta para muchas personas. Considero que se responde la pregunta si se da una solución que me permita compilar fácilmente mi documento LaTeX usando latexmk
en Emacs y saltar a los errores usando el next-error
(por supuesto, los errores pueden estar en los archivos .tex incluidos , no necesariamente en el master). archivo o el búfer actual).
ACTUALIZACIÓN: Gracias a Ivan (y Chris) por hacer funcionar 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 la Cx compile
Emacs Cx compile
, por ejemplo, Cx compile rubber --pdf foo
, y los mensajes de error se analizan correctamente.
Agregar% (modo) le da a latexmk algunas opciones más como no interactivo 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)))
Es relativamente fácil hacer que AucTeX ejecute latexmk con Cc Cc
. Lo siguiente agregará una opción de Latexmk
a la 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)))
El truco es hacer que el next-error
funcione. Si busca en las fuentes de AucTeX, probablemente pueda encontrar la expresión regular que utiliza en los buffers de salida TeX; no se aplica automáticamente al búfer creado por TeX-run-command. (También puedes convencer al modo de compile
de usar esta expresión regular).
Otro enfoque es redefinir la variable LaTeX-command
. Esto es un poco dudoso porque creo que muchas funciones de AucTeX asumen que pueden agregar opciones de línea de comandos en esta cadena y ejecutar el resultado.
Lo siento, no tengo la capacidad de comentar, o simplemente agregaría esto como un comentario. La respuesta de Chris Conway funciona, excepto que debe usar TeX-run-TeX
lugar de TeX-run-command
para que AucTeX sepa procesar 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 sabio agregar algo como
''("%(-PDF)"
(lambda ()
(if (and (not TeX-Omega-mode)
(or TeX-PDF-mode TeX-DVI-via-PDFTeX))
"-pdf" "")))
a TeX-expand-list
y use "latexmk %(-PDF) %s"
para que funcione en modo pdf y dvi. Personalmente, me resulta más fácil personalizar el uso, especialmente cuando estás experimentando.