Predefinovani pismene v makru

Petr Olsak olsak at math.feld.cvut.cz
Thu Nov 21 08:56:03 CET 1996



On Wed, 20 Nov 1996, Rylek Tomas wrote:

>     Vazeny pane kolego!
>
> > Mohu se zeptat, proc zde nepomuze \edef ?
> >  \edef\NewKeyboard{
> >  \catcode`\o=\active \def o{XYZ}
> >  Kudrnovo kolo
> >  }
> >  \begin{document}
> >  \NewKeyboard
> >  \end{document}
> >
> > (Zkousel jsem to a TeX hlasi tutez chybu...)
>
> Problem je v tom, ze zpracovani zdrojoveho textu v TeXu se sklada z
> nekolika fazi; pokud jste se nekdy zabyval teorii prekladacu, budete
> urcite hned vedet, o cem mluvim.
> ...
>
> Takze kdyz se vyvola prikaz \edef, dostane jako parametry jiz
> zpracovany (snedeny) retezec ve slozenych zavorkach. Ten zacne
> zpracovavat - expanduje ho;
> pri teto expanzi se sice provede prikaz \catcode, takze ...
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Prominte, ze se k tomu vracim. Vyklad od pana Rylka byl uz dosti podrobny
a spravny. Nespravna je pouze veta, kterou jsem zatrhl. Aby nedochazelo k
omylum, chtel bych ji uvest na pravou miru.

Pro lepsi pochopeni je zpracovani TeXu rozdeleno do nekolika fazi, ovsem
je potreba rozlisovat i to, co se deje pozdeji (za usty). Napriklad ve
sve knize TeXbook naruby jsem toto zpracovani rozdelil do ctyr fazi takto:

input procesor (oci)
token procesor (usta)
expand procesor (hltan)
hlavni procesor (zaludek)

Kazdemu procesoru venuji jednu pomerne rozsahlou kapitolu.

Nyni, v cem je zakopan pes: Povel \catcode X=Y meni tabulku kategorii, ktera
zpetne ovlivnuje cinnost token procesoru, ale tento povel se provadi az
v hlavnim procesoru. \edef zase naopak pracuje ve fazi uceni definice jen
s expand procesorem. Proto je telo definice expandovano, ale \catcode
jeste *neni* provedeno. Teprve ve fazi provedeni makra z \edef, kdy
\catcode propadne do hlavniho procesoru, se zmeni tabulka kategorii. To
je ovsem pro zde formulovany problem ponekud pozde a o to tady slo.

> v prevodni  tabulce se na pozici znaku `o' zapise kod
> \active, ale prevodni tabulka se uz v tuto chvili vubec nepouzije -
> protoze znak o je uz proste nacteny a prelozeny na token. Takze
> nasledujici prikaz \def zjisti, ze jeho prvni parametr (znak `o') ma
> typ LETTER - a ohlasi chybu, protoze prvni parametr prikazu \def musi
> byt bud \active, nebo klicove slovo.
>
> Takze opravdu je treba PRED ZAPOCETIM definice \def zmenit \catcode.

Ano, protoze timto zpusobem povel \catcode "propadl" do hlavniho
procesoru a zmenil chovani token procesoru, ktery scanuje jednotlive
nasledujici znaky vstupniho textu a mezi nimi i znaky s definici
makra \NewKeybard (to vynechani "o" v identifikatoru makra neni preklep
ale schvalnost, kazdy uz asi vi proc).

Petr Olsak




More information about the csTeX mailing list