Nel post
Opzioni utili per comporre documenti LaTeX in GNU Emacs + AUCTeX illustrai le principali opzioni di Emacs che trovo particolarmente utili per scrivere documenti LaTeX. Ora voglio mostrare l'impostazione di uno strumento esterno a AUCTeX ma che ritengo molto utile.
Il pacchetto
Flymake, presente di default nelle ultime versioni di GNU Emacs, permette di effettuare un controllo della
sintassi al volo, cioè durante la scrittura di un codice. Quindi per trovare un errore formale all'interno di questo non sarà necessario avviare manualmente la compilazione ma sarà Emacs stesso ad avvisare della loro presenza. Per fare questo Flymake si appoggia a programmi esterni di controllo della sintassi. Per quanto riguarda LaTeX esistono almeno un paio di programmi specifici:
Lacheck e
ChkTeX. Il primo non è più sviluppato dal 1997 e ha difficoltà con macro molto elaborate, quindi molto probabilmente non vorrete utilizzarlo (sebbene sia lo strumento predefinito da Emacs per effettuare l'analisi sintattica, non al volo, che si avvia con
C-c C-c Check RET
. È possibile cambiare questa impostazione modificando la variabile
TeX-command-list
come visto prima), il secondo progetto è un po' più attivo. Inoltre per effettuare un controllo della sintassi è possibile anche utilizzare i compilatori stessi
latex
,
pdflatex
, ecc., utilizzati con delle opportune opzioni di compilazione che vedremo più avanti.
Volendo usare ChkTex bisogna inserire nel proprio file di
inizializzazione ~/.emacs
il seguente codice:
(require 'flymake)
(defun flymake-get-tex-args (file-name)
(list "chktex" (list "-q" "-v0" file-name)))
(add-hook 'LaTeX-mode-hook 'flymake-mode)
Analizziamo nel dettaglio queste istruzioni: la riga (
require '
flymake) dice semplicemente a Emacs di caricare il pacchetto
flymake
; le due successive specificano il programma esterno da usare (nel caso specifico
chktex
) e i relativi argomenti da passare, nel nostro caso
-q -v0
seguiti dal nome del file che si sta modificando contenuto nella variabile
file-name
. Per capire cosa fanno le varie opzioni consultare il
manuale. Infine l'ultima fa in modo che ogni volta che si apre un documento con la major mode
LaTeX-mode
venga attivata la minor mode
flymake-mode
. Se non si vuole aggiungere questa ultima funzione sarà necessario attivare manualmente la modalità con
M-x flymake-mode
.
Penso sia ora chiaro come bisogna modificare il codice precedente per appoggiarsi a uno strumento diverso da ChkTex. Bisogna sostituire a
chktex il nome del programma desiderato e inserire al posto di
"-q" "-v0" l'eventuale elenco di opzioni volute. Per esempio, volendo usare Lacheck, senza alcuna opzione passata da linea di comando, dovremo inserire
(require 'flymake)
(defun flymake-get-tex-args (file-name)
(list "lacheck" (list file-name)))
(add-hook 'LaTeX-mode-hook 'flymake-mode)
Come detto, è possibile anche utilizzare il compilatore stesso per effettuare un controllo della sintassi. Infatti quando compiliamo un documento il compilatore ci avvisa della presenza di errori. Tuttavia normalmente l'esecuzione della compilazione viene interrotta al punto in cui viene incontrato un errore, mentre noi vogliamo che tutto il codice sorgente venga analizzato affinché siano riportati tutti gli errori presenti e ciò può essere realizzato passando a
pdflatex
l'opzione
-interaction=nonstopmode
. Altre opzioni utili nel nostro caso sono
-draftmode
, che impedisce la creazione del file di output in PDF velocizzando così l'esecuzione del controllo, e
-file-line-error
, per fare in modo che Flymake possa effettuare correttamente il
parsing dell'output di
pdflatex
. Dunque per utilizzare
pdflatex
come strumento di controllo della sintassi dovremo inserire il seguente codice nel nostro file di inizializzazione:
(require 'flymake)
(defun flymake-get-tex-args (file-name)
(list "pdflatex"
(list "-file-line-error" "-draftmode" "-interaction=nonstopmode" file-name)))
(add-hook 'LaTeX-mode-hook 'flymake-mode)
Ricordo sempre che si potrebbe non voler inserire l'ultima riga preferendo attivare manualmente la modalità
flymake-mode
solo nei documenti in cui si desidera effettivamente svolgere l'analisi sintattica.
Una volta attivata la modalità
flymake-mode
gli errori saranno evidenziati in rosso e passando sul testo incriminato con il mouse oppure usando il comando
M-x flymake-display-err-menu-for-current-line
verrà mostrata la spiegazione dell'errore segnalato.
Devo evidenziare che
pdflatex
è piuttosto dispendioso dal punto di vista delle risorse di sistema e inoltre molto lento per i documenti grandi. Facendo delle prove su un documento di circa 200 pagine nel documento di output ChkTex e Lacheck hanno impiegato meno di mezzo secondo per concludere l'analisi dell'intero codice sorgente, contro gli oltre 20 secondi di
pdflatex
. D'altra parte il programma più affidabile è il compilatore stesso, infatti è l'unico dei tre programmi qui discussi in grado di riconoscere i comandi o pacchetti non esistenti. Se si preferisce la velocità a discapito della precisione allora lo strumento ideale è ChkTex, se invece si vuole un controllo più preciso e mirato allora
pdflatex
fa al caso vostro (in particolare nei documenti piccoli).
Trovate maggiori informazioni su Flymake sul sito Emacs Wiki alle pagine
Fly Make e
Flymake Tex (da cui questo post prende ispirazione), oppure nel manuale consultabile dentro Emacs con
C-h i d m Flymake RET
.