• Non ci sono risultati.

Il file texmf.cnf

Nel documento Appunti di programmazione in L (pagine 185-188)

Il titolo di questa sezione in realtà dovrebbe avere l’articolo al plurale. Infatti ogni programma del sistema TEX che sia stato collegato alla libreriakpathsealegge tutti quelli che trova nei vari alberi. Per esempio, la distribuzione MacTEX che è la TEX Live impacchettata per Mac OS X, ne scrive uno al livello massimo:

/usr/local/texlive/2008/texmf.cnf il cui contenuto, a parte righe di commento, è

TEXMFHOME = ~/Library/texmf

Come detto, i file con questo nome vengono letti in un certo ordine: albero locale (al livello massimo e poi dentroweb2c); albero principale (di nuovo al livello massimo e poi dentroweb2c). Il compito di questi file è di definire le variabili d’ambiente implicite e conta la prima definizione che si incontra. Quelle successive sono del tutto ignorate. Per questo sui sistemi Mac OS X l’albero personale, definito appunto dalla variabileTEXMFHOMEsta in~/Library/texmfe non nel posto definito dal file

/usr/local/texlive/2008/texmf/web2c/texmf.cnf che per questa variabile riporta

TEXMFHOME = ~/texmf

(secondo le convenzioni Unix,~in un percorso indica la directory iniziale di ciascun utente).

Ma come fakpathseaa trovare i filetexmf.cnf? Ciascun programma è compilato in modo da definire tre variabili al momento del lancio:

SELFAUTOLOC SELFAUTODIR SELFAUTOPARENT

La prima è la directory dove risiede l’eseguibile, le altre due i livelli immediatamente superiori nell’ordine. Perciò, su una distribuzione TEX Live 2008, avremo i seguenti valori:

/usr/local/texlive/2008/bin/〈arch 〉

/usr/local/texlive/2008/bin /usr/local/texlive/2008

dove 〈arch 〉 sta a indicare la directory degli eseguibili per la propria macchina. Ora la libreria sa dove trovare i file, perché al momento della sua installazione ha ricevuto una definizione della variabile implicitaTEXMFCNF; il valore sul sistema in cui questo documento è stato compilato è

{/usr/local/texlive/2008/bin/universal-darwin,\ /usr/local/texlive/2008/bin,/usr/local/texlive/2008}\ {,{/share,}/texmf{-local,}/web2c}

(le barre rovesce indicano continuazione). La sintassi è simile a quella usata dal-le comuni shell: ciò che è tra parentesi graffe è ‘espanso’. Perciò questo sarebbe equivalente a dare i seguenti percorsi:

/usr/local/texlive/2008/bin/universal-darwin:\ /usr/local/texlive/2008/bin:\

/usr/local/texlive/2008:\

/usr/local/texlive/2008/texmf/web2c

dal momento che le altre directory che risulterebbero non esistono. Dunque il programma trova primatexmf.cnfsotto/usr/local/texlive/2008e poi quello due livelli più in basso. Non è difficile configurarlo per altri percorsi, come avviene nelle distribuzioni GNU/Linux che preferiscono avere gli eseguibili in aree particolari. Il vantaggio di questo approccio è che diverse distribuzioni di TEX possono coesistere, all’utente o all’amministratore basta impostare in modo conveniente la variabilePATH.2

Una volta che il programma ha letto i filetexmf.cnf, conosce le variabili implicite che gli permettono di trovare i file di cui ha bisogno. Per esempio, la variabile più importante che èTEXMF:

{~/.texlive2008/texmf-config,\ ~/.texlive2008/texmf-var,\ ~/Library/texmf,\ !!/usr/local/texlive/2008/texmf-config,\ !!/usr/local/texlive/2008/texmf-var,\ !!/usr/local/texlive/2008/texmf,\ !!/usr/local/texlive/2008/../texmf-local,\ !!/usr/local/texlive/2008/texmf-dist}

che espansa secondo le regole equivale al seguente insieme di percorsi:

~/.texlive2008/texmf-config:\ ~/.texlive2008/texmf-var:\ ~/Library/texmf:\ /usr/local/texlive/2008/texmf-config:\ /usr/local/texlive/2008/texmf-var:\ /usr/local/texlive/2008/texmf:\ /usr/local/texlive/2008/../texmf-local:\ /usr/local/texlive/2008/texmf-dist

ma con molte informazioni in più. I file nei percorsi con!!non sono cercati sul disco, ma solo tramite la base di datils-Rche risiede in essi. L’espansione delle graffe è ricorsiva e si basa sul principio chex{a,b}ysi espande axay:xbycome richiesto dalla sintassi Unix per i percorsi multipli.

Come si vede, TEX Live mantiene anche due alberi ‘nascosti’ nella directory di ciascun utente, dove registrare file di configurazione e file in genere generati

