[quote]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 xyza name\endcsname`
Nemmeno togliere xyz risolverebbe:
`\def\mycmd{\csname #1\endcsname}
\mycmd{ a name}`
avrebbe come espansione
`\csnamea name\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
Ah, ah, ah. 😆
Aspettando, con cortese sollecitudine, il quanto mai opportuno decreto interpretativo, mi incarico di dire quanto segue:
ebbene una volta tanto, nel mio caso gli spazi iniziali e finali dell’argomento, non dovrebbero più esserci al momento di creare la control sequence.
Ti ricordi Enrico il post sulla chiave con extends? La stringa di testo corrispondente alla parte `padre’ ed a quella `figlio’ pur non contenendo gli
Il codice elabora l’input tipo:`\mycmd{figlio extends padre}` per produrre i comandi necessari a generare una gerarchia ad albero che dovrebbe poi essere risolta con l’espansione dal motore TeX.
L’utente potrebbe anche scrivere:`\mycmd{figlio uno extends padre}` così che verrebbero fuori dei
I comandi contengono codice pstricks, per cui l’utente (ci sto ancora ragionando) è (dovrebbe essere) in grado di creare un albero di oggetti
Ad ogni ‘estensione’ si genera un nodo che contiene una macro che espande il codice dell’oggetto padre, più il nuovo codice “in aggiunta”.
Potrei tuttavia vietare di usare nomi contenenti spazi tipo appunto “a name” con un comando apposito.
Grazie ( attendo novità in Gazzetta Ufficiale ).
Un saluto.
Roberto[/quote]
È un tuo problema. 🙂 Ma non vedo controindicazioni nel caso
`\mycmd{figlio uno extends padre}`
perché, se ben ricordo, si toglievano gli spazi all’inizio e alla fine. Quindi elaborerai “figlio uno” e “padre” e poco importa se ci sono due spazi tra “figlio” e “uno” nell’input. Anche \mycmd{ figlio uno extends padre } dovrebbe finire a posto.
La Gazzetta Ufficiale ha pubblicato in un numero speciale il decreto che è in vigore da ieri (facciamolo retroattivo, così è ancora più sicuro):
Articolo unico. Il messaggio numero 7000 di egreg9 è quello inviato in risposta a robitex con oggetto “Comando (control sequence) contenente spazi”. E chi ha qualcosa da dire in contrario è un sovversivo.
🙂
Ciao
Enrico