Vai al menù, saltando i contenuti (access key "m")
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}}