• Non ci sono risultati.

Estensioni PDF TEX

Nel documento Appunti di programmazione in L (pagine 150-155)

Quasi tutte le nuove primitive introdotte daPDFTEX hanno nome che comincia con \pdf.... Parleremo solo di quelle più rilevanti, ci si riferisca al manuale diPDFTEX per trovarle tutte.

Il condizionale\ifpdfprimitiveha come test un comando e risulta vero se il comando è una primitiva diPDFTEX (comprese quelle di TEX originale e quelle di

ε-TEX) con il significato primitivo. Perciò in LATEX \ifpdfprimitive\input

è falso, perché\inputnon ha il significato primitivo. Forse più utili sono i condizio-nali\ifpdfabsnume\ifpdfabsdim, analoghi a\ifnume\ifdim, che confrontano i valori assoluti dei numeri o delle dimensioni date nel test.

Se\comandoè il nome di una primitiva, con

\pdfprimitive\comando

si accede al significato primitivo di\comando, indipendentemente dal valore attuale. Perciò\pdfprimitive\pardà sempre il valore primitivo di\par, che in LATEX viene ridefinito molto spesso. Se\comandonon ha mai avuto lo stato di primitiva o non è definito, l’espansione è nulla.

Con\pdfnoligatures〈font 〉 si disabilitano le legature per il 〈font 〉; per esempio \texttt{!‘--}→¡–

{\texttt{\pdfnoligatures\font !‘--}}→ !‘--\texttt{!‘--}→

!‘--Con 〈font 〉 si intende un comando di scelta di font; l’uso di\fontper riferirsi al font attuale è già stato visto. Si faccia attenzione che questo comando è globale: se disabilitiamo le legature del font corrente ciò varrà per questo font per tutto il resto del documento, anche se il comando è dato in un gruppo, come si vede esaminando il risultato nella terza riga.

Di\quitvmodee\pdfpxdimenabbiamo già parlato. Non menzioneremo le altre primitive che vengono usate da pacchetti specializzati per inclusione di immagini o trattamento microtipografico del testo (microtype).

*InPDFTEX è disponibile\pdffilemoddateche produce una stringa di caratteri di catego-ria 12 che esprime la data e l’ora di modifica del file dato come argomento:

\pdffilemoddate{\jobname.log}→D:20090610184155+02’00’

La stringa prodotta contiene esattamente 23 byte; i primi due sono sempreDe:a cui seguono le quattro cifre dell’anno, due cifre per il mese, due per il giorno, due per l’ora, due per i minuti e due per i secondi. Segue un+oppure-per indicare se l’ora è in anticipo o in ritardo rispetto all’ora universale; la differenza rispetto a questa è indicata dagli ultimi sei byte nella forma 〈cifra 〉〈cifra 〉〈cifra 〉〈cifra 〉’. Se desideriamo avere a disposizione ciascuno dei byte, per scrivere la data e l’ora della compilazione in vari formati, possiamo scrivere nel preambolo del documento \def\@initparsedate{\count@=\@ne \expandafter\@startparsedate\pdffilemoddate{\jobname.log}} \def\@datebytedef#1{\@namedef{@datebyte\number\count@}{#1}} \def\@datebyteuse#1{\@nameuse{@datebyte#1}} \def\@startparsedate#1#2#3{\@datebytedef{#3}\@parsedate}

\def\@parsedate#1{\advance\count@\@ne \@datebytedef{#1}% \ifnum\count@<21 \expandafter\@parsedate \fi} \AtBeginDocument{\@initparsedate}

e al byte numero i (la numerazione parte dal terzo, perché i primi due sono irrilevanti) si potrà accedere con\@datebyteuse{i}; l’accesso è rimandato all’inizio del documento, ma non è strettamente necessario, perché il file.logviene aperto subito. Per esempio l’ora attuale si può stampare definendo

\newcommand\pdfnow{\@datebyteuse{9}\@datebyteuse{10}:% \@datebyteuse{11}\@datebyteuse{12}}

