Re: Comando (control sequence) contenente spazi.

#45938
Up
0
Down
::

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 xyzaname\endcsname`
Nemmeno togliere xyz risolverebbe:
`\def\mycmd{\csname #1\endcsname}
\mycmd{ a name}`
avrebbe come espansione
`\csname
aname\endcsname`
perché il primo
(uno “space token”, penso che fosse ovvio) fa parte dell’argomento di \mycmd; gli spazi tra “a” e “name” nell’argomento sono normalizzati a uno space token in fase di lettura.

Ciao
Enrico

Go to top