Re: Comprendere un comando in un file Cls.

#18096
Up
0
Down
::

Mi sto rompendo la testa per capire cosa fa questo comando che viene utilizzato in un file di classe cls per listare un elenco di autori, ma purtroppo non ne sto venendo fuori.

Occorre sapere che \toks@ indica un registro di token e che \@xp è un’abbreviazione di \expandafter.
`\newcommand{\nxandlist}[4]{%`
Stiamo definendo il comando \nxandlist con quattro argomenti.
`\def\@andlistc##1{\toks@\@xp{\the\toks@##1}}%`
L’espansione ridefinisce \@andlistc con un argomento; ogni chiamata di \@andlistc aggiunge al contenuto di \toks@ l’argomento; per esempio, se \toks@ contiene \xxx\yyy, dopo \@andlistc{\zzz} il contenuto di \toks@ sarà \xxx\yyy\zzz
` \toks@{\toks@\@emptytoks \@andlista{{#1}{#2}{#3}}}%`
Inizializziamo il contenuto di \toks@ come scritto; \@emptytoks è un registro token sempre vuoto.
` \the\@xp\toks@#4\and\and`
Emettiamo il contenuto della registro token \toks@ seguito dal quarto argomento (espanso) e da \and\and
` \edef#4{\the\toks@}%`
Ridefiniamo il quarto argomento (che deve essere un comando) come il contenuto di \toks@
` \let\@andlistc\@iden}`
Definiamo \@andlistc come la macro \@iden; la definizione di \@iden è \def\@iden#1{#1}.
`\def\@andlista#1#2\and#3\and{\@andlistc{#2}\@ifnotempty{#3}{%
\@andlistb#1{#3}}}`
Questo non dovrebbe dare problemi: \@andlista ha tre argomenti; il primo non è delimitato, il secondo è delimitato da \and, il terzo anche.
`\def\@andlistb#1#2#3#4#5\and{%
\@ifempty{#5}{%
\@andlistc{#2#4}%
}{%
\@andlistc{#1#4}\@andlistb{#1}{#3}{#3}{#5}%
}}`
Anche questo non dovrebbe dare problemi. Ora però occorre vedere che succede quando si chiama \nxandlist{a}{b}{c}{\d}. Il registro \toks@ sia vuoto e supponiamo che sia stato dato \def\d{xyz}

La lista di token che viene sostituita è
`\def\@andlistc#1{\toks@\@xp{\the\toks@#1}}
\toks@{\toks@\@emptytoks \@andlista{{a}{b}{c}}}
\the\@xp\toks@\d\and\and
\edef\d{\the\toks@}
\let\@andlistc\@iden`
e, a questo punto, riparte l’espansione. La definizione di \@andlistc viene memorizzata. Il registro \toks@ assume il valore \toks@\@emptytoks \@andlista{{a}{b}{c}}

Poi nella lista di token da esaminare viene inserito
`\toks@\@emptytoks \@andlista{{a}{b}{c}}xyz\and\and`
e quindi la lista a questo punto è
`\toks@\@emptytoks \@andlista{{a}{b}{c}}xyz\and\and
\edef\d{\the\toks@}\let\@andlistc\@iden`
Occorre espandere \@andlista, i cui argomenti sono #1={a}{b}{c}, #2=xyz e #3 è vuoto. Quindi si trova
`\@andlistc{xyz}\@ifnotempty{}{\@andlistb{a}{b}{c}{}}`
L’espansione di \@andlistc è
`\toks@\@xp{\the\toks@ xyz}`
Siccome il primo argomento di \@ifnotempty è vuoto, l’espansione è vuota.

Adesso puoi andare avanti. È chiaro che non succederà sempre così: se l’espansione di \d contiene \and, gli argomenti di \@andlista saranno diversi.

Ciao
Enrico

Go to top