oppure, usando la macro\estraicaratteredefinita prima, \newcommand\datebyte[1]{%

\estraicarattere[#1]{\pdffilemoddate{\jobname.log}}} \newcommand\pdfnow{%

\datebyte{11}\datebyte{12}:\datebyte{13}\datebyte{14}}

perché nella stringa prodotta da\pdffilemoddatei primi due caratteri sono sempreD:, dei quali invece la procedura precedente non tiene conto. Questo documento è stato compilato il 10 giugno 2009 alle ore 18:41 (UTC + 02:00).

Se non servisse avere a disposizione tutti i byte, ma solo i valori di anno, mese e così via, possiamo agire in modo più semplice:

\def\parsedate{\expandafter\@parsedate\pdffilemoddate{\jobname.log}} \def\@parsedate#1#2{\@parsedateyear} \def\@parsedateyear#1#2#3#4{\def\Year{#1#2#3#4}\@parsedatemonth} \def\@parsedatemonth#1#2{\def\Month{#1#2}\@parsedateday} \def\@parsedateday#1#2{\def\Day{#1#2}\@parsedatehour} \def\@parsedatehour#1#2{\def\Hour{#1#2}\@parsedateminutes} \def\@parsedateminutes#1#2{\def\Minutes{#1#2}\@parsedateseconds} \def\@parsedateseconds#1#2{\def\Seconds{#1#2}\@parsedatediff} \def\@parsedatediff#1{\def\UTCDiff{#1}\@parsedateutchour} \def\@parsedateutchour#1#2#3#4#5#6{% \def\UTCHour{#1#2}\def\UTCMinutes{#4#5}}

La macro\parsedateavvia un processo che raccoglie via via i byte della stringa prodotta da \pdffilemoddatedefinendo\Year,\Month,\Day,\Hour,\Minutes,\Seconds,\UTCDiff, \UTCHoure\UTCMinutes.

Esempi e complementi

8.1 Un ambiente per citazioni

Vogliamo perfezionare l’ambientecitazionegià presentato per evitare una realizza-zione come questa

Quo usque tandem abutere, Catilina, patientia nostra? Quam diu etiam furor iste tuus nos eludet? Quem ad finem sese effrenata iactabit audacia? Nihilne te nocturnum praesidium Palati, nihil urbis vigiliae, nihil timor populi, nihil concursus bonorum omnium, nihil hic muni-tissimus habendi senatus locus, nihil horum ora voltusque moverunt?

Cicerone

perché preferiremmo che il nome dell’autore andasse a filo del margine destro, ri-spetto al testo rientrato, anche se l’ultima riga della citazione arriva nelle vicinanze del margine. Occorre sapere che l’esecuzione del comando\parcomporta l’in-serimento di quattro elementi; il primo è\unskipper annullare eventuali spazi che fossero presenti nel testo; poi viene inserito\penalty10000che impedisce di ‘spezzare la riga in quel punto’ annullando ciò che accade dopo; il terzo elemen-to è\hskip\parfillskipe l’ultimo è\penalty-10000. Il quarto elemento serve per forzare TEX a terminare la riga; se non ci fosse il secondo, la lunghezza elastica inserita per terza potrebbe sparire, come spariscono gli spazi fra parole a fine riga. Il registro\parfillskipdi solito contiene la lunghezza elastica specificata come 0pt plus 1filled è per questo che l’ultima riga di un capoverso può finire prima del margine. Il capoverso precedente è stato composto dando al registro valore nullo, quindi il punto è esattamente a filo del margine. Nel caso della citazione dalle

Catilinarie la lunghezza elastica\hfillsparisce perché arriva esattamente dopo la fine di una riga. Potremmo impostare\parfillskipa zero:

Quo usque tandem abutere, Catilina, patientia nostra? Quam diu etiam furor iste tuus nos eludet? Quem ad finem sese effrenata iacta-bit audacia? Nihilne te nocturnum praesidium Palati, nihil urbis vigi-liae, nihil timor populi, nihil concursus bonorum omnium, nihil hic munitissimus habendi senatus locus, nihil horum ora voltusque

move-runt? Cicerone

Il risultato non è dei migliori: per arrivare a una composizione decente, TEX ha inserito tre cesure invece dell’unica precedente. Ciò che desideriamo invece è che il

nome dell’autore si sposti al margine destro anche stando su una riga a sé, se non rimane spazio sufficiente nell’ultima riga della citazione.

Una soluzione è nel TEXbook e consiste nell’inserire la seguente lista di token al momento di terminare il capoverso:

{\unskip\nobreak\hfil\penalty50

\hspace{2em}\null\nobreak\hfil\textit{Cicerone} \parfillskip=0pt \finalhyphendemerits=0 \par}

Il gruppo impedisce che l’impostazione del valore di\parfillskipsi propaghi al di fuori; TEX incontra nel gruppo il comando\pare userà il valore dei parametri in quel momento per la composizione finale del capoverso.

*La sequenza\unskip\nobreakfa quello che dovrebbe eseguire il normale\par(i primi due elementi visti prima). Poi viene inserita una spaziatura elastica infinitamente estendi-bile, quindi una penalità che rende possibile terminare la riga lì, senza però incoraggiare TEX a farlo. Un altro spazio serve per distanziare di almeno 2 em il testo dall’autore, se la riga dovesse terminare alla penalità sparirebbe e la riga comincerebbe con\nullche non può essere scartato (solo le spaziature e le crenature possono); il comando\nobreak as-sicura ora che la riga non possa terminare a\nulle quindi rimane\hfilche sposta il nome dell’autore a filo del margine. Infatti\parfillskipviene impostato a zero. Il ri-manente comando prima di\parè un po’ esoterico, serve per non impedire una cesura all’ultima riga della citazione che in alcuni casi permette una migliore composizione. *

Nel capoverso precedente la distanza del punto finale dal margine destro è esattamente uguale al rientro iniziale, perché è stata data l’istruzione\parfillskip=\parindent. In questo modo la copia riflessa della mano rende il capoverso ‘simmetrico’. Il parametro \finalhyphendemeritscontiene un intero che dice quanto sia gradita in composizione la presenza di una cesura nella penultima riga di un capoverso; il suo valore per questo docu-mento è 50000000 ed è piuttosto elevato; impostandolo temporaneamente a zero si dice a TEX che quell’ultima cesura è accettabile in quel contesto.

Ecco perciò la definizione completa dell’ambientecitazione:

\newenvironment{citazione}[1]

{\def\autorecitazione{#1}\begin{quotation}} {{\unskip\nobreak\hfil\penalty50

\hspace{2em}\null\nobreak \hfil\textit{\autorecitazione}

\parfillskip=0pt \finalhyphendemerits=0 \par} \end{quotation}}

Non c’è bisogno di mettere%dopo50perché si tratta di un numero richiesto dal-la sintassi; non occorre nemmeno dopo\textit{\autorecitazione}perché lo spazio viene eliminato da\par. Perché non occorre nemmeno nella penultima riga?

Quo usque tandem abutere, Catilina, patientia nostra? Quam diu etiam furor iste tuus nos eludet? Quem ad finem sese effrenata iactabit audacia? Nihilne te nocturnum praesidium Palati, nihil urbis vigiliae, nihil timor populi, nihil concursus bonorum omnium, nihil hic munitis-simus habendi senatus locus, nihil horum ora voltusque moverunt?

Cicerone

*Parlando di\parfillskippossiamo dare un’indicazione di come preparare un testo che preveda righe da riempire a mano. Lo realizziamo come un ambientelinee:

\newenvironment{linee}[1][1] {\flushleft\minipage{\textwidth} \linespread{#1}\selectfont \def\\{\begingroup\leavevmode\parfillskip=0pt \hrulefill\endgraf\endgroup}} {\endminipage\endflushleft}

L’ambienteflushleftche circonda il tutto è per dare una spaziatura attorno al nostro testo e per annullare il rientro. Segue unaminipageper impedire che il testo sia spezzato su più pagine. L’argomento opzionale serve per aumentare l’avanzamento di riga del fattore indicato, tramite\linespread; occorre\selectfontper farlo entrare in azione. Nell’ambiente possia-mo usare\\per dire che vogliamo una linea che si estenda dalla fine del testo (o dal margine sinistro) fino al margine destro. Impostando\parfillskipa zero e dando\hrulefill appe-na prima di chiudere il capoverso (con\endgrafche equivale a\parnel significato primitivo) otteniamo esattamente ciò che ci serve. Il\leavevmodeserve per il caso in cui ci serve una linea dal margine sinistro. Vediamo un esempio:

Testo che precede. \begin{linee}[1.5]

Si dia una breve dimostrazione dell’ultimo teorema di Fermat \\ \\ \\ \end{linee}

Testo che segue.

Si otterrà qualcosa di simile a questo: Testo che precede.

Si dia una breve dimostrazione dell’ultimo teorema di Fermat

Testo che segue.

Nel documento Appunti di programmazione in L (pagine 150-155)