I registri di tipo\skippossono essere allocati in sintassi TEX con\newskipe in sintassi LATEX con\newlength. La scelta di usare questi anche per le lunghezze definibili dall’utente è dovuta probabilmente al fatto che il nucleo di LATEX alloca già 92 registri\dimen, mentre è molto più parco con gli\skip, allocandone solo 31. I pacchetti esterni spesso riservano altri registri\dimen, rendendo possibile il raggiun-gimento del tradizionale limite di 255, così si è scelto di lavorare anche con gli\skip. Per fare un confronto, Plain TEX alloca sei registri di tipo\dimene otto di tipo\skip. La sintassi è molto simile a quella per i registri dimensionali, ma per questi è possibile specificare il grado di espandibilità e di contraibilità:
\newskip\pippo
\pippo=〈dimensione 〉 plus 〈dimensione* 〉 minus 〈dimensione* 〉
dove 〈dimensione 〉 è esattamente come prima e vale quasi lo stesso anche per le specificazioni di una 〈dimensione* 〉 dove però si possono impiegare alcune unità di misura supplementari,
che indicano grandezze infinite con ‘grado di infinità’ crescente. Ciò che sta a destra dell’uguale (il segno, in questo caso, è opzionale) è ammissibile come argomento di\hskipe\vskipo, in sintassi LATEX, di\hspacee\vspace. Attenzione, gli ar-gomenti di\hskipe\vskipnon sono mai racchiusi tra graffe, quelli dei comandi LATEX devono esserlo (se non consistono di un unico token).
Si faccia attenzione che quando si scrive qualcosa come
\pippo=2.5\pluto
dove\pippoe\plutosono registri\skip, la dimensione memorizzata in\pippo non avrà grado di espandibilità né di contraibilità. Perciò
\pluto=2pt plus 1fil minus 1pt \pippo=2\pluto
equivale a dire
\pippo=4pt
Diverso è il caso di\multiplyo\divide: dopo
\pluto=2pt plus 1fil minus 1pt \multiply\pluto by 3
il contenuto del registro sarà6pt plus 3fil minus 3pt. La sintassi LATEX permette di specificare allo stesso modo: \newlength{\pippo}
\setlength{\pippo}{3pt plus 5pt minus 1pt} \setlength{\pippo}{0pt plus 1fil minus 1fil} \addtolength{\pippo}{2pt plus 2fill minus 3pt}
ma non ha macro per\multiplyo\divide. Si possono specificare le componenti pluseminusin\addtolengthpurché il registro sia stato allocato con\newlength (oppure con\newskipche è equivalente).
Facciamo un esempio per capire il concetto di ‘grado di infinità’. Se scriviamo \hbox to 5cm{...}stiamo chiedendo che il testo tra graffe occupi una larghezza di 5 cm. Ovviamente occorrerà specificare lunghezze elastiche di spaziatura all’interno, altrimenti si incorrerà in un messaggio di “Underfull \hbox”.
\hbox to 5cm{ciao\hskip 0pt plus 1fil\relax ciao\hskip 0pt plus 1fil\relax ciao} \hbox to 5cm{ciao\hskip 0pt plus 1fil\relax
ciao\hskip 0pt plus 3fil\relax ciao}
scriverà le tre parole in modo che fra la prima ‘c’ e l’ultima ‘o’ ci siano esattamente 5 cm, con spaziature uguali fra le tre parole nel primo caso, la seconda spaziatura tripla della prima nell’altro:
ciao ciao ciao
ciao ciao ciao
Dovrebbe essere più chiaro se indichiamo gli spazi con filetti:
ciao ciao ciao
Proviamo a modificare il primo esempio, usando nella seconda spaziatura un grado di infinità maggiore
\hbox to 5cm{ciao\hskip 0pt plus 1fil\relax ciao\hskip 0pt plus 1fill\relax ciao}
ciaociao ciao
ciaociao ciao
e, come si vede, lo spazio espandibile con grado di infinità maggiore si ‘prende tutto’. La seconda riga mostra con un filetto la spaziatura scelta.
*Si noti l’uso di\relaxche è indicato quando si adoperino le unità di misura ‘infinite’ dopo \hskipo\vskip. Si provi a scrivere infatti
!\hbox to 5cm{\hskip 0pt plus 1fil Libertà\hskip 0pt plus 1fil}! e si avrà una notevole sorpresa, dal momento che si ottiene
! ibertà!
La spiegazione TEXnica si può trovare nel TEXbook e non ci interessa molto: il rischio non c’è usando i comandi LATEX\hspacee\vspaceche dunque consigliamo senz’altro.
Non è il caso di specificare le regole precise con cui TEX tratta questi infiniti; di fatto non agisce con grandezze infinite, ma con grandezze finite superiori a quanto si possa specificare normalmente: la massima lunghezza ottenibile è infatti circa 5,76 m, ma ovviamente TEX è in grado di lavorare internamente con numeri più grandi ed è questi che usa in casi del genere. Il coefficiente dell’unitàfil,fillofillldeve essere minore, in valore assoluto, di 16384 = 214.
In LATEX esiste un sinonimo di “0pt plus 1fill”, cioè\fill, e, più in generale, \stretch{〈numero decimale 〉}può essere usato in ogni caso in cui si desidera avere “0pt plus 〈numero decimale 〉fill”.
Va ricordato che la specificazione di una lunghezza elastica deve avere la di-mensione naturale anche se nulla; il grado di espandibilità e quello di contraibilità possono mancare, ma se presenti entrambi devono essere dati nell’ordine indicato prima. Una specificazione come
\vspace{2pc plus 3pt minus 6pt}
significa che si desidera uno spazio di 24 pt (due righe di stampa a corpo 10) che però può essere aumentato fino a 27 pt o ridotto fino a 18 pt. Questo aumento o riduzione sarà diviso fra tutte le spaziature elastiche presenti sulla pagina, ma non sarà preso in considerazione se nella pagina dovesse comparire una spaziatura con grado di espandibilità infinito.
*Sembra irragionevole dare grado di contraibilità infinito, ma ha i suoi usi: un esempio tipico è la macro\rlapche risolve il problema di stampare qualcosa ‘senza avanzare’. La macro è definita in LATEX come
\def\rlap#1{\hbox to 0pt{#1\hskip 0pt minus -1fil}}
e il funzionamento è semplice: vogliamo riempire una box che abbia una larghezza di 0 pt; il testo dato come argomento occuperà x pt che certamente eccedono la larghezza richiesta e quindi occorre fare ricorso alle spaziature contraibili presenti nella box; ce n’è una, che è contraibile fino a una lunghezza negativa ‘infinita’, che è sufficiente ai nostri scopi. L’ambiente in cui ci troviamo usa la macro\llapdefinita in modo analogo per piazzare la manina nello spazio di solito destinato al rientro tramite
\llap{\ding{42}\ }
dove si usa la macro\dingdel pacchettopifont.
Si potrebbe obiettare che la vera definizione di\rlapè \def\rlap#1{\hb@xt@\z@{#1\hss}}
ma\hb@xt@è semplicemente un’abbreviazione di\hbox tomentre\z@è il nome di un registro\dimenche contiene una lunghezza nulla. L’unica differenza è dunque\hss, un comando primitivo di TEX che equivale a\hskip 0pt plus 1fil minus -1fil; in questo caso l’infinita espandibilità è irrilevante.
Ogni registro\skippuò essere usato in situazioni in cui TEX si attende una dimensione, i valori di espandibilità e di contraibilità vengono trascurati. Si può anche usare un registro\dimenquando TEX si aspetta una dimensione elastica; se non vengono aggiunte le specifiche di espandibilità e contraibilità un registro di tipo \skipsi comporta esattamente come uno\dimen.
*È possibile usare un registro di tipo\dimeno\skipquando TEX si aspetta un 〈numero 〉 e in tal caso viene usato il valore in punti scalati. Perciò
\newdimen\pippo \newcount\pluto \pippo=1pt \pluto=\pippo
assegna al contatore\plutoil valore 65 536. Anche il viceversa è possibile: \pluto=27 \pippo=\pluto pt
assegna al registro\plutola lunghezza 27 pt. È molto comodo il registro\dimenche LATEX chiama\p@: in esso è caricata la lunghezza di 1 pt. Perciò l’assegnazione di prima si scrive in modo più efficiente\pippo=\pluto\p@o\pippo=27\p@.