Extremne rozdilny vstup/vystup, bylo: Re: Pocet znaku.

Alexej Sveshnikov svesh at seznam.cz
Wed Apr 6 11:32:59 CEST 2005


Jiri Zelinka wrote:
> Zatimco u prvniho prikladu jsem odhadl, z ceho se vysledek bude skladat,
> a mam pocit, ze kdybych se nad tim poradne zamyslel, tak bych to
> pochopil, u druheho jsem ziral na vysledek jako tele na nove vrata.
> Nasel jsem tam sice par zamaskovanych prikazu, ale kde je schovany cely
> ten text, to vazne nechapu. Nezbyva mi nez smeknout pred TeXovskymi mistry.
>> \let~\catcode~`76~`A13~`F1~`j00~`P2jdefA71F~`7113jdefPALLF
>> PA''FwPA;;FPAZZFLaLPA//71F71iPAHHFLPAzzFenPASSFthP;A$$FevP
>> A@@FfPARR717273F737271P;ADDFRgniPAWW71FPATTFvePA**FstRsamP
>> AGGFRruoPAqq71.72.F717271PAYY7172F727171PA??Fi*LmPA&&71jfi
>> Fjfi71PAVVFjbigskipRPWGAUU71727374 75,76Fjpar71727375Djifx
>> :76jelse&U76jfiPLAKK7172F71l7271PAXX71FVLnOSeL71SLRyadR at oL
>> RrhC?yLRurtKFeLPFovPgaTLtReRomL;PABB71 72,73:Fjif.73.jelse
>> B73:jfiXF71PU71 72,73:PWs;AMM71F71diPAJJFRdriPAQQFRsreLPAI
>> I71Fo71dPA!!FRgiePBt'el@ lTLqdrYmu.Q.,Ke;vz vzLqpip.Q.,tz;
>> ;Lql.IrsZ.eap,qn.i. i.eLlMaesLdRcna,;!;h htLqm.MRasZ.ilk,%
>> s$;z zLqs'.ansZ.Ymi,/sx ;LYegseZRyal, at i;@ TLRlogdLrDsW,@;G
>> LcYlaDLbJsW,SWXJW ree @rzchLhzsW,;WERcesInW qt.'oL.Rtrul;e
>> doTsW,Wk;Rri at stW aHAHHFndZPpqar.tridgeLinZpe.LtYer.W,:jbye

Na prvnim radku jsou predefinovany kategorii symbolu:
  7 ma kategorii 6  (parametr, obvykle #)
  A ma kategorii 13 (aktivni)
  F ma kategorii 1  (zacatek skupiny, obvykle { )
  j ma kategorii 0  (signalni, obvykle \ )
  P ma kategorii 2  (konec skupiny, obvykle } )
Pokud v dalsim textu provedeme zameny
  7 -> #
  F -> {
  j -> \
  P -> }
tak dostaneme soubor, ktery uz se vic podoba TeXu:

                                    \defA#1{~`#113\def}ALL{
}A''{w}A;;{}AZZ{LaL}A//#1{#1i}AHH{L}Azz{en}ASS{th};A$${ev}
A@@{f}ARR#1#2#3{#3#2#1};ADD{Rgni}AWW#1{}ATT{ve}A**{stRsam}
AGG{Rruo}Aqq#1.#2.{#1#2#1}AYY#1#2{#2#1#1}A??{i*Lm}A&&#1\fi
{\fi#1}AVV{\bigskipR}WGAUU#1#2#3#4 #5,#6{\par#1#2#3#5D\ifx
:#6\else&U#6\fi}LAKK#1#2{#1l#2#1}AXX#1{VLnOSeL#1SLRyadR at oL
RrhC?yLRurtK{eL}{ov}gaTLtReRomL;}ABB#1 #2,#3:{\if.#3.\else
B#3:\fiX{#1}U#1 #2,#3:}Ws;AMM#1{#1di}A\\{Rdri}AQQ{RsreL}AI
I#1{o#1d}A!!{Rgie}Bt'el@ lTLqdrYmu.Q.,Ke;vz vzLqpip.Q.,tz;
;Lql.IrsZ.eap,qn.i. i.eLlMaesLdRcna,;!;h htLqm.MRasZ.ilk,%
s$;z zLqs'.ansZ.Ymi,/sx ;LYegseZRyal, at i;@ TLRlogdLrDsW,@;G
LcYlaDLb\sW,SWX\W ree @rzchLhzsW,;WERcesInW qt.'oL.Rtrul;e
doTsW,Wk;Rri at stW aHAHH{ndZ}pqar.tridgeLinZpe.LtYer.W,:\bye

