m***@gmail.com
2014-03-07 14:49:19 UTC
Scusatemi la domanda forse un po’ stupida, ma la mia conoscenza delle regole e dell’ordine d’espansione non è per niente completa.
Devo scrivere (in Plain) una macro che prende nell’argomento una lista di token, poi cambia certi \catcode, «rilegge» con \scantokens l’argomento e lo passa, in forma di un’altra lista di tokens, a un’altra macro. La ragione di questo (e anche il problema) è che alcuni caratteri della lista sono di categoria 13, quando \scantokens sta rileggendoli. E mi serve che nella lista finale (quella che si passa all’altra macro) i caratteri attivi siano NON ESPANSI.
Cioè:
{\catcode`\b=13\relax
\def b{haha}}
\def\macro#1{%
{\catcode`\b=13\relax
\laltramacro{\scantokens{#1}}
}}
Voglio che, dopo di usare \macro{abc}, \laltramacro ottenga {ab₁₃c} e no {ahahac}.
Penso che sia la riga
\laltramacro{\scantokens{#1}}
che va scritta in modo diverso, forse con alcuni \expandafter, \unexpanded, utilizzando toks registers, \edef ecc. Dopo di perdere due giorni provandolo in varie combinazioni mi rivolgo a questo gruppo.
Vi ringrazio in anticipo di ogni aiuto
Tomáš
Devo scrivere (in Plain) una macro che prende nell’argomento una lista di token, poi cambia certi \catcode, «rilegge» con \scantokens l’argomento e lo passa, in forma di un’altra lista di tokens, a un’altra macro. La ragione di questo (e anche il problema) è che alcuni caratteri della lista sono di categoria 13, quando \scantokens sta rileggendoli. E mi serve che nella lista finale (quella che si passa all’altra macro) i caratteri attivi siano NON ESPANSI.
Cioè:
{\catcode`\b=13\relax
\def b{haha}}
\def\macro#1{%
{\catcode`\b=13\relax
\laltramacro{\scantokens{#1}}
}}
Voglio che, dopo di usare \macro{abc}, \laltramacro ottenga {ab₁₃c} e no {ahahac}.
Penso che sia la riga
\laltramacro{\scantokens{#1}}
che va scritta in modo diverso, forse con alcuni \expandafter, \unexpanded, utilizzando toks registers, \edef ecc. Dopo di perdere due giorni provandolo in varie combinazioni mi rivolgo a questo gruppo.
Vi ringrazio in anticipo di ogni aiuto
Tomáš