Re: Un carattere alla volta reso maiuscolo

#59576
Up
0
Down
::

Ecco come funziona il codice:
ho creato 43 macro diverse ognuna per i 43 simboli che possono essere rappresentati da code39. Queste macro sono state nominate con \barchar@.
Per esempio il carattere A è reso dalla macro \barchar@A, quindi quando la macro di parsing passa un singolo carattere costruisco la command sequence relativa per le cifre da 0 a 9 e per le 26 lettere.
Se tale token non è vuoto (come nella maggioranza dei casi), allora produco il disegno corrispondente delle barre, altrimenti verifico che non sia uno dei simboli speciali, e se non sono in uno di questi casi emetto un messaggio d’errore. Ecco il codice:
`
% user interface macro
\newcommand{\barcode}[1]{%
\ifx#1\empty
% package warning
\else
\barcode@Start
\expandafter\uppercase\expandafter{\expandafter\barcode@parsechar#1\@nil}
\barcode@Stop
\fi
}
%
\def\barcode@parsechar#1{%
\ifx#1\@nil\else
\def\tempsymb{*}
\ifx#1\tempsymb
% package error
\fi
% command sequence of the char
\expandafter\let\expandafter\tempchar\csname barchar@#1\endcsname
\ifx\tempchar\relax
\ifx#1\space
\barchar@space
\barstep@interchar
\else
\def\tempsymb{-}
\ifx#1\tempsymb
\barchar@bar
\barstep@interchar
\else
\def\tempsymb{.}
\ifx#1\tempsymb
\barchar@dot
\barstep@interchar
\else
\def\tempsymb{/}
\ifx#1\tempsymb
\barchar@slash
\barstep@interchar
\else
\def\tempsymb{+}
\ifx#1\tempsymb
\barchar@plus
\barstep@interchar
\else
\def\tempsymb{\%}
\ifx#\tempsymb
\barchar@percent
\barstep@interchar
\else
\def\tempsymb{\$}
\ifx#1\tempsymb
\barchar@dollar
\barstep@interchar
\else
% package error
\fi
\fi
\fi
\fi
\fi
\fi
\fi
\else
\tempchar
\barstep@interchar
\fi
\expandafter\barcode@parsechar
\fi
}`

La serie annidata di test condizionali è un po’ poco leggibile ma riguarda solo i simboli mentre con l’idea di \tempchar mi evito un problema maggiore mantenendo l’efficienza di esecuzione.

Se passo il codice da renderizzare a \barcode con una macro semplice funziona.
Grazie di nuovo.
R.

Non vedo perché tutti quei test, visto che ogni volta che il test ha successo inserisci la macro corrispondente e \barstep@interchar: non basterebbe mettere \barstep@interchar nella definizione di \barcode@dot, per esempio? Ma a quanto capisco quel carattere di separazione ci va sempre, quindi perché fare tanta fatica?

Ah, puoi benissimo dire
`\@namedef{barchar@.}{…}`
ed evitare di guardare se il successivo carattere è il punto. E anche
`\@namedef{barchar@\detokenize{\$}}{…}`
e non hai nemmeno bisogno di \tempsymb, purché tu usi
`\expandafter\let\expandafter\tempchar\csname barchar@\detokenize{#1}\endcsname`
e a questo punto non ti serve nemmeno \tempchar.

Vediamo un po’ di snellire quel codice:
`\newcommand{\barcode@def}[1]{\@namedef{barcode@\detokenize{#1}} % zucchero sintattico
\barcode@def{A}{…}

\barcode@def{Z}{…}
\barcode@def{0}{…}
\barcode@def{9}{…}
\barcode@def{ }{…} % space
\barcode@def{\ }{…} % control space (serve per spazi multipli)
\barcode@def{-}{…} % period
\barcode@def{.}{…} % period
\barcode@def{/}{…} % slash
\barcode@def{+}{…} % plus
\barcode@def{\%}{…} % percent
\barcode@def{$}{…} % dollar
\barcode@def{\$}{…} % control dollar (non servirebbe)

\def\barcode@parsechar#1{%
\ifx#1\@nil\else
\@ifundefined{barcode@\detokenize{#1}}{\ERROR}{%
\@nameuse{barcode@\detokenize{#1}}%
\barstep@interchar}%
\expandafter\barcode@parsechar
\fi}`
Prima di espandere la macro corrispondente al carattere vediamo se è definita; se non lo è emettiamo un messaggio di errore.

Mi pare un pochino più compatto, non trovi? 🙂

Si potrebbe anche evitare di dare \% nelle stringhe, di sicuro \$ non serve e va benissimo anche $. Ho messo anche “\ ” perché altrimenti non puoi scrivere due spazi di seguito (a meno di non cambiare il codice di categoria dello spazio durante la lettura dell’argomento). Se definisci anche \barcode@a e così via fino a \barcode@z non hai nemmeno bisogno di \uppercase:
`\let\barcode@a\barcode@A

\let\barcode@z\barcode@Z`
Ciao
Enrico

Go to top