Sto mettendo a punto un comando per disegnare il barcode con codifica code39 di una stringa. Il comando deve selezionare della stringa un carattere alla volta ed in questo caso ci risco con:
`\documentclass{minimal}
\makeatletter\def\makeup#1{%
\parsechar#1\@nil
}\def\parsechar#1#2\@nil{%
#1\\
\def\temp{#2}
\ifx\temp\empty
\else
\parsechar#2\@nil
\fi
}\makeatother
\begin{document}
\noindent\makeup{12q\$wert\%y+-}\end{document}`
Tuttavia se provo a rendere maiuscoli i caratteri (il code39 accetta solo caratteri maiuscoli), il codice non funziona più:
`% non funziona
\documentclass{minimal}\makeatletter
\def\makeup#1{%
\expandafter\parsechar\uppercase{#1}\@nil
}\def\parsechar#1#2\@nil{%
#1\\
\def\temp{#2}
\ifx\temp\empty
\else
\parsechar#2\@nil
\fi
}
\makeatother\begin{document}
\noindent\makeup{12q\$wert\%y+-}
\end{document}`Eppure l’effetto del primo \expandafter dovrebbe essere quello di espandere \uppercase e restituire al comando delimitato i token dei caratteri semplici ma resi maiuscoli.
L’errore è quello di un parentisi graffa aperta mancante.Ho provato anche a definire una macro \temp come \def\temp{\uppercase{#1}} ed espanderla dopo ma viene riportato lo stesso errore.
Grazie per l’aiuto.
R.
\uppercase non è espandibile. Quando TeX trova \uppercase{
`\def\makeup#1{\uppercase{\parsechar#1\@nil}}`
C’è un modo migliore di definire \parsechar:
`\def\parsechar#1{%
\ifx#1\@nil\else
#1\\%
\expandafter\parsechar
\fi}`
che effettivamente consuma un token alla volta, mentre la tua rilegge ogni volta tutto quanto rimane dopo ogni passaggio.
Nel caso di \makeup{12q\$wert\%y+-}, dopo l’esecuzione di \uppercase ci troviamo
`\parsechar 12Q\$WERT\%Y+-\@nil`
e #1 è 1, che non è \@nil. Perciò ci si trova con
`1\\\expandafter\parsechar\fi 2Q\$WERT\%Y+-\@nil`
I token 1 e \\ vengono spediti avanti e viene espanso \expandafter che a sua volta espande \fi, la cui espansione è vuota! Dunque ci troviamo
`\parsechar 2Q\$WERT\%Y+-\@nil`
esattamente come voluto.
Ovviamente se inserisci nell’argomento di \makeup comandi con argomento o comandi non definiti ti trovi nei pasticci, ma non credo sia un problema. Esercizio: perché, con la mia definizione, \makeup{abc\ddt xyz} non dà errore a \ddt ma a \@nil, mentre con la tua lo dà a \ddt?
Ciao
Enrico