\hsize11cm
\vsize16cm
\emergencystretch=1em
\parindent=1em

\font\petit=cstt8
\chyph

\def\cs{$\cal C\kern-.1667em\lower.5ex\hbox{$\cal S$}\kern-.075em $}

\def\allowhyphens{\nobreak\hskip0pt\relax}
\def \uv#1{\char254 \allowhyphens#1\allowhyphens\char255 }

\catcode`\"13
\def"{\leavevmode\hbox\bgroup\let"=\egroup\setverb\tt}
\def\setverb{\def\do##1{\catcode`##1=12}\dospecials\obeyspaces}
\def\begtt{\par\medskip\hrule\nobreak\smallskip
  \bgroup\def\par{\null\endgraf\penalty1001\noindent}\setverb
   \catcode`\"12\obeylines\baselineskip=.8\baselineskip\startverb}
{\catcode`|=0 \catcode`\\=12 |gdef|startverb#1\endtt{|petit #1|egroup
  |medskip|hrule|medskip}}
{\obeyspaces\gdef {\ }}

\def\begitems{\medskip\bgroup\catcode`\*=13 \narrower}
\def\enditems{\par\egroup\medskip}
{\catcode`\*=13 \gdef*{\par\noindent\llap{$\bullet$\ }\ignorespaces}}


\def\title#1\par{\noindent{\bf#1}\vskip.5cm}
\def\autor#1\par{\noindent{\bf#1}\bigskip}



\title Datab�ze bez datab�zov�ho programu
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\autor Petr Ol��k


P�ed ned�vnem jsem se nab�dl Karlovi Hor�kovi, �e budu spravovat datab�zi
�len� na�eho sdru�en�. Po jist� \uv{jednac� dob�} jsem od n�j obdr�el
p��slu�nou datab�zi ve form�tu DBase. Uk�zalo se, �e struktura t�to
datab�ze nen� p��li� dob�e do�e�ena a �e bude pot�eba zm�nit a doplnit plno
�daj�.

S�m jsem necht�l m�t nic spole�n�ho s~��dn�m datab�zov�m syst�mem.
Po rozvaze, co budu od datab�ze o�ek�vat, jsem dosp�l k~jednozna�n�mu
z�v�ru, �e na dopl�ov�n� a zm�ny �daj� vysta��m s~oby�ejn�m editorem,
re�er�e a tisky mi ud�l� \TeX{} a �azen� podle �esk� abecedy program {\tt
csr}. �azen� podle jednodu���ch polo�ek, (nap�. podle sm�rovac�ho ��sla)
zvl�dne funkce \uv{Sort} v~editoru.

Datab�zi jsem transformoval z~vnit�n� datov� reprezentace p��slu�n�ho
datab�zov�ho programu do textov�ho souboru, kde jeden ��dek odpov�dal
jednomu \uv{formul��i} a jednotliv� polo�ky l�covaly p�kn� pod sebou.
Polo�ky jsem d�le odd�lil celkem snadno pomoc� blokov�ch operac� editoru
jist�mi odd�lova�i (smluven�mi znaky), aby je mohl spr�vn� rozli�it
\TeX{}. K~manipulaci s~datab�z� jsem pou�il editor Qedit.

Nezn�m vymo�enosti datab�zov�ch program�. U� v~jednom sv�m �l�nku jsem
p�iznal, �e datab�zov� syst�my v�bec neum�m. Proto nemohu srovn�vat v�hody
t�chto syst�m� s navr�enou koncepc�.
P�esto se pokus�m o~uveden� n�kolika d�vod�, pro� mi pr�ce v~editoru
p�ipad� p�ijateln�j��.

\begitems
* Nen� pot�eba u�it se ovl�dat nov� u�ivatelsk� prost�ed�.
* S~datab�z� je mo�n� bez probl�m� pracovat v~UNIXu i v~DOSu.
* Textov� soubor mohu snadno pos�lat nap�. ostatn�m �len�m v�boru a nenutit
  je p�i �ten� �daj� pou��vat n�jak� datab�zov� syst�m. Kdy� jim
  nav�c po�lu makra pro zpracov�n� \TeX{}em, je v�e zcela bez probl�m�.
* Je-li v�jime�n� v~jednom formul��i n�jak� polo�ka del�� (nap��klad v�jime�n�
  dlouh� e-mailovsk� adresa), nemus� se p�ed�l�vat struktura datab�ze.
  Sta�� d�t t�to polo�ce prostor na �kor sousedn� polo�ky, proto�e p�i
  zpracov�n� pro tisk maj� stejn� rozhoduj�c� roli odd�lovac� znaky a
  nikoli poloha �daje na ��dku.
* Vyhled�v�n� libovoln�ho �daje prob�h� snadno pomoc� funkce \uv{find}
  v~editoru.
* Prost�m posunov�n�m kurzoru ve vertik�ln�m nebo horizont�ln�m sm�ru lze
  sledovat ur�it� �daj bu� v~kontextu s~�daji stejn�ho typu (nap�. platby
  za rok 1994) nebo v~r�mci jednoho ��dku (jeden �len sdru�en�). Na obrazovce
  jsou vid�t a snadno dosa�iteln� �daje v~obou t�chto sm�rech.
* Dopl�ov�n� �daj� (nap�. �daje o~platb�ch �lensk�ch p��sp�vk�) lze
  prov�d�t s~minim�ln�m po�tem �hoz� na kl�vesnici, proto�e pro posko�en�
  kurzoru v~��dku na po�adovan� m�sto a pro dopln�n� st�le se opakuj�c�ch
  �daj� (nap�. rok platby) lze ud�lat makro editoru.
* Kdykoli lze pomoc� blokov� operace t��d�n� se�adit datab�zi tak, �e
  je p�ehledn� vid�t sledovan� �daj. Nap��klad se�azen� podle �daje \uv{je
  �len v�boru} odd�l� �leny v�boru od ostatn�ch �len�.
\enditems

P�izn�v�m, �e koncepce bude asi pro rozs�hl� datab�zov� bal�ky �daj�
nedosta�uj�c�. Napadaj� m� tyto nev�hody:

\begitems
* M��e se narazit na kapacitn� mo�nosti editoru (nap�. pro Qedit je
  maxim�ln� d�lka ��dku 512 znak� a maxim�ln� velikost souboru je omezena
  velikost� konven�n� pam�ti DOSu).
* M��e se jedinou neopatrnou operac� v~editoru po�kodit struktura datab�ze
  tak, �e n�prava je t�ko dosa�iteln�. Zvl�t� pravd�podobn� to je 
  v~p��pad�, kdy s~datab�z� pracuj� nepou�en� osoby, kter� neum� spr�vn�
  zach�zet s~editorem.
* Je ot�zka, zda m��e poslo�it strukturovan� textov� soubor
  jako vstup do datab�zov�ho syst�mu, ve kter�m bude cht�t pracovat m�j
  n�sledovn�k, kter� bude pokra�ovat v~obhospoda�ov�n� datab�ze �len�
  na�eho sdru�en�.
\enditems

Prvn� nev�hoda nehr�la v~p��pad� datab�ze �len� \cs TUGu velkou roli,
proto�e cel� datab�ze m� objem pouze 130 kB a d�lka jednoho ��dku
je zhruba 370 znak�. Ani druhou nev�hodu nepova�uji za d�le�itou, proto�e
z�lohovat jakoukoli pr�ci je nutnost. Kdo nez�lohuje, m��e na to tvrd�
doplatit, i kdy� pou��v� kvalitn� a \uv{blbuvzdorn�} datab�zov� syst�m.
T�et� nev�hoda se asi vyskytuje obecn� p�i p�echodu od jednoho datab�zov�ho
syst�mu k~jin�mu. Pokud ov�em datab�zov� syst�m neum� import dob�e
strukturovan�ch textov�ch soubor�, pak to je dosti �patn� datab�zov�
syst�m.

Nyn� se zastav�m u~dal��ch \uv{sou��st�} t�to koncepce udr�ov�n� datab�ze.
Krom� editoru toti� pracuji je�t� s~dal��mi dv�ma softwarov�mi prost�edky.
Jedn�m z~nich je program {\tt csr} a druh�m z~nich je \TeX{}.
Oba programy jsou nez�visl� na pou�it�m syst�mu (UNIX nebo DOS), a proto
se takto koncipovan� datab�ze snadno udr�uje na obou syst�mech z�rov��.

Pokud jde o~�azen� podle abecedy, u�inil jsem toto pozorov�n�. P�vodn�
datab�ze, kterou jsem obdr�el od Karla Hor�ka, m�la snahu b�t se�azena
podle jak�si pseudoabecedy, kde v�echny akcentovan� znaky byly pozd�ji
ne�~Z. �e by existovalo n�co jako dvojhl�ska CH, nebo dokonce
v�cepr�chodov� syst�m porovn�v�n�, o~tom nemoho b�t ani �e�i.
Podobn� zmr�en� datab�zov� v�stupy dost�v�m ka�doro�n� jako seznamy
student� ze studijn�ho odd�len�. Dosp�l jsem tedy (p�izn�m, �e bez
d�kladn�j��ho pr�zkumu) k~z�v�ru, �e existuje plno datab�zov�ch syst�m�,
kter� �eskou normu abecedn�ho �azen� slov neuzn�vaj�. �ekl jsem si, �e
takto zr�dn� pokra�ovat nebudu a napsal jsem si program, kter� dodr�uje p�i
�azen� �eskou a slovenskou normu. Vlastnosti programu jsou pops�ny v~�l�nku
{\it Program csr -- abecedn� �azen� podle normy}. �l�nek by m�l vyj�t v
tomto ��sle bulletinu.

Nyn� rozebereme \TeX{}ovsk� makra, kter� jsem pro ��ely obhospoda�ov�n�
datab�ze �len� vytvo�il. P�edev��m jsem definitivn� odd�lil datab�zi
individu�ln�ch �len� a kolektivn�ch, proto�e �daje, kter� pot�ebujeme m�t
zaneseny, maj� v obou p��padech dosti odli�nou strukturu. Snaha po
sjednocen� struktury obou datab�z�, kter� p�i vzniku po��ta�ov� evidence
�len� existovala, vedla k~naprosto ne��eln�m, nepochopen�m a vesm�s
nevypl�ovan�m polo�k�m, jako nap�. polo�ka s~n�zvem mezi��dek1 a
mezi��dek2.

Udr�uji tedy dva datab�zov� soubory {\tt individ.tb} a {\tt kolekt.tb},
kter� obsahuj� vlastn� datab�zov� �daje v~textov� podob�. Ke ka�d�mu
z~t�chto soubor� je naps�n soubor maker {\tt individ.tex} a {\tt
kolekt.tex}. \TeX{} se spou�t� na soubor {\tt*.tex} v~n�m� se pomoc�
p��kazu "\input" p�ejde na odpov�daj�c� datab�zov� soubor. Soubory
{\tt *.tex} obsahuj� tato makra:

\begitems
* Makra na \uv{scannov�n�}, tj. na�ten� obsahu jednotliv�ch polo�ek pomoc�
  smluven�ch odd�lova��.
* Makra na vytv��en� re�er�n�ch tisk� (nap�. vytiskneme jen �leny, kte��
  maj� nepr�zdnou polo�ku \uv{e-mail}  a z�rove� nezaplatili za rok 1993)
* Makra na form�ty v�stupu. V~sou�asn� dob� jsou vytvo�eny t�i form�ty:
  Tisk v�ech �daj�, tisk p�ehledu plateb (samoz�ejm� se zabudovan�m
  s��t�n�m a vypln�n�m ��dku \uv{celkem}) a kone�n� tisk adres na
  samolepky.
* Za zm�nku stoj� je�t� n�kter� \uv{pomocn�} makra. Nap��klad makro
  "\scandatum" p�e�te datum ve form�tu "19940621" a vys�z� 21.~6.~1994.
  Makro "\anone" zase vytiskne slovo \uv{ano} nebo \uv{ne} v z�vislosti na
  hodnot� polo�ky \uv{logick�ho typu}. Nebo makro "\pan" p�e�te rodn� ��slo
  a na z�klad� toho vys�z� bu� \uv{pan} nebo \uv{pan�}. Omlouv�m se v�em
  sle�n�m; rozd�l mezi \uv{pan�} a \uv{sle�nou} nen� z datab�zov�ch �daj�
  zjistiteln�.
\enditems

P�ed zpracov�n�m datab�ze \TeX{}em je pot�eba odkomentavat na konci souboru
{\tt *.tex} jeden z~p��kaz� "\printall", "\printmoney" nebo
"\printaddress". T�mto zp�sobem se stanov� jeden ze t�� form�t� v�stupu.
Pokud bychom cht�li vytvo�it re�er�n� tisk, odkomentujeme nav�c jeden
z~p��kaz� "\reserse", nebo vytvo��me nov�. Nap��klad
\smallskip

\noindent"\reserse{\ifstudent\else\ifx\nezaplatil\moneyTHREE}{\fi\fi}"

\smallskip
\noindent
zp�sob� tisk jen t�ch �len�, kte�� nejsou studenty ("\ifstudent\else")
a z�rove� nezaplatili za rok 1993 ("\ifx\nezaplatil\moneyTHREE").
Druh� parametr p��kazu "\reserse" mus� obsahovat odpov�daj�c� po�et
kontroln�ch sekvenc� {\tt\char92fi}. Vyjad�ovac� mo�nosti pomoc�
{\tt\char92if} a {\tt\char92fi} jsou l�pe patrn� p�i pohledu do souboru
maker. Je toti� pot�eba v�d�t, jak se jed\-no\-tli\-v� polo�ky jmenuj�.
%Jako p��lohu uv�d�m v�pis souboru {\tt individ.tex}.

Pokud by bylo pot�eba p�idat polo�ku nebo zm�nit strukturu datab�ze, je
nutn� pozm�nit tu ��st maker, kter� se v�nuje na��t�n�m polo�ek
(tzv. scannovac� algoritmy). Pokud by bylo pot�eba upravit form�t v�stupu
nebo p�idat dal�� typ v�stupu, pak se provede jednoduch� z�sah do t� ��sti
maker, kter� se star� o~vzhled v�stupu (viz definice tisku). Tyto dv� ��sti
maker vz�jemn� spolupracuj�, ale je mo�n� je upravovat my�lenkov� odd�len�.

Uveden� koncepce zpracov�n� datab�zov�ch �daj� se d� pou��t nap��klad p�i
organizov�n� konferenc�. Pokud by si to n�kdo cht�l vyzkou�et pro svou
aplikaci, uv�d�m na z�v�r pro inspiraci v�pis souboru maker {\tt
individ.tex}. Aby bylo mo�no l�pe rozum�t makr�m z~tohoto souboru,
p�edch�z� uk�zka jednoho ��dku ze souboru {\tt individ.tb}.
Ka�d� ��dek v~souboru {\tt individ.tb} za��n� p��kazem "\p". Za n�m
n�sleduj� polo�ky t�kaj�c� se jednoho �lena odd�len� symbolem {\tt:}
nebo "|" podle smluven� struktury. Uk�zka ��dku t�kaj�c� se jednoho �lena
se nevejde na jeden ��dek v~bulletinu. Proto je rozd�lena do v�ce ��dk�.
V�zte ale, �e ve skute�nosti se jedn� o~jeden ��dkek obsahuj�c� zhruba 370
znak�.

\begtt
  \p Ferdinand    Mravenec   :010101/1234
      |Ond�eje Sekory 3  :Praha 13   :11300:     :mravenec@brouk.les.cz
      |Pr�ce v�eho druhu :RNDr.   :CSc. :     :                       :
      |     :        :     :     |FFTT: 1993
      |-:     :        : 150:19930709: 150:19940511|
\endtt


Soubor maker {\tt individ.tex} vypad� takto:

\begtt
% Makro na zpracov�n� datab�ze �len� CSTUGu
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 9.11.1994                      Petr Ol��k
% Plain

\newcount\globnum  \newcount\num
\newcount\sumTWO \newcount\sumTHREE \newcount\sumFOUR
\newif\ifstudent \newif\ifvybor \newif\ifrevizor
\newif\ifprihlas \newif\iftisk

% Scannovac� algoritmy:
%%%%%%%%%%%%%%%%%%%%%%%

\def\p#1|#2|#3|#4|#5|#6| {\advance\globnum by1
  \begingroup
  \scanname #1|\scanaddr #2|\scanoccup #3|\scanother #4|%
  \scanlogic #5|\scanmoney #6|%
  \expandafter\test\expandafter\print\endtest
  \endgroup}
\def\scanname #1 #2:#3|{%
  \def\jmeno{#1}%                    % jm�no
  \def\prijmeni{#2\unskip}%          % p��jmen�
  \def\rc{#3\unskip}}%               % rodn� ��slo
\def\scanaddr #1:#2:#3:#4:#5|{%
  \def\uliceD{#1\unskip}%            % ulice \
  \def\mestoD{#2\unskip}%            % m�sto  -- adresa pro korespondenci
  \def\pscD{#3\unskip}%              % PS�   /
  \def\telD{#4\unskip}%              % telefon dom�
  \def\email{#5\unskip}}%            % email
\def\scanoccup #1:#2:#3:#4:#5:#6|{%
  \def\zamestnani{#1\unskip}%        % zam�stn�n�
  \def\titul{#2\unskip}%             % titul p�ed jm�nem
  \def\csc{#3\unskip}%               % titul za jm�nem
  \def\pscZ{#4\unskip}%              % PS� (zam.)
  \def\uliceZ{#5\unskip}%            % ulice (zam.)
  \def\mestoZ{#6\unskip}}%           % m�sto (zam.)
\def\scanother #1:#2:#3:#4|{%
  \def\telZ{#1\unskip}%              % telefon do zam.
  \def\fax{#2\unskip}%               % fax
  \def\telex{#3\unskip}%             % telex
  \def\poznamka{#4\unskip}}%         % pozn�mka
\def\scanlogic #1#2#3#4:#5|{%
  \def\jestudent{\anone #1}\if #1T\studenttrue\else\studentfalse\fi
  \def\jevybor{\anone #2}\if #2T\vybortrue\else\vyborfalse\fi
  \def\jeprihlas{\anone #3}\if #3T\prihlastrue\else\prihlasfalse\fi
  \def\jetiskni{\anone #4}\if #4T\tisktrue\else\tiskfalse\fi
  \def\rokclenstvi{#5\unskip}}%     % �len od roku
\def\scanmoney #1:#2:#3:#4:#5:#6:#7|{%
  \def\moneyONE{\anone #1}%         % zaplatil za r. 91 (ano/ne)
  \def\moneyTWO{#2}%                % p��sp�vek za r. 92
  \def\datumTWO{#3}%                % datum p��sp�vku 92
  \def\moneyTHREE{#4}%              % p��sp�vek za r. 93
  \def\datumTHREE{#5}%              % datum p��sp�vku 93
  \def\moneyFOUR{#6}%               % p��sp�vek za r. 94
  \def\datumFOUR{#7}}%              % datum p��sp�vku 94

\def\anone #1{\if#1Tano\else\if#1Fne\else nic\fi\fi}
\let\test=\relax  \let\endtest=\relax
\def\nezaplatil{ 0}
\def\emptyM{ }
\def\emptyP{ \unskip}
\def\reserse#1#2{\def\test{#1}\def\endtest{#2}}
\reserse{\relax}{\relax}
\let\finalaction=\relax

% Definice tisku
%%%%%%%%%%%%%%%%

\def\hb{\hfil\break}
\def\scandatum#1{\if#1:\let\next=\eatcolon
   \else\let\next=\makedatum\fi\next#1}
\def\zerox{0}
\def\makedatum#1#2#3#4#5#6#7#8:{%
  \def\tempa{#7}\def\tempb{#5}%
  \ifx\tempa\zerox\def\tempa{}\fi\ifx\tempb\zerox\def\tempb{}\fi
  \tempa#8.\kern.2em \tempb#6.\kern.2em #1#2#3#4}
\def\eatcolon:{}

\def\printall {%
  \let\pt=\sevenrm
  \hoffset=-1.5cm \advance\hsize by3cm
  \voffset=-1.5cm \advance\vsize by3cm
  \def\beforeprint{\tisktrue}
  \parskip=\smallskipamount
  \baselineskip=10pt \lineskiplimit=-5pt
  \def\print {%
    \global\advance\num by1
    \vbox{\leftskip=\parindent
    \noindent\llap{\bf \the\globnum. }%
    {\bf \prijmeni\ \jmeno}, {\pt R�:} \rc,
    {\pt Ulice:} \uliceD, {\pt M�sto:} \mestoD, {\pt PS�:} \pscD,
    {\pt telD:} \telD.\hb
    {\pt Zam:} \zamestnani, {\pt titul:} \titul, {\pt za jm�nem:} \csc.
    {\pt email:} {\tt \email},
    {\pt telZ:} \telZ, {\pt fax:} \fax, {\pt telex:} \telex.\hb
    {\pt UliceZ:} \uliceZ, {\pt M�stoZ:} \mestoZ, {\pt pscZ:} \pscZ,
    {\pt Pozn�mka:} \poznamka.\hb
    {\pt Student:} \jestudent, {\pt �len v�boru:} \jevybor,
    {\pt P�ihl�ka:} \jeprihlas, {\pt Tisknout:} \jetiskni.\hb
    {\pt Od roku:} \rokclenstvi, {\pt p��sp�vky: }{\pt 91:} \moneyONE,
    {\pt 92:}\moneyTWO\ (\expandafter\scandatum\datumTWO:),
    {\pt 93:}\moneyTHREE\ (\expandafter\scandatum\datumTHREE:),
    {\pt 94:}\moneyFOUR\ (\expandafter\scandatum\datumFOUR:).\par
    }\medskip}
}

\def\l#1#2{\hbox to#1{#2\hss}}
\def\r#1#2{\hbox to#1{\hss#2}}
\def\c#1#2{\hbox to#1{\hss#2\hss}}

\def\printmoney {%
  \advance\hsize by25pt
  \advance\vsize by2\baselineskip
  \def\beforeprint{\tisktrue}
  \headline{\vbox to0pt{\kern-1mm\hbox to\hsize{%
    \hskip3em\l{4cm}{Jm�no a p��jmen�}%
    \l{3em}{�lenstv�}\r{3em}{1991}%
    \c{9em}{1992}\c{9em}{1993}\c{9em}{1994}\hss
    }\kern2pt\hrule\vss}}
  \def\print {%
    \global\advance\num by1
    \ifx\moneyTWO\emptyM\else\global\advance\sumTWO by\moneyTWO\fi
    \ifx\moneyTHREE\emptyM\else\global\advance\sumTHREE by\moneyTHREE\fi
    \ifx\moneyFOUR\emptyM\else\global\advance\sumFOUR by\moneyFOUR\fi
    \noindent
    \r{3em}{\the\num.\ \ }\l{4cm}{\prijmeni\ \jmeno}%
    \l{3em}{\rokclenstvi\ifstudent*\fi}%
    \r{3em}{\moneyONE}%
    \r{3em}{\moneyTWO}\r{6em}{\expandafter\scandatum\datumTWO:}%
    \r{3em}{\moneyTHREE}\r{6em}{\expandafter\scandatum\datumTHREE:}%
    \r{3em}{\moneyFOUR}\r{6em}{\expandafter\scandatum\datumFOUR:}%
    \par
    }
  \def\finalaction {%
    \medskip\hrule\medskip
    \noindent\hskip3em
    \l{4cm}{\bf Celkem}\hskip6em\r{3em}{\the\sumTWO}\hskip6em
    \r{3em}{\the\sumTHREE}\hskip6em\r{3em}{\the\sumFOUR}\par
    }
}

\def\pan{\expandafter\scanrc\rc}
\def\scanrc#1{\if#1\unskip pan\let\next=\relax
  \else\let\next=\scanrcnum\fi \next#1}
\def\scanrcnum#1#2#3#4\unskip{\ifnum#3>4 pan�\else pan\fi}

\def\mkpsc{\expandafter\scanpsc\pscD}
\def\scanpsc#1{\if#1\unskip\let\next=\relax\else\let\next=\scanpscnum\fi
  \next#1}
\def\scanpscnum#1#2#3#4\unskip{#1#2#3\thinspace#4\unskip}

\def\printaddress{
  \baselineskip=1.1\baselineskip
  \nopagenumbers
  \hoffset=-1in  \hsize=210mm
  \voffset=-1in  \vsize=297mm \raggedbottom
  \lineskip=0pt
  \def\print {%
     \iftisk
     \global\advance\num by1
     \ifnum\num=16\par\global\num=1\fi
     \noindent\vbox to 37mm{\hsize=70mm \leftskip=18mm\vss
     \noindent \pan \hb
     \jmeno\ \expandafter\uppercase\expandafter{\prijmeni}\hb
     \hbox{}\uliceD\par
     \noindent\llap{\mkpsc\enspace}{\bf\mestoD}
     \vss}\hskip0pt plus2pt
     \fi}
}

% Vlastn� zpracov�n� (re�er�e a deklarace form�tu tisku)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Re�er�e se zad�vaj� pomoc� p��kazu \reserse se dv�ma parametry.
% Prvn� parametr obsahuje vlastn� podm�nku a druh� parametr odpov�daj�c�
% po�et \fi-�.
% Je mo�no pou��t: \ifstudent \ifvybor \ifrevizor \ifprihlas \iftisk.
% Testy na polo�ky typu \ifx, p�i�em� pr�zd� polo�ka se testuje na
% \emptyP, pr�zdn� polo�ka v �daji o zaplacen� na \emptyM a nulov�
% hodnota v �daji o zaplacen� m� reprezentaci \nezaplatil.
% N�sleduj�c� p��klad vybere v�echny �leny v�boru, kte�� maj� nepr�zdnou
% polo�ku email:

% \reserse{\ifvybor\ifx\email\emptyP\else}{\fi\fi}

% Jin� p��klad vybere v�echny �leny, kte�� nezaplatili za rok 93:

% \reserse{\ifx\nezaplatil\moneyTHREE}{\fi}

% Dal�� p��pady:
% \reserse{\ifnum\num>30\endgroup\end\else}{\fi}
% \reserse{\ifstudent}{\fi}

% Fom�t tisku se vybere z n�sleduj�c�ch p��kaz�. Lze definovat
% analogicky dal�� form�ty (viz ��st definice tisku).

%\printall     % vytiskne v�echny �daje v dosti zhu�t�n�m tvaru.
\printmoney   % vytiskne prehled plateb.
%\printaddress % vytiskne adresy na lejbl�ky

\input individ.tb
\finalaction
\end
\endtt

\noindent 8.~12.~1994 \hfill {\it Petr Ol��k\/}

\end  % !!! a� tento druh� end je koncem �l�nku, ten prvn� je sou��st� uk�zky.
