Sam Qasbah” post=82586Salve a tutti. Se voglio sostituire un certo testo con un altro all’interno di una frase posso usare una macro simile alla seguente:
`
\def\changebird#1fringuello#2.{#1tordo#2}
\changebird Stamattina un fringuello inseguiva una folaga.
\bye
`Funziona.
La cosa però sembra non funzionare se in input c’è una sequenza di tokens di categoria 12, ad esempio:`
\def\changenumstyle#1+onum#2;{#1-onum#2}
\edef\tmp{\fontname\font} % \fontname\font espande a ”Castellar Bellini Pro:mapping=tex-text,+onum,+liga,+kern”
\expandafter\changenumstyle\tmp;
% qui restituisce l'errore ! Paragraph ended before \changenumstyle was complete.
\bye
`Dunque, come è possibile implementare una macro per modificare a runtime gli attributi opentype delle font senza incappare in questo problema?
Le stringhe prodotte da [tt]\the[/tt] o [tt]\fontname[/tt] sono tutte di caratteri con categoria 12.
La strategia tradizionale sarebbe
`\begingroup\catcode`O=12 \catcode`N=12 \catcode`U=12 \catcode`M=12
\lowercase{\endgroup\def\changenumstyle#1+ONUM#2;}{#1-onum#2}`
Con le estensioni e-TeX (che XeTeX possiede), puoi fare, forse più semplicemente, con
`\begingroup\edef\x{\endgroup\def\noexpand\changenumstyle##1\detokenize{+onum}##2;}\x{#1-onum#2}`
Funziona anche
`\expandafter\def\expandafter\changenumstyle\expandafter#\expandafter1\detokenize{+onum}#2;{#1-onum#2}`
Hai da scegliere. 🙂
Ciao
Enrico