Expanze \uppercase

Petr Olsak olsak at math.feld.cvut.cz
Thu Nov 19 08:42:14 CET 1998


On Wed, 18 Nov 1998, Ivo Jancik wrote:

>
> Dobry den vsem zucastenym.
>
> Narazil jsem na problem a selhala mi fantazie
> pri jeho reseni, proto se obracim na prisedici
> guru.
>
> Chci definovat makro do nehoz vstoupi sekvence
> tokenu typu pismeno, tedy zhruba receno retezec,
> a uvnitr makra se provede definice noveho makra,
> jehoz nazev bude jako ten parametr.
>
> Z duvodu jednoznacnosti chci prevest parametr na
> velka pismena a tady je problem. Zkousel jsem neco
> jako zhruba toto:
>
>   \expandafter\gdef
>   \expandafter\csname\uppercase{#1}\endcsname
>
> potom zase toto:
>
>   \edef\neco{\uppercase{#1}}
>   \expandafter\gdef
>   \expandafter\csname\neco\endcsname
>
> ale pak jsem zjistil, ze se \uppercase ani v jednom
> pripade neexpanduje tak, jak jsem si predstavoval.
> Je to proto, ze je to primitiv a dal se expanze neprovadi?

Primitiv \uppercase pracuje az na urovni hlavniho procesoru, ale Vy
potrebujete prevzit udaj sevreny mezi \csname a \endcsname od expand
procesoru. Je tedy prirozene, ze primitiv \uppercase nemuzete pouzit.
Zadna kombinace \expandafter ani \edef nepomuze.

Moznym resenim je definovat si vlastni makro \expanduppercase, ktere
pracuje podobne jako \uppercase, ovsem veskera jeho cinnost se provadi
v expand procesoru. Je to zajimave cviceni na pouzivani pouze expand
primitivu, tj. v makru musime vyloucit aktivity typu \def, \let, \advance
a jine. Jedno z moznych reseni uvadim nize:


\def\defascii#1{\doascii#1\endascii}
\def\doascii#1{\ifx#1\endascii\else
   \expandafter\def\csname:\the\uccode`#1\endcsname{#1}%
   \expandafter\doascii\fi}

\defascii{ABCDEFGHIJKLMNOPQRSTUVWXYZ} % v csplainu mozno pridat i pismena
                                      % s akcenty

\def\expanduppercase#1{\doupper#1\enduper}
\def\doupper#1{\ifx#1\enduper\else\upchar#1\expandafter\doupper\fi}
\def\upchar#1{\ifnum\uccode`#1>0 \csname:\the\uccode`#1\endcsname \else #1\fi}

\edef\test{\expanduppercase{abcdEFg123z}}

\show\test

\end


Makro \defascii pripravi pudu pro vlastni cinnost makra \expanduppercase.
Definuje totiz napriklad \:65 jako A. V TeXu totiz neexistuje primitivni
prevodnik na urovni expand procesoru, ktery by z cisla (napriklad 65)
vyrobil token, jehoz ASCII kod je ono cislo (napriklad A).  (primitiv
\char pracuje ve hlavnim procesoru). Po pouziti makra \defascii takovy
prevodnik mame.

Vlastni makro \expanduppercase odebira postupne jeden token za druhym,
pres \uccode vyhleda aktualni cislo pro tento token a pomoci prave
vytvoreneho prevodniku toto cislo znovu prevadi na pozadovany token.
Chcete jeste neco vice?

> Konzultoval jsem dukladne TBN, ale presto bych byl rad, ...

Omlouvam se, ze jsem priklad podobny tomuto nezaradil do TBN. :-)

Petr Olsak




More information about the csTeX mailing list