Re: titoli capitoli nelle liste

#20752
Up
0
Down
::

Prof.,

il primo codice l’ho capito, non c’è nulla di complicato, hai aggiunto due righe e hai definito un comando seplice..

Ora però mi devi spiegare questo pezzo.

`\def\xcontentsline#1#2#3{\@ifnextchar\contentsline{\contentsline{#1}{#2}{#3}}{}}`

Che fa \@ifnextchar in questo caso?

Ho solo capito che se il prossimo è \contentsline lo mette altrimenti no.
Non ho capito una cosa, ma \contentsline viene generato quando si inserisce una figura/tabella oppure la faccenda è diversa?

\@ifnextchar guarda il token che segue senza “toccarlo”. Di solito lo si usa per vedere se quel token è [ oppure *, ma si può usare per qualsiasi altro token.

La sintassi è \@ifnextchar{}{}; naturalmente non c’è nella definizione in cui si usa \@ifnextchar, sarà quindi quello che segue. Se = l’espansione sarà , altrimenti sarà .

Il rimane al suo posto. Per questo esiste \@ifstar{}{} che funziona quasi allo stesso modo, ma rimuove l’asterisco dalla lista di token.

Ogni figura o tabella genera una riga \contentsline nel rispettivo file per l’elenco. Vediamo che succede. Primo capitolo, il codice modificato scrive sul .lof la riga
`\xcontentsline{chapter}{\numberline{}1 titolo}{}`
Se c’è una figura nel capitolo, verrà scritta una riga del tipo
`\contentsline{figure}{\numberline{1.1}Didascalia}{2}`
Al momento di compilare l’elenco delle figure, \xcontentsline prima di tutto immagazzina i suoi tre argomenti (l’ultimo è sempre vuoto, ma meglio tenerlo per eventuali estensioni del comando), poi usa \@ifnextchar per vedere ciò che segue. Il fine riga è irrilevante, perché equivale a uno spazio che non viene mai valutato in questi casi. Siccome c’è \contentsline, viene usato il l; una volta esaurita questa fase, si va alla riga successiva e si trova \contentsline che si espande al modo solito.

Se nel capitolo non ci fosse stata alcuna figura, il token sulla riga successiva sarebbe stato \xcontentsline, con l’effetto che entrerebbe in azione il , che è vuoto.

E all’ultimo capitolo? Be’, qui ci si ricorda che alla fine di ogni file che viene letto tramite \input (o anche tramite \read) TeX aggiunge un token \par “implicito”.

Ricapitolando: \@ifnextchar ha quattro argomenti, ma nelle definizioni che lo usano se ne specificano solo tre e questo comando, con questi tre argomenti deve essere alla fine del testo della definizione, in modo che il quarto sia proprio il token (non spazio) immediatamente seguente.

Ciao
Enrico

Go to top