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.