\csname come \string e come \the interpreta ciò che segue come caratteri di categoria 12.
Però non so perché non dà errore. Normalmente @ è di categoria 12 e dà errore!!!Infatti
`\showthe\catcode`@`
dà 12.
Bo!!
Ciò che sta fra \csname e \endcsname viene espanso completamente; il risultato devono essere tutti token di tipo carattere, non importa quale codice di categoria abbiano (ma i caratteri commento, ignorati o non validi non contano perché vengono intercettati prima che avvenga l’espansione). Perciò
`\csname ps@empty\endcsname`
equivale a
`\makeatletter
\ps@empty
\makeatother`
Il fatto che ciò che sta fra \csname e \endcsname venga espanso completamente può essere usato per espandere quegli \expandafter che a loro volta espandono il \csname successivo; il risultato è come scrivere
`\let\ps@plain\ps@empty\ps@empty`
ma senza bisogno di cambiare il codice di categoria di @.
Il trucco dell’espansione è usato per le liste numerate annidate che usano i contatori enumi, enumii, enumiii ed enumiv; se si vuole accedere al contatore usato senza dover sapere a che livello si è si può dire
`\csname c@enum\romannumeral\the\@enumdepth\endcsname`
dove \@enumdepth è un contatore (di quelli di tipo Plain) che l’inizio di ogni enumerate incrementa di uno; \csname causa l’espansione di \romannumeral che causa quella di \the e il risultato è i, ii, iii oppure iv a seconda del livello, ottenendo appunto una delle sequenze di controllo
`\c@enumi \c@enumii \c@enumii \c@enumiii \c@enumiv`
che sono i nomi dei contatori usati dall’ambiente.
Ciao
Enrico