Pak je definovan prikaz A, co v obvyklych oznacenich znamena
\def A#1{\catcode`#1=13 \def} % nastavi parametru kategorii 13 (aktivni)
                               % a pripravi jeho definici

Nasleduje spousta definici typu
A<pismenko><to same pismenko>{neco}

Napriklad, L stava mezerou (vznikne z konce radku), ' -> w,
Z -> ' a ' (protoze L je mezera), z -> en, S -> th, $ -> ev atd.

Ted' se podivame na konec souboru, napr. sem (skoro cely posledni radek):
Rri at stW aHAHH{ndZ}pqar.tridgeLinZpe.LtYer.W,:\bye

Vyhledejme definici makra R (musi zacinat ARR): ARR#1#2#3{#3#2#1}
Takze ma tri parametry a vraci je v obracenem poradi. Tim padem Rri@ -> @ir
Definice @ vypada tak: A@@{f}, takze @ -> f. Dohromady mame
Rri at st - > first
Makro W jen pohlcuje svuj parametr (jeho definice zni AWW#1{} )
Pak nasleduje zajimava cast aHAHH{ndZ} ktera zpusobi to, ze poprve mame
ve vysledku jejiho zpracovani 'a ', a pak uz jenom 'and a '.
Zbyva: pqar.tridgeLinZpe.LtYer.
Tady se pouzivaji dve makra 'q' a 'Y'. Dole jsou opsana jejich definice:
Aqq#1.#2.{#1#2#1}
AYY#1#2{#2#1#1}
Taky si pamatujeme, ze L -> ' ', Z -> ' a '.
Pak tady vidime pismeno 'p' za kterym nasleduje volani 'q' se dvema parametry
#1 -> ar
#2 -> tridgeLinZpe
To se prevadi na #1#2#1 a dava 'artridge in a pear'
Nakonec, LtYer se prevede na ' t' a volani Y s parametry #1 -> e, #2 -> r.
Ve vysledku dostaneme #2#1#1, nebo 'ree'. Spolecne s posledni teckou to dava
dohromady 'partridge in a pear tree.'.

Myslim, ze ted pro vas nebude problem najit i dalsi text schovany na konci
souboru. Co je skutecne zajimave, tak to je zpusob, jak pomoci dvou
rekurzivnich maker vypsat cely ten text. Pokud odstranime zbytecne definice,
ktere slouzi vyhradne ke kodovani textu (jako 'q', 'Y', 'R' a podobne),
dostaneme celkem dobre citelny TeXovsky zdrojak. V prikladu dole jsem jeste
nahradil aktivni symboly za jednopismenkova makra (nazvy jsem ponechal stejne
jako v puvodnim souboru s vyjimkou W, ktere jsem nahradil za ~).
Pochopeni toho, jak funguje tento program uz neni prilis obtizne.

\def\;{}
\def~#1{}
\def\H{ }
\def\D{ing}
\def\S{th}
\def\X#1{\bigskip On the #1\S\ day of Christmas my true love gave to me}
\def\&#1\fi{\fi#1}
\def\U#1#2#3#4 #5,#6{\par#1#2#3#5\D\ifx:#6\else\&\U#6\fi}
\def\B#1 #2,#3:{\if.#3.\else\B#3:\fi\X{#1}\U#1 #2,#3:}
\B
twelf lve\ drummers\ drumm,%
eleven ven\ pipers\ pip,%
ten \ lords\ a\ leap,%
nine e\ ladies\ danc,%
eigh ht\ maids\ a\ milk,%
seven en\ swans\ a\ swimm,%
six \ geese\ a\ lay,%
fi\;f ve\ gold\ rings~,%
four r\ calling\ birds~,%
th\;ird~ ree\ french\ hens~,%
\;\;\;second~ two\ turtle\ doves~,%
\;\;\;first~ a\H\def\H{nd\ a\ }partridge\ in\ a\ pear\ tree.~,:%
\bye




More information about the csTeX mailing list