Re: Rivista con LaTeX

#82258
franen
Partecipante
    Up
    0
    Down
    ::


    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}
    `

    Go to top