2MacTEX definisce un alias/usr/texbinche punta a un altro alias il quale a sua volta punta alla directory dove si trovano gli eseguibili; la connessione fra questi alias è decisa da un pannello di preferenze dove si può scegliere fra le distribuzioni presenti.

automaticamente dalle azioni dell’utente stesso, di cui perciò non deve curarsi se non in caso di pasticci.

La libreriakpathseapuò essere interrogata tramite il programmakpsewhichche accetta parecchie opzioni. Per esempio

kpsewhich --expand-var \$TEXMF

produce il valore impostato per questa variabile dopo la lettura dei filetexmf.cnf. Si noti come si usi il carattere$per accedere al valore della variabile, ma che questo deve essere nascosto alla shell con la barra rovescia. Se desideriamo vedere i percorsi effettivi corrispondenti, possiamo scrivere

kpsewhich --expand-path \$TEXMF

L’altra variabile importante, il cui valore può dipendere dalla piattaforma su cui si lavora, perché gli sviluppatori per le varie distribuzioni GNU/Linux o altri sistemi Unix possono aver deciso di sistemare gli alberi in posizioni diverse da quelle normali per TEX Live, èTEXMFLOCAL; il valore di default è

/usr/local/texlive/2008/../texmf-local

Rilevante è anche la variabileTEXINPUTSche potrebbe essere

.:{~/.texlive2008/texmf-config,\ ~/.texlive2008/texmf-var,\ ~/Library/texmf,\ !!/usr/local/texlive/2008/texmf-config,\ !!/usr/local/texlive/2008/texmf-var,\ !!/usr/local/texlive/2008/texmf, !!/usr/local/texlive/2008/../texmf-local,\ !!/usr/local/texlive/2008/texmf-dist}\ /tex/{kpsewhich,generic,}//

della quale è meglio non riportare l’espansione. Infatti le doppie barre alla fine significano che ciascuna directory che risulterebbe dall’espansione di primo livello va espansa ricorsivamente su tutte le proprie sottodirectory.

La libreriakpathseapermette anche di impostare valori diversi per una variabile secondo il nome con cui è chiamato l’eseguibile.

Quando l’utente lancia una compilazione conpdflatexin realtà esegue il pro-grammapdftexcon una certa serie di opzioni, per la precisione

pdftex -fmtname pdflatex -etex -output-format=pdf mentre l’esecuzione dilatexsarebbe in realtà di

pdftex -fmtname latex -etex -output-format=dvi

Il tutto in modo trasparente, come si suol dire: non occorre che l’utente sappia di questo. Analogamente,xelatexesegue

xetex -fmtname xelatex -etex -output-driver=xdvipdfmx

La libreriakpathseaimposta la variabileTEXINPUTSper la ricerca dei file come quella ‘nuda’ o, se per caso esiste, con la variabileTEXINPUTS.〈prog 〉. Più esplicitamente, se nella configurazione è presente una variabile

TEXINPUTS.pdflatex

il programmapdflatexuserà quella per la ricerca dei file. Così, impostando in modo diverso

TEXINPUTS.xelatex

sarà possibile avere percorsi diversi per i due programmi, usualmente per dare precedenze differenti. Sul sistema in cui sono composte queste note abbiamo

TEXINPUTS.pdflatex = .:\ {~/.texlive2008/texmf-config,\ ~/.texlive2008/texmf-var,\ ~/Library/texmf,\ !!/usr/local/texlive/2008/texmf-config,\ !!/usr/local/texlive/2008/texmf-var,\ !!/usr/local/texlive/2008/texmf,\ !!/usr/local/texlive/2008/../texmf-local,\ !!/usr/local/texlive/2008/texmf-dist}\ /tex/{latex,generic,}//

mentre perxelatexabbiamo

TEXINPUTS.xelatex = .:\ {~/.texlive2008/texmf-config,\ ~/.texlive2008/texmf-var,\ ~/Library/texmf,\ !!/usr/local/texlive/2008/texmf-config,\ !!/usr/local/texlive/2008/texmf-var,\ !!/usr/local/texlive/2008/texmf,\ !!/usr/local/texlive/2008/../texmf-local,\ !!/usr/local/texlive/2008/texmf-dist}\ /tex/{xelatex,latex,generic,}//

Si noti la piccola differenza, ma sostanziale: i file specifici perxelatextrovano posto in una directory che viene trovata prima rispetto a quelle normali.

Il modo per interrogare la libreria e ottenere questo valore è

kpsewhich --progname xelatex --expand-var \$TEXINPUTS

Si noti che in tutte questi percorsi è presente la directory dalla quale avviene il lancio del programma, al primo posto: è indicata con il punto.

Nel documento Appunti di programmazione in L (pagine 185-188)