Salve,
se metto uno spazio nella control sequence di un comando per mezzo dei comandi primitivi \csname \endcsname, ho notato che TeX continua a lavorare senza problemi:
`\documentclass{minimal}\begin{document}
\expandafter\def\csname a name\endcsname{This is my command.}
\csname a name\endcsname
\end{document}`La domanda è: potrebbero esserci dei problemi oppure posso stare tranquillo ed utilizzare codice di questo tipo per la classe che sto (ancora 😯 ) scrivendo?
Il quesito nasce perché vorrei creare un comando a partire da un argomento inserito dall’utente che potrebbe essere particolarmente cattivo 👿 tanto da inserire uno o più spazi:`\documentclass{minimal}
\def\mycmd#1{%
\expandafter\def\csname #1\endcsname{This command is named `#1'.}%
\csname #1\endcsname
}\begin{document}
\mycmd{name}\mycmd{a name}
\mycmd{a bad name}
\mycmd{a bad bad name}
\end{document}`Ciao.
@Enrico: mi darai la tua risposta numero 7000 vero? 😀
Be’, i 7000 sono già andati, ma asserisco che questo è l’autentico messaggio numero 7000. Se non bastasse, è pronto un decreto interpretativo. 🙂
Se il tuo utente inserisce spazi a iosa non hai alcun problema, perché gli spazi sono ridotti a uno già in fase di lettura. Ma se il tuo comando è
`\def\mycmd#1{\csname xyz#1\endcsname}`
scrivere \mycmd{a name} oppure \mycmd{ a name} sarebbe molto diverso. I due sono equivalenti rispettivamente a
`\mycmd{a name}
\mycmd{ a name}`
e a tutte le variazioni che puoi immaginare. Risolviamo la questione con
`\def\mycmd#1{\csname xyz #1\endcsname}`
dirai. Ehm, no. Perché quello spazio tra xyz e #1 è già “tokenizzato”: fa già parte della lista di token per l’espansione di \mycmd e la seconda chiamata produrrebbe
`\csname xyz
Nemmeno togliere xyz risolverebbe:
`\def\mycmd{\csname #1\endcsname}
\mycmd{ a name}`
avrebbe come espansione
`\csname
perché il primo
Ciao
Enrico