TeX e LaTeX.
Analisi delle classi standard

Le sezioni

...
\newcounter {chapter}
...
\renewcommand \thechapter {\@arabic\c@chapter}
...
\newcommand\@chapapp{\chaptername}
...
\newcommand\chapter{\if@openright\cleardoublepage\else\clearpage\fi
                    \thispagestyle{plain}%
                    \global\@topnum\z@
                    \@afterindentfalse
                    \secdef\@chapter\@schapter}
...
\def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne
                       \if@mainmatter
                         \refstepcounter{chapter}%
                         \typeout{\@chapapp\space\thechapter.}%
                         \addcontentsline{toc}{chapter}%
                                   {\protect\numberline{\thechapter}#1}%
                       \else
                         \addcontentsline{toc}{chapter}{#1}%
                       \fi
                    \else
                      \addcontentsline{toc}{chapter}{#1}%
                    \fi
                    \chaptermark{#1}%
                    \addtocontents{lof}{\protect\addvspace{10\p@}}%
                    \addtocontents{lot}{\protect\addvspace{10\p@}}%
                    \if@twocolumn
                      \@topnewpage[\@makechapterhead{#2}]%
                    \else
                      \@makechapterhead{#2}%
                      \@afterheading
                    \fi}
...
\def\@schapter#1{\if@twocolumn
                   \@topnewpage[\@makeschapterhead{#1}]%
                 \else
                   \@makeschapterhead{#1}%
                   \@afterheading
                 \fi}

L'indice

Le voci nell'indice (table of contents) vengono aggiunte implicitamente o esplicitamente con il comando \addcontentsline. Questo comando può essere dato manualmente o, come succede nel 99% dei casi, viene dato in automatico dai vari comandi di sezionamento.

Il comando \addcontentsline è definito nel nucleo di LaTeX (latex.ltx) e ha tre argomenti obbligatori. Il primo dice in che file va salvato il contenuto degli altri due argomenti. "toc" indica che va salvato nel file con estensione .toc che è appunto quello che poi viene usato dal compilatore nella successiva passata per comporre l'indice. Il secondo e il terzo invece vengono invece passati direttamente al comando \contentsline che è appunto ciò che viene scritto nel file ausiliario. Il secondo è un comando che indica lo stile mentre il terzo è il vero e proprio contenuto che verrà stampato nell'indice a cui verranno aggiunti in automatico i puntini e il numero di pagina.

Se per esempio diamo il comando

\addcontentsline{toc}{pippo}{Pluto}

dopo la prima compilazione, nel file ausiliario .toc verrà scritta la riga

\contentsline {pippo}{Pluto}{...}

dove i puntini indicano la pagina a cui è stato dato il comando \addcontentsline.

Alla successiva compilazione il contenuto del file .toc viene preso e inserito al posto del comando \tableofcontents e viene quindi interpretato dal compilatore. Bisogna quindi capire cosa fa il comando \contentsline, sempre definito nel nucleo di LaTeX.

Il comando \contentsline ha 3 argomenti. Il primo indica lo stile che verrà usato. In pratica il primo argomento del nostro esempio si trasformerà nel comando \l@pippo. Notare l'aggiunta in automatico di \l@. Ovviamente il comando \l@pippo non è definito. Il nucleo di LaTeX non definisce alcuno comando di questo tipo. Questo tipo di comandi che cominciano con \l@ sono definiti nei file di classe. Per esempio nella classe book esiste lo stile \l@part, \l@chapter, \l@section, e così via.

Il secondo argomento di \contentsline è il contenuto che verrà stampato e il terzo è la pagina.

Quindi per continuare con il nostro esempio, \contentsline {pippo}{Pluto}{...}, diverrà

\l@pippo{Pluto}{...}

Ora possiamo definire il comando \@pippo con o senza argomenti a seconda di come più ci piace. Normalmente nelle classi standard è definito con due argomenti. Per esempio il comando \l@section

\newcommand*\l@section{\@dottedtocline{1}{1.5em}{2.3em}}

Cioè nel nostro esempio \l@pippo{Pluto}{...} verrà espanso a

\@dottedtocline{1}{1.5em}{2.3em}{Pluto}{...}

È importante quindi mostrare la definizione del comando \@dottedtocline

\def\@dottedtocline#1#2#3#4#5{%
  \ifnum #1>\c@tocdepth \else
    \vskip \z@ \@plus.2\p@
    {\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip
     \parindent #2\relax\@afterindenttrue
     \interlinepenalty\@M
     \leavevmode
     \@tempdima #3\relax
     \advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip
     {#4}\nobreak
     \leaders\hbox{$\m@th
        \mkern \@dotsep mu\hbox{.}\mkern \@dotsep
        mu$}\hfill
     \nobreak
     \hb@xt@\@pnumwidth{\hfil\normalfont \normalcolor #5}%
     \par}%
  \fi}

Le testatine

%% CORREZIONE BUG DI BOOK.CLS
%% Ridefinizione \chapter* (cioè \@schapter) in modo da non avere il famoso
%% problema del markboth da inserire manualmente
%%\let\old@schapter=\@schapter
%%\def\@schapter#1{\old@schapter{#1}\chaptermark{#1}}
%% Ridefinizione \section* in modo da non avere il famoso
%% problema del markright da inserire manualmente
%%\let\oldsection=\section
%%\def\section{\secdef\oldsection\sap@ssection}
%%\def\sap@ssection[#1]#2{\oldsection*[#1]{#2}\sectionmark{#1}}