Re: Un carattere alla volta reso maiuscolo

#59572
Up
0
Down
::

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{}, interrompe ciò che sta facendo, converte i nell’equivalente maiuscolo (solo i caratteri espliciti) senza espandere nulla e rimette la lista di token ottenuta al posto di \uppercase{}. La soluzione è eseguire prima \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

Go to top