domenica 24 aprile 2011

Emacs: effettuare il controllo della sintassi di documenti LaTeX

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.

3 commenti:

  1. Ottimo articolo. La procedura l'ho provata con Windows ma dava quakche problemi. Non appena installo TeX Live 2011 su Debian (si, sto provando Debian in Live su USB) rifaccio qualche prova.

    Tuttavia ora voglio chiederti una cosa: guardando meglio la figura ho notato che subito prima della documentclass, sta scritto foo.tex e due segni di direzione. Di cosa si tratta? Di una ''document bar''? Io so dell'esistenza della speedbar, ma occupa ulteriore spazio in un monitor gia' pieno, ed ho sempre ricercato la possibilita' di una document-bar. Mi daresti qualche informazione?

    Grazie
    Orlando

    ps.: questo messaggio l'ho scritto su Debian. Non so ancora impostare la tastiera per lettere accentante e cose varia: perdona la scrittura :-(

    RispondiElimina
  2. Pacchetto TabBar. Per ottenerlo su Debian ti basta installare il pacchetto "emacs-goodies-el" (che fornisce decine di estensioni per Emacs oltre a questa) e poi attiva Tabbar da "M-x customize-group RET tabbar RET" impostando "Tabbar mode" su "non-nil", oppure segui le istruzioni di EmacsWiki.

    Ciao!

    RispondiElimina
  3. Grazie mille! L'ho instalato sia su Debian che su Windows. Funziona alla grande.

    Grazie ancora,
    Orlando

    RispondiElimina

I commenti inseriti vengono lasciati dall'autore degli stessi accettandone ogni eventuale responsabilità civile e penale.
Il curatore del blog si riserva la possibilità di eliminare messaggi contenenti frasi offensive o spam.