Supponiamo di dover creare un nuovo comando \test che rivede un argomento solo e che poi usi questo argomento sia trasformandolo in tutto minuscolo sia in tutto maiuscolo, per esempio:
`
\newcommand\text[1]{\def\nome{\lowercase{#1}}\def\NOME{\uppercase{#1}}
…}
`Se si chiama la macro test con un argomento costituito da una stringa, funziona benissimo, se la si chiama con un argomento costituito da una macro che a sua volta contiene una stringa, non funziona.
La cosa è spiegata nel TeXbook e per costruzione le cose vanno così.
Qualcuno ha un’idea di come poter fare, tra \expandafter ed \edef o altro per ottenere il risultato?
`\newcommand{\text}[1]{%
\edef\nome{#1}%
\edef\NOME{#1}%
\lowercase\expandafter{\expandafter\def\expandafter\nome\expandafter{\nome}}%
\uppercase\expandafter{\expandafter\def\expandafter\NOME\expandafter{\NOME}}}`
Per la prima definizione di \nome uso un \edef che elimina tutte le macro; con la seconda espando \nome prima che il tutto passi attraverso \lowercase. Analogamente per \NOME. Ovviamente il tutto ha notevoli limitazioni: non si possono usare, per esempio, comandi come \ss oppure \o né lettere accentate con il pacchetto inputenc.
Se usi la codifica latin1, può funzionare, ma non per tutti i caratteri, scrivere
`\edef\nome{\detokenize{#1}}`
e analogamente per \NOME; ovviamente, l’espansione finale di \nome e \NOME consisterà di token di categoria 12. Temo che non funzioni proprio con utf8.
Ciao
Enrico