lunedì 3 agosto 2009

Aggiungere pacchetti per LaTeX

Se vuoi subito scoprire come installare pacchetti per LaTeX vai direttamente al riepilogo, se invece vuoi leggere le mie (tutto sommato inutili) peripezie per aggiungere un pacchetto puoi leggere tutto il post.

Da un po' di tempo mi sto dilettando a scrivere testi con LaTeX. Qualche giorno fa avevo la necessità di installare un nuovo pacchetto LaTeX, per la precisione il pacchetto empheq. Ho dovuto navigare un po' su Internet prima di trovare la soluzione, mettendo insieme varie guide trovate in giro. Per altro, alla fine del mio peregrinare ho scoperto che avrei potuto molto più facilmente installare (per esempio da Synaptic) in Ubuntu il pacchetto texlive-latex-extra che fornisce poco meno di 500 pacchetti LaTeX (qui potete leggere l'elenco dei pacchetti forniti nella versione presente in Ubuntu Jaunty).

In attesa di vedere in un futuro non troppo lontano in Ubuntu la versione 2008 della distribuzione TeX Live, con cui pare sia molto semplice installare nuovi pacchetti LaTeX (anche quelli non presenti in texlive-latex-extra), spiegherò come ho fatto.

La guida che ho seguito inizialmente è stata http://www.guit.sssup.it/installazione/pacchetti.php. Per prima cosa, per installare un nuovo pacchetto, è necessario ovviamente scaricarlo. Nel mio caso, per ottenere il pacchetto empheq ho scaricato l'archivio http://theory.uwinnipeg.ca/scripts/CTAN/macros/latex/contrib/mh.zip. L'ho scompattato e ho compilato il file empheq.dtx in modo da ottenere il file empheq.sty. Il problema che sorgeva a questo punto era posizionare il pacchetto in una cartella in cui LaTeX sarebbe stato in grado di trovarlo. Infatti, compilando un sorgente LaTeX che includeva empheq ottenevo il seguente messaggio di errore:
! LaTeX Error: File `empheq.sty' not found.
In realtà, compilando il sorgente da terminale, quando compare questo messaggio di errore è possibile inserire il percorso del pacchetto, ma ovviamente questa non è una soluzione molto pratica. Una cartella in cui si potrebbero inserire i pacchetti affinché LaTeX sia in grado di utilizzarli è /usr/share/texmf/tex/latex/, ma personalmente preferisco per svariati motivi salvare queste cose all'interno della home (anche per evitare ogni volta di dover diventare root per aggiungere o modificare un pacchetto). Sul forum GUIT avevo letto che per sapere qual è la cartella in cui salvare il pacchetto bisogna dare nel terminale il seguente comando
kpsexpand '$TEXMFHOME'
che mi ha restituito come output
/home/luke/texmf
Ho quindi spostato il pacchetto nella cartella indicata (che ho creato perché non esisteva) e provato a ricompilare il sorgente però ricevendo sempre il precedente messaggio di errore. Con un po' di fortuna ho trovato un altro comando per trovare le cartelle in cui salvare i pacchetti:
kpsepath tex
che ha restituito questo output un po' illeggibile:
.:/home/luke/.texmf-config/tex/kpsewhich//:/home/luke/.texmf-var/tex/kpsewhich//:/home/luke/texmf/tex/kpsewhich//:/etc/texmf/tex/kpsewhich//:!!/var/lib/texmf/tex/kpsewhich//:!!/usr/local/share/texmf/tex/kpsewhich//:!!/usr/share/texmf/tex/kpsewhich//:!!/usr/share/texmf-texlive/tex/kpsewhich//:/home/luke/.texmf-config/tex/generic//:/home/luke/.texmf-var/tex/generic//:/home/luke/texmf/tex/generic//:/etc/texmf/tex/generic//:!!/var/lib/texmf/tex/generic//:!!/usr/local/share/texmf/tex/generic//:!!/usr/share/texmf/tex/generic//:!!/usr/share/texmf-texlive/tex/generic//:/home/luke/.texmf-config/tex///:/home/luke/.texmf-var/tex///:/home/luke/texmf/tex///:/etc/texmf/tex///:!!/var/lib/texmf/tex///:!!/usr/local/share/texmf/tex///:!!/usr/share/texmf/tex///:!!/usr/share/texmf-texlive/tex///
È un elenco che utilizza i due punti come separatore fra le cartelle (più qualche punto esclamativo messo con non so quale criterio). Per renderlo un po' più comprensibile ho utilizzato 3 pipe che restringessero inoltre il campo alle cartelle contenute nella home:
kpsepath tex | sed 's/:/\n/g' | tr -d '!' | grep home
con questo output:
/home/luke/.texmf-config/tex/kpsewhich//
/home/luke/.texmf-var/tex/kpsewhich//
/home/luke/texmf/tex/kpsewhich//
/home/luke/.texmf-config/tex/generic//
/home/luke/.texmf-var/tex/generic//
/home/luke/texmf/tex/generic//
/home/luke/.texmf-config/tex///
/home/luke/.texmf-var/tex///
/home/luke/texmf/tex///

In particolare ha attirato la mia attenzione l'ultima cartella, /home/luke/texmf/tex/ (lasciate stare gli slash in più alla fine dei percorsi). Ho quindi creato la cartella /home/luke/texmf/tex/ e spostato nuovamente il pacchetto empheq.sty in questa cartella. Provando a ricompilare il sorgente però continuavo a ricevere sempre lo stesso errore che segnala pacchetto non trovato. Nella guida http://wiki.ubuntu-it.org/Ufficio/Latex ho letto che per aggiornare l'elenco dei pacchetti era necessario dare il comando
sudo texhash
Leggendo però il manuale del comando (nel terminale: man texhash) ho scoperto che quel comando non aggiorna l'elenco dei pacchetti contenuti nella home. Per fare ciò bisogna dare quindi il comando
texhahs ~/texmf
(ricordo che la tilde ~ è un'abbreviazione del percorso della home dell'utente corrente) e finalmente sono riuscito a compilare il sorgente.


Riepilogo delle operazioni da fare: scaricare il pacchetto e posizionare il file .sty nella cartella ~/texmf/tex (ovviamente creandola se non esiste). Se nell'archivio che si è scaricato non è presente un file .sty ma un .ins o un .dtx bisogna compilare questi file per ottenere il .sty, come spiegato qui. Quindi bisogna aggiornare l'elenco dei pacchetti LaTeX presenti nella cartella con il comando
texhash ~/texmf
e si può finalmente compilare il sorgente che include il nuovo pacchetto.

In realtà sarebbe sufficiente anche inserire il pacchetto nella stessa cartella in cui si trova il sorgente senza dover usare ulteriori comandi, ma trovo questa soluzione poco pratica nel caso in cui si dovessero avere sorgenti LaTeX in numerose cartelle diverse.


Precisazione del 18/8/2009: rileggendo con più attenzione di quanto non avessi fatto inizialmente la guida http://www.guit.sssup.it/installazione/pacchetti.php mi sono accorto che c'era scritto:
copiare il relativo file .sty nella sotto-cartella /tex/latex/ di uno dei tre alberi (eventualmente creando tale sotto-cartella, se non ci fosse già);
Quindi senza perdere tutto il tempo che ho perso avrei potuto subito notare che era necessario mettere i pacchetti nella sottocartella tex/latex/ di ~/texmf (in realtà a me funziona anche solo con tex/, non ho avuto bisogno di creare anche la sottocartella latex/). Resta comunque valido il procedimento descritto nel riepilogo.

2 commenti:

  1. Io per il latex utilizzo tex-live (2009) e kile su lxde.
    Ci sono un pò di trucchi per istallare tutto riducendo al minimo le dipendenze ed evitando che synaptic per istallare kile chieda una seconda istallazione di tex-live, visto che la prima non gli risulta. Il risultato finale però è decisamente buono. Gira tutto alla grande. Per istallare, aggiornare o togliere pacchetti su texlive c'è il programmino apposito. Kile è semplicemente eccezionale. Aiuta moltissimo nella realizzazione di un documento in latex e consente di creare documenti in pdf e vedere il risultato aprendo l'applicazione giusta semplicemente con una scorciatoia da tastiera.
    Ottimo per vedere in tempo reale cosa si sta facendo.

    Ciao ciao.
    Tommaso

    RispondiElimina
  2. So che già con la versione 2008 di Texlive è disponibile una utilità che si occupa di installare e aggiornare i pacchetti, però in Ubuntu è presente solo la 2007 (fortunatamente in Lucid ci sarà la versione 2009) quindi dovevo arrangiarmi in altro modo (so che è possibile installare ugualmente Texlive 2009 scaricando direttamente il programma dal sito oppure usando un repository di Launchpad, ma preferisco tenermi la versione del sistema).

    Per quanto riguarda l'editor di testo io uso Emacs + Auctex, ma dopo tutto è una questione di gusti personali ^^

    Ciao!

    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.