Scusa,
forse risulterò patetico o tardone, ma non ho capito se l’espansione tra \csname e \endcsname la fa \csname stesso o \expandafter che sta prima di \let o \endcsname.
In quetso caso Il comando “espandi dopo” (presente prima di \endcsname precedente) espande ps@empty o, come credo io, tutto l’insieme
`
\csname ps@empty\endcsname`
?
Non è roba facile, lo so.
\csname
Adesso vediamo che cosa succede con
`\csname pippo\expandafter\endcsname\csname pluto\endcsname`
Il primo \csname provoca l’espansione della lista, come detto; quando si arriva a \expandafter questo espande il token successivo al seguente, in questo caso \csname. Ma \expandafter non provoca espansione completa, solo al primo livello; quindi a questo punto la lista che si ha è equivalente a
`\pippo\pluto`
e TeX riparte espandendo \pippo.
Un esempio più complicato:
`\def\aaa{xyz}
\csname pippo\aaa\expandafter\endcsname\csname\aaa\endcsname`
Espansione della prima lista: pippo\aaa\expandafter -> pippoxyx + espansione del csname seguente in \xyz
TeX esegue l’espansione completa quando incontra \edef e \csname; in altri casi esegue solo l’espansione di primo livello
`\def\aaa{xy\z}
\def\z{pippo}
\edef\prova{\aaa p}`
La macro \prova ha come testo di sostituzione xypippop, perché l’espansione è completa.
`\def\aaa{xy\z}
\def\z{pippo}
\expandafter\def\expandafter\prova\expandafter{\aaa p}`
Adesso \prova ha come testo di sostituzione xy\z p, perché \expandafter esegue solo l’espansione di primo livello \aaa -> xy\z (i tre \expandafter servono per arrivare proprio a \aaa).
Ciao
Enrico