Ci provo… 🙂
Quando si vuole aggiungere qualcosa all’indice (table of contents) si usa il comando `\addcontentsline{toc}{qualcosa}{Cosa voglio aggiungere}`
Se compilo un documento (avendo scritto [tt]\tableofcontents[/tt] da qualche parte) viene creato un file .toc che contiene la stringa `\contentsline {qualcosa}{Cosa voglio aggiungere}{numero di pagina}`
e [tt]\contentsline[/tt] è definito in latex.ltx come [tt]\def\contentsline#1{\csname l@#1\endcsname}
[/tt].
Cioè nel nostro caso richiama un comando [tt]\l@qualcosa[/tt]. pdflatex dovrà quindi eseguire [tt]\l@qualcosa{Cosa voglio aggiungere}{numero di pagina}[/tt].
Se guardi book.cls troverai: `\newcommand*\l@chapter[2]{%
\ifnum \c@tocdepth >\m@ne
\addpenalty{-\@highpenalty}%
\vskip 1.0em \@plus\p@
\setlength\@tempdima{1.5em}%
\begingroup
\parindent \z@ \rightskip \@pnumwidth
\parfillskip -\@pnumwidth
\leavevmode \bfseries
\advance\leftskip\@tempdima
\hskip -\leftskip
#1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par
\penalty\@highpenalty
\endgroup
\fi}
` che è simile alla definizione di Enrico. Il comando [tt]\l@chapter[/tt] ha due argomenti, uno è il titolo del capitolo, l’altro è il numero di pagina.
Poi, nell’ordine:
– \addpenalty è un comando di LaTeX (latex.ltx) che aggiunge una penalità e fa un altro po’ di cose che non ho capito
– \@highpenalty è definito in latex.ltx e vale 301 (per la classe book)
– \vskip, come hai scritto tu, regola la spaziatura dopo a ogni voce
– \setlength… imposta il registro dimensionale \@tempdima a 1,5 em
– mette a zero il rientro di capoverso
– imposta \rightskip (uno spzio da lasciare a fine riga) pari a \@pnumwidth (che è le lunghezza dedicata ai numeri di pagina, 1,55 em per la classe book)
– \parfillskip indica, in parole povere, come deve comportarsi l’ultima riga di un capoverso: se fosse zero vorrebbe dire che l’ultima lettera dell’ultima riga dovrebbe arrivare fino al margine destro. Normalmente vale 0pt plus 1fil, cioè l’ultima riga non viene costretta ad allungarsi o accorciarsi ma mantiene la sua larghezza naturale. Qui il gioco è questo: ho impostato \rightskip perché il testo della mia voce arrivi al massimo a 1,55 em dal margine destro. Ora però voglio che i numeri di pagina siano allineati al margine destro, quindi imposto \parfillskip in modo che la mia riga “sbordi” a destra di 1,55 em rispetto al margine che ho impostato prima (e quindi è perfettamente allinata a destra)
– \leavevmode mi porta in modo orizzontale
– aumento il margine sinistro di \@tempdima e poi aggiungo uno spazio negativo pari a \@tempdima. Inutile? No, serve a far sì che se hai un titolo che occupa più di una riga avrai il numero del capitolo a sistra e il testo del titolo allineato. Il trucco funziona perché il comando \numberline (vedi file .toc) usa una scatola larga \@tempdima.
– aggiungeil testo del titolo (#1), impedisce un’interruzione di riga, riempie la riga e poi iserisce una scatola larga \@pnumwidth in cui, allineato a destra, c’è il numero di pagina.
– aggiunge una penalità positiva per rendere sfavorevole un’interruzione.
Prova un po’ a giocare con questo file, modificando i parametri di \l@chapter per vedere che succede: `\documentclass{book}
\makeatletter
\renewcommand*\l@chapter[2]{%
\ifnum \c@tocdepth >\m@ne
\addpenalty{-\@highpenalty}%
\vskip 1.0em \@plus\p@
\setlength\@tempdima{1.5em}%
\begingroup
\parindent \z@
\rightskip \@pnumwidth
\parfillskip -\@pnumwidth
\leavevmode \bfseries
\advance\leftskip\@tempdima
\hskip -\leftskip
#1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par
\penalty\@highpenalty
\endgroup
\fi}
\makeatother
\begin{document}
\tableofcontents
\chapter{Mio titolo lunghissimo che certamente non starà in una sola riga perché ho deciso io cos}
testo da scrivere sotto
\chapter{Tuo titolo}
testo da scrivere sotto
\end{document}
`