Re: problema con \@startsection

#53341
Up
0
Down
::

OldClaudio ha scritto

Non ti basterebbe rendere \capo equivalente a \section e \punto equivalente a \subsection?

egreg9 ha scritto:

Ma perché non usare titlesec e modificare \section e \subsection?

si, forse è una soluzione più praticabile per un neofita. ci farò delle prove. grazie.

egreg9 ha scritto:

… aggiungi prima di \makeatother la magia …

la magia funziona. potresti dirmi in due parole cosa fa il comando \@gobble ? googlando non sono riuscito a trovare nulla di immediatamente esplicativo. Grazie.

Fra i suoi vari compiti il comando \@startsection ha la responsabilità di passare il titolo a un’altra macro in modo che questo titolo possa essere usato per la testatina. Lo fa eseguendo l’istruzione
`\csname mark\endcsname{}`
dove è quello che passi come primo argomento a \@startsection e è l’argomento (apparente) al comando che stai definendo tramite \@startsection. Vediamolo nel caso di \capo: la chiamata \capo{Premessa} diventa
`\@startsection{capo}{1}{1em}{\baselineskip}{-2em}{\normalfont\normalsize\bfseries}{Premessa}`
e quindi, fra le altre cose, viene eseguito
`\csname capomark\endcsname{Premessa}`
La costruzione \csname capomark\endcsname è equivalente a \capomark se questo comando è definito, a \relax se \capomark non è definito. Per questo trovavi il “raddoppiamento”: nel tuo codice non c’era alcuna definizione di \capomark.

La soluzione di scrivere \let\capomark\@gobble è quasi equivalente a
`\newcommand{\capomark}[1]{}`
cioè \capomark semplicemente butta via il suo argomento. Infatti la definizione di \@gobble è
`\newcommand{\@gobble}[1]{}`
Con \let invece di \newcommand si risparmia un po’ di memoria.

Nel nucleo di LaTeX si trova infatti
`\let\sectionmark\@gobble
\let\subsectionmark\@gobble
\let\subsubsectionmark\@gobble
\let\paragraphmark\@gobble
\let\subparagraphmark\@gobble`
Sono poi le classi a definire come preferiscono i comandi \sectionmark e così via. La classe article definisce solo \sectionmark.

Ciao
Enrico

Go to top