%%  OPmac -- Olsak's PlainTeX macros
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Tech-documentation, Petr Olsak, 2012

\input utf8off \clearmubyte

% This file is encoded in ISO-8859-2 because
% UTF-8 encTeX has a conflict with DocByTeX

\def\projectversion{Dec. 2012}
\def\headtitle{OPmac}

\widowpenalty=10000 
\clubpenalty=10000

\emergencystretch=2em
\hbadness=2200

\showboxbreadth=1500 \showboxdepth=2

\def\csplain{\CS plain}
\def\CS{CS}

\input docby.tex

\setlinecomment{\percent} \noactive{\nb\percent} \noactive{\percent\cbrace}
\noactive{\nb fontdimen}

\title OPmac -- roz�i�uj�c� makra plain\TeX{}u

\author Petr Ol��k

\centerline{\ulink[http://www.olsak.net/opmac.html]%
                         {www.olsak.net/opmac.html}}

\def\db{\dg\nb}
\def\du#1{\api{\nb#1}}
\let\quotehook=\langleactive
\def\insdef#1 {\ifirst{docby.tex}{def\nb#1 }{^^B\cbrace}{++}}
\def\inssdef#1 {\ifirst{docby.tex}{def\nb#1}{\empty}{+-}}
\bgroup
   \catcode`\[=1 \catcode`]=2 \catcode`\{=12 \catcode`\}=12
   \gdef\obrace[{] \gdef\cbrace[}]
\egroup
\def\indexhook{%
%   Kontroln� sekvence ozna�en� �ipkou ($\succ$) jsou
%   u�ivatelsk�mi p��kazy. Ostatn� kontroln� sekvence jsou
%   v~OPmac intern�. 
   Tu�n� je ozna�ena strana, kde je slovo
   dokumentov�no, pak n�sleduje seznam v�ech stran, na kter�ch se slovo 
   vyskytuje.
%   U�ivatelsk� p��kazy maj� v seznamu str�nek podtr�en� ��slo,
%   co� je str�nka, kde je p��kaz vylo�en na u�ivatelsk� �rovni.
   \medskip}
\def\nn#1 {\noactive{\nb#1}} \nn insert \nn undefined

\def\cnvbookmark#1{\lowercase{\lowercase{#1}}}
\def\bookmarkshook{\lo �e \lo �s \lo �c \lo �r \lo �z \lo �y
   \lo �a \lo �i \lo �e \lo �u \lo �u \lo �o \lo �n }
\def\lo #1#2{\lccode`#1=`#2}


\dotoc \bookmarks

\sec �vod
%%%%%%%%%

OPmac je bal�k jednoduch�ch dopl�uj�c�ch maker k plain\TeX{}u umo��uj�c�
u�ivatel�m z�kladn� La\TeX{}ovou funkcionalitu: zm�ny velikosti p�sma,
automatickou tvorbu obsahu a rejst��ku, pr�ci s {\tt bib} datab�zemi,
referencemi, mo�nost prolo�en� referenc� hyperlinkov�mi odkazy atd.


\sec U�ivatelsk� dokumentace
%%%%%%%%%%%%%%%%%%%%%%%%%%%%

U�ivatelsk� dokumentace je zat�m v souboru "opmac-u.tex" a "opmac-u.pdf".
Do tohoto m�sta ji zahrnu pozd�ji a prolinkuji ji s technickou dokumentac�.


\sec Technick� dokumentace
%%%%%%%%%%%%%%%%%%%%%%%%%%

Tato ��st dokumentace je ur�ena pro tv�rce maker, kte�� se cht�j� zde
uveden�mi makry inspirovat a p��padn� je p�izp�sobit sv�mu po�adavku.
P�edpokl�d� se znalost \TeX{}u, tj. nap��klad aspo� zb�n� orientace 
v~\TeX{}booku naruby. Na tuto knihu je na mnoha m�stech odkazov�no pod
zkratkou TBN.


\subsec Z�kladn� makra
%%%%%%%%%%%%%%%%%%%%%%

Na za��tku souboru "opmac.tex" zjist�me, zda nen� soubor �ten� podruh�. V
takov�m p��pad� �ten� odm�tneme. Pt�me se na to, zda je definov�no makro \db
OPmacversion, kter� vz�p�t� definujeme. Je-li n�kdo p�ekvapen, pro� jsem
nepou�il "\expandafter\endpinput\fi", m��e si prostudovat TBN, stranu~358,
heslo "\endinput".

\ifirst {opmac.tex}{OPmacversion}{\empty}{+-}

Dva pracovn� registry:
\dgn \nb tmpnum
\dgn \nb tmpdim

\inext {newcount}{\empty}{+-}

OPmac nebude nikdy hl�sit chyby. �asto ale bude ps�t pomoc� \db opwarning 
na termin�l varov�n�.

\inext {warning}{\empty}{+-}

Makro \db addto "<makro>{<tokeny>}" p�id� na konec "<makra>" dan� "<tokeny>".

\inext {addto}{\empty}{+-}

V OPmac budeme pracovat se seznamem \db protectlist, kter� bude obsahovat
makra, je� chceme m�t tzv. robustn�, tj. chceme, aby se p�i "\write" v output
rutin� neexpandovala. Ka�d�mu makru v~seznamu p�edch�z� "\doprotect", tak�e
seznam "\protectlist" vypad� takto:

\def\begtthook{\langleactive}
\begtt
\doprotect<makro1> \doprotect<makro2> ...
\endtt

\def\begtthook{}
Seznam budeme spou�t�t v output rutin� s t�m, �e "\doprotect" tam bude m�t
v�znam makra, kter� za��d�, aby jeho parametr z�skal v�znam "\relax".
T�m bude zabr�n�no jeho expanzi.
Naprogramujeme \db addprotect "<makro>", kter� za��d� vlo�en� "<makra>" do seznamu. 

\inext {protectlist}{\empty}{+-}

N�kter� makra budou fungovat jen v pdf\TeX{}u p�i nastaven�m "\pdfoutput=1".
P�iprav�me si tedy test \db ifpdftex, kter� pak pou�ijeme p�i �ten� souboru
"opmac.tex". Test nikdy nebudeme vkl�dat do maker, tak�e p�i �ten� souboru
"opmac.tex" u� mus� b�t jasn�, zda bude v�stup sm�rov�n do DVI nebo PDF.
Pozd�j�� zm�na "\pdfoutput" m��e zp�sobit pot��e.

\inext {ifpdftex}{\empty}{+-}

Makra \db sdef a \db sxdef umo��uj� pohodln� definovat kontroln� sekvence
ohrani�en� pomoc� "\csname...\endcsname".

\inext {sdef}{\empty}{+-}

Makro \db adef umo�n� nastavit znak na aktivn� a rovnou ho definovat, co�
norm�ln� uvnit� maker nen� jednoduch� (TBN str. 25 a 26). 
Vyu�ijeme toho, �e "~" je aktivn� znak a pomoc�
"\lccode" a "\lowercase" jej p�ep��eme na po�adovan� znak. Dostaneme t�m 
aktivn� token s po�adovanou ASCII hodnotou a tento token definujeme.
Pomoc� \db lccodetiezero vr�t�me po p�i�azen� (tj. po proveden� definice)
"\lccode" vlnky na p�vodn� hodnotu.

\inext {adef}{\empty}{+-}

Makrem \db isdefined "{<jm�no>}\iftrue" se pt�me, zda je definovan�
"\csname<jm�no>\endcsname". To z�v�re�n� p�ipojen� "\iftrue" makro se�ere,
ale u�ivatel ho p��e zejm�na z toho d�vodu, aby mu tato konstrukce fungovala
uvnit� vno�en�ch "\if..\fi"

\inext {isdefined}{^^B\cbrace}{++}

Makro \db isinlist "<list>{<tokeny>}\iftrue" zjist�, zda "<tokeny>" jsou
(jako string) obsa�eny v~makru "<list>". P�itom se�ere "\iftrue" ze stejn�ch
d�vod�, jak je uvedeno p�ed chv�l�.

\inext {isinlist}{^^B\cbrace}{++}

Makro \db isnextchar "<znak>{<co d�lat p�i ano>}{<co d�lat p�i ne>}" 
pracuje pon�kud odli�n� od p�edchoz�ch maker. Zjist�, zda n�sleduj�c� znak
je "<znak>" a pokud ano, vykon� vnit�ek prvn� z�vorky, jinak vykon� vnit�ek
druh� z�vorky. Pomoc� "\futurelet" ulo�� zkouman� znak do "\next" a spust�
\db isnextcharA.

\inext {isnextchar}{\empty}{+-}

P�edefinujeme makro \db uv z \csplain{}u. Tam je toto makro navr�eno tak, aby
mohlo m�t za sv�j parametr verbatim text. D�sledkem toho nefunguje spr�vn�
kerning. Pova�uji za lep�� m�t spr�vn� kerning a p��padn� uvozov�n� verbatim
text� �e�it t�eba pomoc� "\clqq...\crqq".

\inext {def\nb uv}{}{+-}

Knuth v souboru "plain.tex" zanechal ��dic� sekvenci "\\" v provizorn�m stavu
(cvi�en�: pod�vejte se v jak�m). Domn�v�m se, �e je lep�� ji d�t jednozna�n�
v�znam "\undefined". N�kter�m u�ivatel�m toti� m��e OPmac p�ipom�nat
La\TeX{} a nen� tedy vylou�eno, �e je napadne ps�t "\\". M�li by na to
dostat jednozna�nou odpov��: {\tt undefined control sequence}.

\inext {undefined}{}{+-}

Do pracovn�ho souboru ur�en�ho k nov�mu na�ten� budeme cht�t vlo�it
koment��e za znakem procento. K tomu pot�ebujeme m�t procento jako oby�ejn�
znak kategorie 12. Na tento znak se v na�em k�du p�eklop� otazn�k, Tak�e 
\db percent expanduje na znak procento s kategori� 12.

\inext {percent}{}{+-}

Makro plain\TeX{}u "\,"
funguje jen v matematick� sazb�. U�ivatel bude cht�t makro �asto
pou��t nap��klad mezi ��slem a jednotkou v textov�m m�du: "5\,mm", tak�e
makro p�edefinujeme.

\inext {kern}{}{+-}


\subsec Glob�ln� parametry
%%%%%%%%%%%%%%%%%%%%%%%%%%

Zak�eme vdovy a sirotky a d�le nastav�me registry pro listingy tiskov�ho
materi�lu na smyslupln�j�� hodnoty, ne� jsou implicitn�.

\inext {widowpenalty}{\empty}{+-}

N�sleduj�c� makra a registry ovlivn� chov�n� kl��ov�ch maker OPmac zp�sobem,
jak je pops�no v~koment���ch. Mnoh� z t�chto maker a registr� byly zm�n�ny v
u�ivatelsk� dokumentaci.
\dgn \nb iindent
\dgn \nb ttindent
\dgn \nb ttskip
\dgn \nb ttpenalty
\dgn \nb tthook
\dgn \nb intthook
\dgn \nb iiskip
\dgn \nb bibskip
\dgn \nb tabstrut
\dgn \nb tabiteml
\dgn \nb tabitemr
\dgn \nb vvkern
\dgn \nb hhkern
\dgn \nb multiskip
\dgn \nb colsep
\dgn \nb mnoteindent
\dgn \nb mnotesize
\dgn \nb picdir
\dgn \nb bibtexhook
\dgn \nb chaphook
\dgn \nb sechook
\dgn \nb secchook
\dgn \nb cnvhook
\dgn \nb pghook

\inext {newdimen}{\count=7 \empty}{+-}



\subsec Loga
%%%%%%%%%%%%

V logu \db OPmac je pomoc� "\thefontscale" zv�t�eno p�smeno O. Logo \db CS je
p�eps�no beze zm�ny z CS\TeX{}u. T�m snadno vytvo��me i logo \db csplain.

\inext {def\nb OPmac}{\empty}{+-}

Trouf�m si tvrdit, �e logo \db LaTeX (a�koli je plain\TeX{}ist� asi moc
nebudou pot�ebovat) je v~n�sleduj�c�m k�du daleko l�pe �e�eno, ne� v
samotn�m La\TeX{}u. Po��t� toti� ve spolupr�ci s makrem \db slantcorr 
i se sklonem p�sma p�i usazov�n� zmen�en�ho A. 

\inext {LaTeX}{\empty}{+-}

Loga se ob�as mohou vyskytnout v nadpisech. Zabezpe��me je tedy proti
rozbo�en� p�i z�pisu do REF souboru.

\inext {addprotect}{\empty}{+-}


\subsec Velikosti font�, ��dkov�n�
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\csplain{} od verze "<Nov. 2012>" definuje makro 
\db resizefont "<fontselector>", kter� zm�n�
velikost fontu dan�ho sv�m p�ep�na�em a tento zm�n�n� font si ponech�
stejn� p�ep�na�. Zm�na velikosti je d�na obsahem makra \db sizespec.
Tam m��e b�t nap��klad naps�no "at13pt" nebo "scaled800".
D�le CSplain definuje makro 
\db resizeall, kter� zm�n� velikost
font� s registrovan�mi p�ep�na�i. Registrov�n� se prov�d� makrem
\db regfont. Implicitn� jsou registrov�ny p�ep�na�e 
 "\tenrm", "\tenit", "\tenbf", "\tenbi", a "\tentt".
Do nov�ch velikost� tedy p�jdeme se star�mi n�zvy p�ep�na��
"\ten<n�co>" a to slovo "ten" budeme ch�pat jen jako historick� relikt,
kter� n�m ov�em napov�, �e kontroln� sekvence je fontov�m p�ep�na�em. 

OPmac si zjist�, zda je definovan� "\regfont". Pokud ne, upozorn� na starou
verzi \csplain{}u na termin�lu a pot�ebn� makra si definuje. Je to kopie
k�du ze souboru "csfontsm.tex" z bal��ku \csplain{}.

\inext {regfont}{\empty}{+-}

Implicitn� jsou zavedeny \CS{}fonty, tak�e k nim p�id�me AMS fonty z
"ams-math.tex", kter� vizu�ln� odpov�daj�. Pozd�ji si m��e u�ivatel zav�st
jin� makro (nap�. "tx-math.tex") a zavede si t�eba i jin� textov� fonty. To nezm�n�
vlastnosti maker v OPmac, pokud nov� soubory maker spr�vn� p�edefinuj�
makra "\setmathsizes[<text>/<script>/<scriptscript>]", "\normalmath" a
"\boldmath".

\inext {ams-math}{\empty}{+-}

Po na�ten� souboru ams-math disponujeme makry \db regtfm na registraci
r�zn�ch metrik pro r�zn� designovan� velikosti font� a \db whichtfm, kter�
expanduje na sv�j parametr nebo na metriku, kter� je registrov�na pro
velikost \db dgsize. Registrace metrik \CS{}font� je rovn� provedena
v souboru {\tt ams-math.tex}. Jak bylo �e�eno,
makro "\resizefont<fontselector>" \csplain{}u zm�n�
velikost fontu "<fontselector>" podle obsahu makra "\sizespec" (viz soubor
{\tt csfontsm.tex}). Toto makro "\resizefont" vol� pomocn� makro \db
resizefontskipat na odstran�n� \uv{sizespec} z n�zvu metriky. Toto pomocn�
makro je v OPmac p�edefinov�no s vyu�it�m "\whichtfm", tak�e kdy� p�ed 
vol�n�m makra "\resizefont" p�iprav�me spr�vnou "\dgsize", \TeX{} pou�ije 
metriku designovanou na po�adovanou velikost:

\inext {resizefontskip}{\empty}{+-}

Makra "\typosize", "\fontsizex", "\textfontsize", 
"\setbaselineskip" po�aduj� z�pis parametru bez jednotky. 
Jednotkou je \db ptunit, kter� je nastavena na 1pt. U�ivatel m��e
jednotku zm�nit (nap�. "\ptunit=1mm" p�i n�vrhu plak�tu). D�le \db fontdim
je registr, kter� ud�v� aktu�ln� velikost p�sma.

\inext {ptunit}{\empty}{+-}

�asto budeme pot�ebovat odstranit jednotku "pt" ve v�pisu "\the<dimen>".
Provedeme to pomoc� "\expandafter\ignorept\the<dimen>". Proto�e "\the"
vyr�b� znaky pt s kategori� 12, je makro \db ignorept definov�no trikem p�es
"\lowercase". Z otazn�ku vznikne p kategorie 12 a z vyk�i�n�ku vznikne t.

\inext {lccode}{\empty}{+-}

Makra \db typosize a \db typoscale zm�n� velikosti a nastavuj� 
v�choz� font "\tenrm" a v�choz�
matematiku "\normalmath". Nehrajeme si na OFS nebo NFSS, kter� se sna�� ct�t
naposledy nastaven� duktus a variantu. U�ivatel si variantu p�sma a tu�n� 
duktus pro matematiku mus� nastavit a� po zavol�n� makra na zm�nu velikosti fontu.

\inext {typosize}{\empty}{+-}

Makro \db fontsizex "[<velikost>]" p�edpokl�d� sv�j parametr bez jednotky.
P�smeno x v n�zvu zna��, �e makro nen� v u�ivatelsk� dokumentaci. U�ivatel
toti� m��e pou��t "\typosize[<velikost>/]" a t�eba ho napadne si n�jak�
vlastn� makro "\fontsize" definovat.
Je-li parametr "<velikost>" pr�zdn�, makro "\fontsizex" neud�l� nic. 
Jinak pomoc� "\textfontsize" nastav�
velikost textov�ch font�. D�le zavol� 
"\setmathsizes[\fontsize/.7\fontsize/.5\fontsize]", ov�em v parametru mus�
odstranit jednotky a parametr p�ichyst� pro makro "\setmathsizes"
expandovan�. P��kazem "\normalmath" nakonec nastav� matematick� fonty do
nov� velikosti.

\inext {fontsizex}{^^B\cbrace}{++}

Makro \db textfontsize "[<velikost>]" p�edpokl�d� sv�j parametr bez
jednotky. P�ipoj� jednotku "\ptunit", nastav� "\dgsize" a "\sizespec" a
zavol� "\resizeall", co� je makro definovan� v \csplain{}u, kter� postupn�
vol� "\resizefont" na v�echny registrovan� fonty.

\inext {textfontsize}{^^B\cbrace}{++}

Makro \db setbaselineskip "[<velikost>]" p�edpokl�d� parametr bez jednotky.
P�ipoj� jednotku "\ptunit" a nastav� "\baselineskip" bez dodate�n�
pru�nosti. Nastav� dal�� registry, kter� s "\baselineskip" souvisej�.
Z�m�rn� nen� nastavena "\topskip", "\splittopskip",
"\above/belowdisplayskip". Tyto parametry (glob�ln� pro cel� dokument) by si
m�l u�ivatel nastavit s�m.

\inext {setbaselineskip}{^^B\cbrace}{++}

Makro \db withoutunit "\makro<dimen>" odstran� jednotku z "<dimen>" a takto
upraven� ��slo vlo�� do parametru "\makro", kter� o�ek�v� �daj bez jednotky
v~hranat� z�vorce.

\inext {withoutunit}{\empty}{+-}

Makra \db fontscalex "<factor>", \db textfontscale "<factor>" a
\db scalebaselineskip "<factor>"
p�epo��taj� "<factor>" podle aktu�ln�ho "\fontdim" resp. "\baselineskip"
na absolutn� jednotku a zavolaj� odpov�daj�c� makro definovan� p�ed chv�l�.

\inext {fontscalex}{\count=3 ^^B\cbrace}{++}

Makro \db thefontsize si alokuje aktu�ln� font do sekvence \db thefont a
tento nov� fontov� p�ep�na� podrob� zm�n� velikosti "\resizefont".
Makro \db thefontscale p�epo��t� parametr na absolutn� velikost a zavol�
"\thefontsize".

\inext {thefontsize}{\count=2 ^^B\cbrace}{++}

Plain\TeX{}ov� \db magstep m� na konci "\relax", tak�e nefunguje jako pouze
expanduj�c� makro. My ale "\magstep" o�ek�v�me v parametrech p��kaz�
"\typoscale" a podobn�ch, proto v "\magstep" je nahrazeno "\relax" m�n�
drsn�m "\space". To separuje ��seln� parametr dostate�n�.

\inext {magstep}{\empty}{+-}

Makro \db em p�ep�n� kontextov� do odpov�daj�c� varianty a ve spolupr�ci s
makrem "\additcorr" p�id�v� italickou korekci. Makro \db additcorr 
si pomoc� "\lastskip" zapamatuje posledn� mezeru, pak ji odstran�, vlo��
italickou korekci a nakonec vr�t� tu odstran�nou mezeru.

\inext {def\nb em}{\empty}{+-}

Fontov� makra zabezpe��me proti rozkladu v parametru "\write".

\inext {addprotect}{\empty}{+-}


\subsec Texty ve v�ce jazyc�ch
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Makro \db mtext "<zna�ka>" je zkratkou za \uv{multilingual text}.
Toto makro si podle zna�ky a aktu�ln�ho jazyka (dle registru "\language")
vyhled�, jak� text m� vypsat.

\inext {mtext}{\empty}{+-}

Jednotliv� texty definujeme pomoc� "\sdef{mt:<zna�ka>:<jazyk>}" takto:

\inext {chap:en}{\empty}{+-}

N�kter� texty jsou zaps�ny pomoc� "\v" notace. Je lep�� ud�lat to takto
ne� vytvo�it soubor "opmac.tex" z�visl� na k�dov�n�. Aby byla tato notace
spr�vn� interpretov�na, spust�me "\csaccents", co� je makro \csplain{}u.
Pokud n�kdo pou��v� OPmac s jin�m form�tem, ne� \csplain, neprovede se nic,
proto�e konstrukce "\csname csaccents\endcsname" se v takov�m p��pad� p�erod� v
"\relax". Makro "\csaccents" spust�me jen tehdy, pokud je u� u�ivatel
nespustil p�ed "\input opmac". To pozn�me podle toho, zda je definovan�
sekvence "\r".

\inext {}{}{+-}

CSplain od verze "Nov. 2012" p�ipravuje n�sleduj�c� 
makra, kter� konvertuj� ��slo "\language" na zna�ku jazyka pro v�echny 
jazyky, kter� maj� nata�eny vzory d�len� slov. 
Pro jistotu (pokud je pou�ita star�� verze CSplainu) tuto koverzi
\uv{nau��me} i makro OPmac:

\inext {sdef}{\empty}{+-}



\subsec REF soubor
%%%%%%%%%%%%%%%%%%

OPmac pou��v� pro v�echny pot�eby (obsah, reference, citace, rejst��k,
pozn�mky na okraji)
jedin� soubor "\jobname.ref" (tzv. REF soubor). 
Nav�c, pokud nen� pot�eba, v�bec tento soubor
nezakl�d�. �asto toti� budeme cht�t d�lat s OPmac jen jednoduch� v�ci a je
�navn� po��d na disku kv�li tomu ukl�zet smet�.

Je pot�eba deklarovat souborov� deskriptory \db reffile a \db testin:

\inext {newwrite}{\empty}{+-}

Do souboru zapisujeme makrem \db wref "\<sekvence>{<data>}", kter� vlo�� do
"\reffile" ��dek obsahuj�c� "\<sekvence><data>".
Implicitn� ale nen� "\reffile" zalo�eno, tak�e implicitn� hodnota tohoto
makra je \db wrefrelax, tedy ned�lej nic.

\inext {wrefrelax}{\empty}{+-}

Makro \db inputref spust�me na konci �ten� souboru "opmac.tex", tedy v
situaci, kdy u� budeme m�t definov�ny v�echny kontroln� sekvence, kter� se v
REF souboru mohou vyskytnout. Nyn� si toto makro jen p�iprav�me.
Makro ov��� existenci souboru "\jobname.ref" a pokud existuje, provede
"\input \jobname.ref". V takov�m p��pad� po na�ten� REF souboru jej otev�e 
k~z�pisu a p�iprav� "\wref" do stavu, kdy toto
makro bude ukl�dat data do souboru. 

\inext {inputref}{^^B\cbrace}{+-}

Makro \db openref kdekoli v dokumentu si vynut� zalo�en� souboru
"\jobname.ref". Toto makro neprovede nic, je-li REF soubor u� zalo�en. To
pozn� podle toho, �e makro "\wref" nem� v�znam "\wrefrelax". Jestli�e soubor
je�t� nen� zalo�en, makro jej zalo��, p�edefinuje "\wref" a vlo�� prvn�
��dek do souboru. T�m je zaru�eno, �e p�i p���t�m \TeX{}ov�n� dokumentu 
je soubor nepr�zdn�, tak�e jej OPmac rovnou p�e�te a znovu zalo�� na za��tku
sv� �innosti. Nakonec se "\openref" zasebevra�d�, aby se nemuselo p�i
opakovan�m vol�n� obt�ovat vykon�vat n�jakou pr�ci. Pr�ce u� je toti�
hotova.

\inext {openref}{^^B\cbrace}{++}

Pro z�pisy do REF souboru pou��v�me tuto konvenci: prvn� kontroln� sekvence
na ��dku je v�dy tvaru "\X<n�zev>", tak�e m�me p�ehled, kter� kontroln� sekvence
poch�z� z REF souboru.



\subsec Lejbl�ky a odkazy
%%%%%%%%%%%%%%%%%%%%%%%%%

K vytvo�en� zp�tn�ho odkazu provedeme t�i kroky (v tomto po�ad�):

\begitems
\item* V m�st� "\label[<lejbl�k>]" si zapamatujeme "<lejbl�k>".
\item* V dob� vygenerov�n� ��sla (sekce, kapitoly, caption, atd.)
       propoj�me "<lejbl�k>" s t�mto ��slem. Provedeme to
       pomoc� "\sxdef{lab:<lejbl�k>}{<��slo>}".
\item* V m�st� "\ref[<lejbl�k>]" vytiskneme "\csname lab:<lejbl�k>\endcsname", 
       tedy "<��slo>".
\enditems

To je z�kladn� idea pro zp�tn� odkazy. V takov�m p��pad� nepot�ebujeme REF
soubor. Pokud ale chceme dop�edn� odkazy, je pot�eba pou��t REF soubor
zhruba takto:

\begitems
\item* V dob� vygenerov�n� ��sla (sekce atd.) nav�c ulo��me informaci 
       "\Xlabel{<lejbl�k>}{<��slo>}" do REF souboru.
\item* V dob� �ten� REF souboru (tedy na za��tku dokumentu) provede "\Xlabel"
       p�i�azen� pomoc� "\sdef{lab:<lejbl�k>}{<��slo>}".
\item* Nyn� m��e p�ij�t "\ref[<lejbl�k>]"
       se sv�m "\csname lab:<lejbl�k>\endcsname" kdekoli v dokumentu.
\enditems       

P�ejdeme od idej� k implementaci.
Makro \db label "[<lejbl�k>]" si pouze zapamatuje "<lejbl�k>" do makra \db
lastlabel, aby s touto hodnotou mohlo pozd�ji pracovat makro, kter� automaticky
generuje n�jak� ��slo.

\inext {def\nb label}{\empty}{+-}

Makro, kter� automaticky generuje n�jak� ��slo, m� za �kol zavolat
\db wlabel "<��slo>". Toto makro propoj� "\lastlabel" a "<��slo>" tak, �e
definuje sekvenci "\lab:\lastlabel" jako makro s hodnotou "<��slo>".
Krom� toho zap��e expandovan� "\lastlabel" i "<��slo>" do
REF souboru (jen, je-li otev�en, zp�tn� reference toti� funguj� i bez
souboru). Nakonec vr�t� makru "\lastlabel" jeho p�vodn� nedefinovanou 
hodnotu, tj.~lejbl�k
u� byl pou�it. Dal�� makro automaticky generuj�c� ��slo zavol� "\wlabel",
kter� nyn� neprovede nic (pokud tedy u�ivatel nenapsal dal�� 
"\label[<lejbl�k>]").

\inext {wlabel}{^^B\cbrace}{++}

\goodbreak
Makro \db ref "[<lejbl�k>]" zkontroluje definovanost "\lab:<lejbl�k>".
Je-li to pravda, vytiskne "\lab:<lejbl�k>" (krz reflink, aby to bylo
p��padn� klikac�). Jinak vytiskne dva otazn�ky a p�edpokl�d�, �e v tomto
p��pad� jde o dop�ednou referenci. Vynut� si tedy otev�en� REF souboru
zavol�n�m "\openref".

\inext {ref}{^^B\cbrace}{++}

Makro \db pgref "[<lejbl�k>]" d�l� podobnou pr�ci, jako "\ref", jen s makrem
"\""pgref:<lejbl�k>". Toto makro je definov�no a� p�i znovuna�ten� REF
souboru makrem \db Xlabel, proto�e ke spr�vn�mu ur�en� ��sla str�nky 
pot�ebujeme asynchronn� "\write".

\inext {pgref}{\empty}{+-}



\subsec Kapitoly, sekce, podsekce
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Fonty pro titul, kapitoly a sekce \db titfont, 
\db chapfont, \db secfont a \db seccfont 
jsou definov�ny jako odpov�daj�c� zv�t�en� a nastaven� tu�n�ho duktu.
Ten je nastaven pomoc� \db bfshape jako "\bf" a nav�c je ztoto�n�n
"\tenit" s "\tenbi", tak�e kdy� nyn� u�ivatel nap��e "\it", dostane tu�nou
kurz�vu. 
 
\inext{titfont}{\empty}{+-}

Pro ��slov�n� kapitol, sekc� a podsekc� pot�ebujeme ��ta�e:

\dgn \nb chapnum  \dgn \nb secnum \dgn \nb seccnum

\inext{newcount}{\empty}{+-}

Makro pro titul \db tit po��t� s t�m, �e bude titul na v�ce ��dc�ch. S�z� ho
tedy jako odstavec s~pru�n�mi "\leftskip" a "\rightskip". P��kaz "\unskip"
t�sn� za parametrem "#1" odstran� mezeru z konce ��dku, kter� tam obvykle
je. Teprve pot� je nadpis ��dn� centrov�n.

\inext{tit}{^^B\cbrace}{++}

Makra \db chap, \db sec a \db secc nastav� odpov�daj�c� ��ta�e, d�le vytvo��
��slov�n� pro tisk (sest�vaj�c� z v�ce ��sel) v makrech \db thechapnum,
\db thesecnum a \db theseccnum a zavolaj� odpov�daj�c� makro "\printchap",
"\printsec" a "\printsecc".
Pot� zavol� "\wlabel" na
propojen� p��padn�ho labelu s ��slem kapitoly/sekce/podsekce a
pomoc� \db wcontents ulo�� do "\reffile" pot�ebn� data pro obsah.\par\vskip-1pt

\inext{chap}{\empty}{+-}

Text titulu sekce a jej� ��slo jsou vlo�eny do "\mark", tak�e tyto �daje
m��ete pou��t v plovouc�m z�hlav�. Tato vlastnost nen� dokumentov�na v
u�ivatelsk� ��sti, proto�e je pon�kud techni�t�j��ho charakteru. Makro \db
insertmark "\thesecnum{<text>}" vlo�� do "\mark" data ve form�tu 
"{<secnum>} {<text>}", tak�e je mo�no je pou��t p��mo expanz� nap�.
"\firstmark", nebo je odd�lit a zpracovat zvlṻ. Parametru "<text>" je
zabr�n�na expanze pomoc� prota�en� tohoto parametru p�es "\toks", viz TBN
str. 54 dole a strany 55--57. P��kaz "\mark" se toti� sna�� o expanzi.

\inext{insertmark}{\empty}{+-}

P��klad pou�it� plovouc�ho z�hlav� v "\headline":

\begtt
\headline{\expandafter\domark\firstmark\hss}
\def\domark#1#2{\llap{\it\headsize #1. }\rm\headsize #2}
\def\headsize{\thefontsize[10]}
\endtt

Makro "\headsize" v t�to uk�zce zaru��, �e bude m�t z�hlav� v�dy
po�adovanou velikost. Bez toho ta z�ruka nen�, pokud tedy u�ivatel v sazb�
dokumentu st��d� velikosti p�sma. Output rutina toti� m��e p�ij�t n�hle,
t�eba v okam�iku, kdy je zapnut� jin� velikost p�sma.

Pokud chcete kombinovat na lev�ch a prav�ch str�nk�ch plovouc� z�hlav� z
kapitol a sekc�, inspirujte se v TBN na stran�ch 259 a 260.

Makra \db printchap, \db printsec a \db printsecc vytisknou ��slo a titul
kapitoly, sekce resp. podsekce. P��kazem "\firstnoindent" d�vaj� najevo,
�e n�sleduj�c� odstavec nebude m�t odstavcovou zar�ku.

\inext {printchap}{\count=3 ^^B\cbrace}{++}

Makro \db afternoindent potla�� odstavcovou zar�ku pomoc� p�echodn�ho
napln�n� "\everypar" k�dem, kter� odstran� box vznikl� z "\indent" a
vypr�zdn� pomoc� \db wipeepar registr "\everypar". 
Makro \db firstnoindent je ztoto�n�no s
"\afternoindent", ale u�ivatel m��e ps�t "\let\firstnoindent=\relax".
Pak bude "\afternoindent" pracovat jen za verbatim v�pisy.

\inext{afternoindent}{firstnoindent}{++}

Nechceme, aby se n�m odstavce tvo�en� z titul� kapitol a sekc� rozd�lily do
v�ce stran. Proto m�sto p��kazu "\par" je pou�ito \db nbpar.
Kone�n� u�ivatel m��e od��dkovat nap��klad v titulu pomoc� \db nl.
Tomuto makru pozd�ji v "\output" rutin� zm�n�me v�znam na mezeru.

\inext{nbpar}{\empty}{+-}


\subsec Popisky, rovnice
%%%%%%%%%%%%%%%%%%%%%%%%

Nejprve deklarujeme pot�ebn� ��ta�e:
\dgn \nb tnum \dgn \nb fnum \dgn \nb dnum 

\inext{newcount}{\empty}{+-}

V�choz� hodnoty maker, kter� se vypisuj� v m�st� generovan�ho ��sla jsou:

\inext{thetnum}{\empty}{+-}

Makro \db caption "/<typ> " zvedne ��ta� "\<typ>num" o jedni�ku,
d�le nastav� pru�n� mezery s odsazen�m "\iindent" a s centrov�n�m posledn�ho
��dku (viz TBN str.~234), propoj� pomoc� "\wlabel" ��slo s p��padn�m
lejbl�kem, vytiskne slovo Tabulka/Obr�zek v z�vislosti na jazyku makrem
"\mtext", vytiskne ��slo "\the<typ>num" a zpracuje odstavec s nastaven�mi
"\leftskip", "\rightskip". P�edefinuje "\par" tak, �e prvn� v�skyt pr�zdn�ho
��dku ukon�� skupinu a t�m se v�echna nastaven� vr�t� do p�vodn�ho stavu.

\inext{caption}{^^B\cbrace}{++}

Makro \db eqmark zvedne "\dnum" o jedni�ku. 
V display m�du pak pou�ije primitiv "\eqno", za kter�m
n�sleduje "\thednum". V intern�m m�du (v boxu) vytiskne jen "\thetnum".
V obou p��padech propoj� p��padn� lejbl�k s ��slem pomoc� makra "\wlabel".

\inext{eqmark}{\empty}{+-}

\subsec Odr�ky
%%%%%%%%%%%%%%%

Odsazen� ka�d� dal�� vno�en� �rovn� odr�ek bude o "\iindent" v�t��.
Jeho hodnota je nastavena na "\parindent" v dob� �ten� {\tt opmac.tex}.
Jestli�e u�ivatel pozd�ji zm�n� "\parindent", m�l by odpov�daj�c�m zp�sobem
zm�nit "\iindent". Krom� toho deklarujeme ��ta� pro odr�ky \db itemnum.

\inext{newcount}{\empty}{+-}

Makro \db begitems vlo�� "\iiskip", zah�j� novou skupinu, pronuluje "\itemnum", 
zv�t�� odsazen� o~"\iindent" a pomoc� "\adef" definuje hv�zdi�ku jako
aktivn� makro, kter� provede "\startitem". Makro \db enditems ukon��
skupinu a vlo�� "\iiskip".

\inext{begitems}{\empty}{+-}

Makro \db startitem ukon�� p��padn� p�edchoz� odstavec, posune ��ta�, zah�j�
prvn� odstavec jako "\noindent" a vy�oupne doleva text definovan� v
\db printitem, kter� je implicitn� nastaven makrem "\begitems" na 
\db normalitem.

\inext{startitem}{\empty}{+-}

Makro \db style "<znak>" p�e�te "<znak>" a rozvine jen na makro
"\item:<znak>". Tato jednotliv� makra jsou definov�na pomoc� "\sdef".
Nen�-li makro "\item:<znak>" definov�no, pou�ije se "\normalitem".

\inext{style}{\empty}{+-}

�tvere�ek kresl�me jako "\vrule" odpov�daj�c�ch rozm�r� makrem 
\db fullrectangle "{<dimen>}".

\inext{fullrectangle}{\empty}{+-}

Pro p�evod mezi numerickou hodnotou ��ta�e a p��slu�n�m p�smenem a, b, c
atd. je vytvo�eno makro \db athe "<number>".

\inext{athe}{\empty}{+-}


\subsec Tvorba obsahu
%%%%%%%%%%%%%%%%%%%%%

Do \db toclist budeme ukl�dat data pro obsah.
Pomoc� \db ifischap se budeme pt�t, zda v dokumentu jsou kapitoly.

\inext{toclist}{\empty}{+-}

V dob� �ten� REF souboru vlo��me ve�ker� data obsahu do makra "\toclist"
tak, �e v tomto bufferu budeme m�t za sebou sekvence "\tocline" n�sledovan� p�ti
parametry. Makra \db Xchap, \db Xsec a \db Xsecc
maj� parametry "{<��slo>}{<text>}{<strana>}" a jsou definov�ny n�sledovn�:

\inext{Xchap}{\empty}{+-}

Makro \db tocline "{<odsazen�>}{<font>}{<��slo>}{<text>}{<strana>}" vytvo��
��dek obsahu. ��dek tiskneme jako odstavec, proto�e "<text>" m��e b�t t�eba
del��. Registr "\leftskip" nastav�me jako sou�in "<odsazen�>" kr�t "\iindent".
Pokud se v dokumentu vyskytuj� kapitoly, odsad�me je�t� o dal�� "\iindent".
Registr "\rightskip" nastav�me na 2"\iindent", aby del�� "<text>" se zalomil
d��v ne� v m�st�, kde jsou str�nkov� ��slice. Konec odstavce se str�nkovou
��slic� pak vyt�hneme mimo tento rozsah pomoc� "\hskip-2\iindent". Odstavec
pru�� v "\tocdotfill", proto�e tento v�pln�k m� v�t�� pru�nost ne�
"\parfillskip". Registr "\parfillskip" m� "1fil", zat�mco "\tocdotfill" m�
pru�nost "1fill". Makro \db tocdotfill je implementov�no pomoc� "\leaders"
jako opakovan� te�ky, kter� budou l�covat pod sebou.

\inext{tocline}{\empty}{+-}

Makro \db maketoc jednodu�e spust� "\toclist", Pokud je "\toclist" pr�zdn�,
upozorn� o tom adekv�tn�m zp�sobem na termin�l.

\inext{maketoc}{\empty}{+-}


\subsec Sestaven� rejst��ku
%%%%%%%%%%%%%%%%%%%%%%%%%%%

Slovo do rejst��ku vlo��me pomoc� \db iindex "{<heslo>}". Proto�e v�skyt
slova na str�nce nen� v dob� zpracov�n� zn�m, je nutn� pou��t REF soubor s
asynchronn�m "\write".

\inext{iindex}{\empty}{+-}

Nyn� naprogramujeme �ten� parametru makra 
\db ii "<slovo>,<slovo>,...<slovo> ". Vzhledem k tomu, �e za
p��tomnosti zkratky "@" budeme pot�ebovat proj�t seznam slov odd�len�ch ��rkou
v~parametru je�t� jednou, zapamatujeme si tento seznam do "\tmp".

\inext{leavevmode}{\empty}{+-}

Makro \db iiA sejme v�dy jedno slovo ze seznamu. Podle pr�zdn�ho parametru
pozn�me, �e jsme u konce a ned�l�me nic. P�i v�skytu "<slovo>=@" (pozn�me to
podle shodnosti parametru s \db iiatsign \unskip),
spust�me "\iiB", jinak vlo��me �daj o slov� do rejst��ku pomoc� "\iindex".
Nakonec makro "\iiA" vol� rekurzivn� samo sebe.

\inext{iiA}{\empty}{+-}

Makro \db iiB rovn� sejme v�dy jedno slovo ze seznamu a na konci vol�
rekurzivn� samo sebe. Toto makro ov�em za pou�it� makra \db iiC prohod� po�ad�
prvn�ho podslova p�ed prvn�m lom�tkem se zbytkem. Nen�-li ve slov� lom�tko,
pozn� to makro "\iiC" podle toho, �e parametr "#2" je pr�zdn�. V takov�m p��pad�
neprovede nic, nebo� slovo je u� zaneseno do rejst��ku v makru "\iiA".

\inext{iiB}{\empty}{+-}

Makro \db iid "<slovo> " po�le slovo do rejst��ku a sou�asn� je zopakuje do 
sazby. Pomoc� "\futurelet" a \db iiD zjist�, zda n�sleduje te�ka nebo ��rka. Pokud
ne, vlo�� mezeru.

\inext{iid}{\empty}{+-}

P�i �ten� REF souboru se vykon�vaj� makra \db Xindex "{<heslo>}{<strana>}",
kter� postupn� vytv��ej� makra tvaru "\,<heslo>", ve kter�ch je shroma��ov�n
seznam str�nek pro dan� "<heslo>".
Krom� toho ka�d� makro "\,<heslo>" je vlo�eno do seznamu \db iilist. 
Na konci �ten�
REF souboru tedy m�me v~"\iilist" seznam v�ech hesel jako ��dic� sekvence (to
zabere nejm�� m�sta v \TeX{}u). Ka�d�
"\,<heslo>" na konci �ten� REF souboru obsahuje dva �daje ve svork�ch, prvn� �daj
obsahuje pomocn� data a druh� obsahuje seznam str�nek. Tedy "\,<heslo>" je makro
s obsahem "{<pomocn�-data>}{<seznam-str�nek>}".

Seznam str�nek nen� jen tup� seznam v�ech str�nek, na kter�ch se objevil
z�znam "\ii" pro dan� slovo. N�kter� str�nky se toti� mohou opakovat a my je
chceme m�t jen jednou. Pokud str�nky jsou souvisle za sebou: 13, 14, 15, 16,
chceme nav�c takov� seznam nahradit z�pisem 13--16. Makro 
"\Xindex{<heslo>}{<strana>}" je z tohoto d�vodu pon�kud sofistikovan�j��.

\ilabel [Xindex:first] {firstdata}
\ilabel [Xindex:second] {seconddata}

\inext{Xindex}{\empty}{+-}

�innost makra "\Xindex" si vysv�tl�me za chv�li podrobn�ji. Nejprve ov�em
definujeme pomocn� makro \db firstdata "\,<heslo>"~"\<cs>", kter� expanduje na
"\<cs>"~"<prvn�-datov�-�daj-hesla>&". Je-li t�eba "\,aa" definov�no jako
"{prvni}{druhy}", pak "\firstdata"~"\,aa"~"\cosi" expanduje na "\cosi"~"prvni&". 
T�m m�me mo�nost vyz�skat data z makra. Podobn� makro 
\db seconddata "\,<heslo>"~"\<cs>" expanduje na 
"\<cs>"~"<druh�-datov�-�daj-hesla>&".

\inext{firstdata}{\empty}{+-}

Ne� se pust�me do v�kladu makra "\Xindex", vysv�tl�m, pro� pro hesla rejst��ku
tvo��m jednu ��dic� sekvenci, kter� je makrem se dv�ma datov�mi �daji.
Mohl bych jednodu�eji pracovat se dv�ma r�zn�mi ��dic�mi sekvencemi,
nap�. "\,<heslo>" a "\:<heslo>". D�vod je prost�: �et��m pam� \TeX u. D� se toti�
o�ek�vat, �e po�et hesel v rejst��ku m��eme po��tat na tis�ce a je rozd�l
alokovat kv�li tomu tis�ce kontroln�ch sekvenc� nebo dvojn�sobn� mno�stv�
takov�ch sekvenc�.

V makru "\Xindex" �teme "\firstdata" na ��dku \cite[Xindex:first] 
a "\seconddata" na ��dku \cite[Xindex:second].
�ten� je provedeno makry \db XindexA a \db XindexB. Prvn� �sek dat je tvaru
"<posledn�-strana>/<stav>" a druh� �sek dat obsahuje rozpracovan� seznam str�nek.
Pod�v�me-li se na definice "\XindexA" a "\XindexB", shled�me, �e seznam str�nek
bude ulo�en v "\tmp", d�le "<posledn�-strana>" bude v "\tmpa" a "<stav>" je v
"\tmpb".

\inext{XindexA}{\empty}{+-}

Rozli�ujeme dva stavy: "<stav>=+", pokud je seznam str�nek zakon�en konkr�tn�
str�nkou. Tato konkr�tn� str�nka je ulo�ena v "<posledn�-strana>". Druh�m
stavem je "<stav>=-", kdy� je seznam str�nek ukon�en "--" (p�esn�ji obsahem
makra \db iiendash, kter� m��ete snadno p�edefinovat) a v tomto p��pad�
"<posledn�-strana>" obsahuje posledn� str�nku, na kter� byl zji�t�n v�skyt
hesla. Tato strana nemus� b�t v~seznamu str�nek explicitn� uvedena.

Makro "\Xindex{<heslo>}{<strana>}" tedy postupn� vytv��� seznam stran 
zhruba takto:

\def\begtthook{\langleactive}
\begtt
if (prvn� v�skyt \,<heslo>) {
  zalo� \,<heslo> do iilist;
  <seznam-stran> = "<strana>"; <stav> = +; <posledni-strana> = <strana>;
  return;
}
if (<strana> == <posledni-strana>) return; 
if (<stav> == +) {
  if (<strana> == <posledni-strana>+1) { 
    <seznam-stran> += "--"; 
    <stav> = - ;
  }
else {
    <seznam-stran> += ", <strana>";
    <stav> = + ;
  }
  else {
    if (<strana> > <posledni-strana>+1) { 
      <seznam-stran> += "<posledni-strana>, <strana>";
      <stav> = + ;  
    }
  }
}    
<posledn�-strana> = <strana>; 
\endtt

\def\begtthook{}
Makro \db makeindex nejprve definuje p�echodn� v�znam rekurzivn�ho 
"\act" tak, aby byly uzav�eny seznamy str�nek (tj. aby seznam nekon�il 
znakem "--") a do prvn�
datov� oblasti ka�d�ho makra typu "\,<heslo>" vlo�� konverzi textu "<heslo>" do
tvaru vhodn�m pro abecedn� �azen� �esk�ch slov.
Pomoc� "\expandafter \act \iilist \relax" se
po�adovan� �innost vykon� pro ka�d� prvek v "\iilist". 
D�le makro "\makeindex" provede se�azen� "\iilist" podle abecedy
makrem "\dosorting" a nakonec provede tisk jednotliv�ch hesel. K tomu ��elu 
znovu p�echodn� p�edefinuje "\act" a p�edlo�� mu "\iilist".

\ilabel [mkindex:od] {firstdata}
\ilabel [mkindex:do] {after\nb act}
\ilabel [mkindex:orippx] {orippx}

\inext{makeindex}{^^B\cbrace}{++}

Makro \db printiipages sebere z "<druh�ho-datov�ho-�daje>" seznam str�nek a
jednodu�e je vytiskne.

\inext{printiipages}{\empty}{+-}

Makro \uv{prepare index item} \db prepii "\,<heslo>" odstran� prost�ednictv�m
\db prepiiA z n�zvu kontroln� sekvence backslash a ��rku a zbytek tiskne pomoc�
"\printii". Pokud ale je "\,<heslo>" ulo�eno v~seznamu "\iispeclist", pak se
expanduje sekvenci s n�zvem "\\,<heslo>", ve kter� je ulo�eno, co se
m� m�sto hesla vytisknout. Data t�chto v�jimek jsou p�ipravena makrem "\iis"

\inext{prepii}{\empty}{+-}

Kontroln� ot�zka: pro� se nedotazujeme jednodu�e na to, zda je
"\\,<heslo>" definovan� ��dic� sekvence? Odpov��: museli bychom ji
sestavit pomoc� "\csname...\endcsname", ale to zalo�� do \TeX{}ov� pam�ti
novou ��dic� sekvenci pro ka�d� heslo v rejst��ku. My se sna��me po�et
t�chto ��dic�ch sekvenc� redukovat na minimum. Po��t�me s t�m, �e oby�ejn�ch
hesel bude tis�ce a v�jimek jen p�r des�tek.

Makro \db iis "<heslo> {<text>}" vlo�� dal�� �daj do slovn�ku v�jimek pro
hesla v rejst��ku. P�esn�ji: vlo�� "\,<heslo>" do \db iispeclist a definuje
sekvenci "\\,<heslo>" jako "<text>".

\inext{iis}{\empty}{+-}

Makro \uv{print index item} \db printii "<heslo>&" vytiskne jeden �daj do
rejst��ku. Makro projde prost�ednictv�m \db printiiA jednotliv� podslova
odd�len� lom�tkem a p�ep��e je do rejst��ku odd�leny mezerou. P�itom
kontroluje, zda se podslova rovnaj� odpov�daj�c�m podslov�m z p�edchoz�ho
hesla, kter� je ulo�eno v \db previi. Pokud ano, m�sto podslova vlo�� \db
iiemdash, co� je pomlka. Na konci �innosti se spust� makro \db printiiB,
kter� nastav� "\previi" na \db currii (nov� slovo se pro dal�� zpracov�n� st�v�
p�edchoz�m) a vytiskne seznam str�nek. Makrem \db everyii
(implicitn� je pr�zdn�) dovol�me u�ivateli vstoupit do procesu tisku hesla.
M��e nap��klad ps�t "\def\everyii{\indent}", pokud chce.

\ilabel [printii:iindent] {iindent}
\inext{printii}{\empty}{+-}

Makro \db iiparparams nastavuje parametry sazby odstavce v rejst��ku. Vlevo
budeme m�t "\leftsip" rovn� "\iindent", ale prvn� ��dek posuneme o
"-\iindent" (viz ��dek k�du~\cite[printii:iindent]) tak�e prvn� ��dek je
vystr�en doleva. Vpravo m�me pru�nou mezeru, aby se seznam ��sel stran mohl
rozumn� l�mat, kdy� je moc dlouh�. Makro "\iiparparams" si mus� pozna�it do
makra \db orippx p�vodn� �daje m�n�n�ch hodnot. Nen� mo�n� se toti� schovat
do skupiny, proto�e rejst��k je obvykle ti�t�n pomoc�
"\begmulti...\endmulti" a toto makro ob�as ukon�uje pln�n� boxu a spou�t�
"\flushcolumns". Kdybychom m�li "\makeindex" ve skupin�, pak by p�i
"\flushcolumns" do�lo ke k���en� skupin. Na konci pr�ce "\makeindex" na
��dku \cite[mkindex:orippx] je makro "\orippx" zavol�no a t�m jsou parametry
odstavce vr�ceny do p�vodn� podoby.

\inext{iiparparams}{\empty}{+-}

Pomocn� makro \db scanprevii "<expanded-previi>&" se pod�v� do "\previi", 
odloupne z n�j �sek p�ed prvn�m lom�tkem a tento �sek definuje jako
"\tmpa". 

\inext{scanprevii}{}{+-}

V�choz� hodnota "\previi" p�ed zpracov�n�m prvn�ho slova v rejst��ku je
pr�zdn�.

\inext{previi}{\empty}{+-}


\subsec Abecedn� �azen� rejst��ku
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Nejprve se zam���me na vytvo�en� makra 
"\isAleB"~"\,<heslo1>"~"\,<heslo2>", kter� rozhodne, zda je "<heslo1>" �azeno za
"<heslem2>" nebo ne. V�sledek zkoum�n� m��eme prov��it pomoc� "\ifAleB".

Pro porovn�n� dvou �daj� vy�aduje norma dva pr�chody. V prvn�m (prim�rn�
�azen�) se rozli�uje jen mezi p�smeny A B C � D E F G H Ch I J K L M N O P Q
R � S � T U V W X Y Z �. Pokud jsou hesla z tohoto pohledu stejn�, pak se
provede druh� pr�chod (sekund�rn� �azen�), ve kter�m jsou �azena
neakcentovan� p�smena p�ed p�ehlasovan� p�ed ��rkovan� p�ed h��kovan� p�ed
st���kovan� p�ed krou�kovan� a d�le s nejni��� prioritou mal� p�smena p�ed
velk�. P�iprav�me si tedy dv� sady "\lccode" dvojic: pro prvn� pr�chod a pro
druh�. Porovn�van� hesla zkonvertujeme pomoc� "\lowercase" p�i nastaven�
"\lccode" odpov�daj�c�ho pr�chodu. Pak takto zkonvertovan� hesla teprve
za�neme porovn�vat.

Makro \db setprimarysorting p�iprav� "\lccode" znak� �esk� a slovensk�
abecedy pro prvn� pr�chod a \db setsecondarysorting pro druh� pr�chod.
Makro "\setprimarysorting" expanduje \db sortingdata 
a p�edhod� p�ed takto expandovan� data "\act".
Pov�imneme si, �e pro prvn� pr�chod dostanou stejn� "\lccode" v�echny znaky
na spole�n�m ��dku makra "\sortingdata", zat�mco v druh�m pr�chodu budou m�t
v�echny znaky z tohoto makra rozd�ln� "\lccode", ve vzestupn�m po�ad�.
Je to t�m, �e v makru "\setprimarysorting" se zved� "\tmpnum" jen v m�st�
��rky, zat�mco v "\setsecondarysorting" se "\tmpnum" zved� pro ka�d� znak.
Nejni��� hodnotu m� mezera vyzna�en� v "\sortingdata" pomoc� "{ }". 
T�m je zaru�eno, �e krat�� slovo je �azeno d��v ne� del�� slovo se stejn�m
za��tkem, obsahuj�c� cel� krat�� slovo (ten~tu���k$\prec$tento).
Je sice pravda, �e ASCII hodnota mezery je je�t� men��, ale my mus�me 
mezeru n�kam �oupnout na jin� k�d ne� 32, jinak by n�m ji nep�e�etlo 
makro s~neseparovan�m parametrem. Ov�em my budeme cht�t mezeru p�e��st. 

\ilabel [sorten] {sort:en}
\ilabel [lan] {lan:}
\ilabel [chsorting] {chsorting}

\inext{sortingdata}{\count=3 ^^B\cbrace}{++}

Jedn�m z probl�m� �esk�ho �azen� je dvojhl�ska ch. Tu pot�ebujeme
prom�nit v jedin� znak. Pro pot�eby �azen� prom�n�me ch v "^^T", Ch v "^^U"
a CH v "^^V". Ud�l�me to n�sleduj�c�m okultn�m k�dem, kter� definuje makro
\db preparesorting "\,<heslo>". Toto makro p�iprav� pomoc� do "\tmpb" 
"<heslo>" zkonvertovan� krz "\lowercase", 
ov�em nejprve je dvojhl�ska ch nahrazena jedn�m znakem.
Makro \db chsorting je implicitn� nedefinovan�, co� znamen�, �e pracujeme s
dvojhl�skou ch. Na ��dku \cite[sorten], \cite[lan] a \cite[chsorting] je ov�em nastaveno
"\chsorting" jako "n", co� je vzkaz, �e dvojhl�sku ch nechceme
interpretovat.

\inext{bgroup}{\empty}{+-}

Tento k�d je bohu�el obt��n�ji �iteln�, proto�e makra "\iiscanch" a dal��
pot�ebuj� m�t separ�tor "ch" ve stavu, kdy jednotliv� p�smena maj� "\catcode" 12.
Pracujeme toti� s v�stupem primitivu "\string", kter� bohu�el v�e (a� na
mezeru) bal� do token� s kategori� 12. Proto je cel� k�d obalen do
"\bgroup", "\egroup" a "\lowercase". Tam jsou znaky 4, 5, 6, 7, 
kter� maj� kategorii 12, �oupnuty na c, h, C, H. Po tomto de�ifrov�n� tedy 
vid�me, �e makro \db iiscanch je definov�no takto:

\begtt
\gdef\iiscanch #1ch#2\relax{#1\if$#2$\else^^T\iiscanch #2\relax\fi}
\iiscanch Sch�z� hr�ch, kter� bych h�zel na st�nu.ch\relax
\endtt

Uveden� p��klad expanduje postupn� na 

\begtt
#1<-S
#2<-�z� hr�ch, kter� bych h�zel na st�nu.ch
=> s^^T\iiscanch #2\relax

#1<-�z� hr�
#2<-, kter� bych h�zel na st�nu.ch
=> s^^T�z� hr�^^T\iiscanch #2\relax

#1<-, kter� by
#2<- h�zel na st�nu.ch
=> s^^T�z� hr�^^T, kter� by^^T\iiscan #2\relax

#1<- h�zel na st�nu.
#2<-
=> s^^T�z� hr�^^T, kter� by^^T h�zel na st�nu.
\endtt
a to nahrad� v�echny v�skyty dvojhl�sky ch znakem "^^T". Analogicky pracuj�
makra \db iiscanCh a \db iiscanCH. Makro \db preparesortingA nakonec zavol�
v�echna t�i makra, tak�e m�me nahrazeny v�echny dvojhl�sky ch, Ch i CH.

V r�mci optimalizace rychlosti jsou p�ed algoritmem na set��d�n� seznamu
v�echna hesla jednor�zov� zkonvertovan� podle pravidel prvn�ho pr�chodu
�azen� a tato data jsou ulo�ena v prvn�m datov�m �daji hesla (ve druh�m m�me
seznam str�nek). Nen� tedy nutn� d�lat konverzi p�i ka�d�m porovn�v�n� dvou
hesel. Ov�em, pokud porovn�n� hesel vyjde bez rozd�lu, je pot�eba prov�st
druh� pr�chod �azen� (sekund�rn� �azen�). Ten nastavujeme jednotliv� jen pro
takov� dvojice hesel, kde to je pot�eba. Pravd�podobnost, �e to je v�bec
n�kdy pot�eba, je miziv�. Data pro prim�rn� �azen� jsou tedy u� p�ipravena na
��dc�ch \cite[mkindex:od] a� \cite[mkindex:do] v makru "\makeindex".

V �esk�m �azen� se nem� p�ihl��et na interpunk�n� znaky (te�ka, st�edn�k,
otazn�k, atd.). Hesla m�me �adit tak, jako kdyby tam tyto znaky nebyly.
Kdyby se dv� hesla podle tohoto pravidla neli�ila, norma p�edepisuje nasadit
cca �tvrt� pr�chod, ve kter�m se tyto znaky rozli��. �tvrt� pr�chod
implementov�n nen�: hesla li��c� se jen interpunk�n�mi znaky, jsou v OPmac
p�i �azen� nerozli�iteln�, tj. jsou �azena v po�ad�, v jak�m vstupuj� do
rejst��ku. Ignorov�n� interpunk�n�ch znak� je provedeno tak, �e v�em
t�mto znak�m je p�id�len makrem \db setignoredchars "\lccode" te�ky a
te�ka je p�i zpracov�n� v~"\setprimarysorting" a "\setsecondarysorting" odstran�na
makrem \db removedot.

\inext{removedot}{\empty}{+-}

P�iprav�me si "\newif", kter�m ohl�s�me v�sledek porovn�n� dvou hesel:

\inext{newif}{\empty}{+-}

Makro \db isAleB "\,<heslo1>"~"\,<heslo2>" spust�\hfil\break 
"\testAleB"~"<zkonvertovan� heslo1>&\relax"~"<zkonvertovan� heslo2>&\relax"~%
"\,<heslo1>"~"\,<heslo2>".

\inext{isAleB}{^^B\cbrace}{++}

Idea makra \db testAleB lexikograficky porovn�vaj�c� dv� slova je v tom, �e ze
dvou string� v~parametru odd�len�ch "\relax" postupn� odlupuje v�dy
prvn� znak "#1" a "#3" z ka�d�ho stringu a ten porovn�v� a samoz�ejm� p�i rovnosti
rekurzivn� zavol� samo sebe. Pokud jsme se dostali na konec bez rozhodnut�, co
je men��, naraz�me na znak "&". V takov�m p��pad� p�estoup�me do
sekund�rn�ho pr�chodu.

\inext{testAleB}{^^B\cbrace}{++}

Makro \db testAleBsecondary "\,<heslo1>"~"\,<heslo2>" zalo�� skupinu, v n�
nastav� "\lccode" dle sekund�rn�ho �azen� a pomoc� "\preparesorting"
p�iprav� zkonvertovan� data do "\tmpa" a "\tmpb". Na chvosty t�chto dat
p�id�m nulu a jedni�ku, aby porovn�n� v�dy n�jak dopadlo, a spust�m
\db testAleBsecondaryX, co� pracuje obdobn�, jako "\testAleB".

\inext{testAleBsecond}{\count=2 ^^B\cbrace}{++}

Nyn� m��eme pomoc� "\isAleB\,<heslo1>\,<heslo2>\ifAleB" rozhodnout, kter�
ze dvou dan�ch parametr� m� b�t �azen d��ve. Sta�� tedy u� jen naprogramovat
celkov� �azen� seznamu. Toto makro vych�zej�c� z algoritmu mergesort 
vytvo�il m�j syn Miroslav. Makro bylo poprv� pou�ito v DocBy\TeX{}u, co� je
n�stroj, kter�m je nap��klad po��zena i tato dokumentace.
 
Makro \db dosorting pomoc� pomocn�ho makra "\act" dopln� za ka�d� �daj v
"\iilist" ��rku a d�le p�edlo�� makru "\mergesort" jako parametr obsah
"\iilist" ukon�en� "\end,\end", vypr�zdn� "\iilist" a spust� "\mergesort".

\inext{dosorting}{\empty}{+-}

Makro \db mergesort pracuje tak, �e bere ze vstupn� fronty v�dy dvojici
skupin
polo�ek, ka�d� skupina je zat��d�n�. Skupiny jsou od sebe odd�leny
��rkami. Tyto dv� skupiny spoj� do jedn� a zat��d�. Pak p�ejde na
n�sleduj�c� dvojici skupin polo�ek. Jedno zat��d�n� tedy vypad�
nap��klad takto: dv� skupiny: "eimn,bdkz," prom�n� v~jedinou 
skupinu "bdeikmnz,". V tomto p��klad� jsou polo�ky jednotliv� p�smena,
ve skute�nosti jsou to kontroln� sekvence, kter� obsahuj� cel� slova.

Na po��tku jsou skupiny jednoprvkov� ("\iilist" odd�luje ka�dou
polo�ku ��rkou). Makro "\mergesort" v tomto p��pad� projde seznam a vytvo��
seznam zat��d�n�ch dvoupolo�kov�ch skupin, ulo�en� zp�tn� v
"\iilist". V dal��m pr�chodu znovu vyvrhne "\iilist" do vstupn�
fronty,
vypr�zdn� ho a startuje znovu. Nyn� vznikaj� �ty�polo�kov� zat��d�n�
skupiny. Pak osmipolo�kov�~atd. V~z�v�ru (na ��dku~\cite[konecsortu]) 
je prvn� skupina cel� set��d�n� a druh� obsahuje "\end", tj. 
v�echny polo�ky jsou u� set��d�n� v prvn� skupin�, tak�e sta�� 
ji ulo�it do "\iilist" a ukon�it �innost. Pomoc� \db gobbletoend
odstran�me druh� "\end" ze vstupn�ho proudu.

\noactive{dvojice}
\ilabel [merge:porovnani] {isAleB}
\ilabel [merge:trojka] {mergesort p1+}
\ilabel [merge:p1] {ifx,}
\ilabel [merge:p2] {fif\nb mergesort\cbrace}
\ilabel [konecsortu] {empty\nb iilist}
\inext {def\nb mergesort }{^^B\cbrace}{++}

{\def\quotehook{\catcode`\<12}
J�dro "\mergesort" vid�me na ��dc�ch~\cite[merge:porovnani]
a�~\cite[merge:trojka]. Makro "\mergesort" sejme ze vstupn�ho proudu
do "#1" prvn� polo�ku prvn� skupiny, do "#2" zbytek prvn� skupiny a do 
"#3" prvn� polo�ku druh� skupiny. Je-li "#1<#3", je do v�stupn�ho
zat��d�n�ho seznamu "\indexbuffer" vlo�en "#1", ze vstupn�ho proudu je
"#1" odebr�n a "\mergesort" je zavol�n znovu. V p��pad� "#3<#1"
je do "\indexbuffer" vlo�en "#3", ze vstupn�ho proudu je "#3" odebr�n a 
"\mergesort" je zavol�n znovu. ��dky~\cite[merge:p1]
a�~\cite[merge:p2] �e�� p��pady, kdy je jedna ze skupin pr�zdn�: 
je pot�eba vlo�it do "\indexbuffer" zbytek nepr�zdn� skupiny a p�ej�t 
na dal�� dvojici skupin. Ostatn� ��dky makra se vyrovn�vaj� se
skute�nost�, �e zpracov�n� narazilo na zar�ku "\end,\end" a je tedy
pot�eba vystartovat dal�� pr�chod.
\par}


\subsec V�ce sloupc�
%%%%%%%%%%%%%%%%%%%%

Makro pro sazbu do v�ce sloupc� je p�evzato z TBN, kde je podrobn�
vysv�tleno na stran�ch 224 a�~245. Z�kladn� my�lenka makra spo��v� v tom, �e
se napln� jeden velk� "\vbox" (box6) jedn�m sloupcem a "\endmulti" jej
rozlom� do sloupc� po�adovan� v��ky a str�� do sazby. Nen� k tomu nutno
m�nit v�stupn� rutinu. Makro z TBN je zde v OPmac ve dvou v�cech p�epracov�no: 
\begitems
\item * D�sledn�j�� balancov�n� sloupc� vylu�uj�c� mo�nost ztr�ty sazby
        a umo��uj�c� m�t sazbu s nezlomiteln�mi mezerami mezi ��dky.
\item * Makro m��� kumulovanou sazbu a umo��uje p�i rozs�hl�m mno�stv�
        tiskov�ho materi�lu p�echodn� p�ej�t do re�imu \uv{vyprazd�ov�n�}.
\enditems 

Makra \db begmulti, \db endmulti, \db corrsize, \db makecolumns a \db
splitpart pracuj� zhruba tak, jak je pops�no v TBN.

\ilabel [mul:endgraf] {endgraf}
\ilabel [mul:balance] {last balancing}
\ilabel [mul:relax] {relax\cbrace}
\ilabel [mul:prevgraf] {prevdepth}

\inext{corrsize}{\count=2 \empty}{+-}

V�stup rozlomen� sazby do sloupc� prob�h� ve dvou re�imech: kdy� je t�eba
sloupci zaplnit celou str�nku, pou�ijeme "\makecolumns". Toto makro ne�e��
ot�zku, �e m��e v kumulovan�m boxu~6 zb�t n�jak� sazba, proto�e se
p�edpokl�d�, �e l�m�n� bude pokra�ovat na dal�� stran�. Pokud ale
je na aktu�ln� stran� v�cesloupcov� sazba ukon�ena, pou�ijeme
propracovan�j�� \db balancecolumns. Toto makro si zaz�lohuje materi�l
z~boxu~6 do boxu~7 a jme se zkou�eti rozlomit box~6 na sloupce s 
v��kou "\dimen0". Pokud ale po rozlomen� nen� v�choz� box~6 zcela pr�zdn�, makro
zv�t�� krap�nek (o 0,2"\baselineskip") po�adovanou v��ku, vr�t� se k~z�lohovan� 
sazb� v boxu~7 a zkus� rozlomit znovu. To opakuje tak dlouho, dokud je box~6
pr�zdn�.

\inext{balancecolumns}{^^B\cbrace}{++}

Kdy� je sazba pln�na do boxu~6, m��e ji b�t tak moc, �e tento box
p�ekro�� maxim�ln� v��ku boxu, kter� je v \TeX{}u bohu�el 
omezena na cca p�t metr�
(16383~pt). Proto na ��dku~\cite[mul:endgraf] je p�edefinov�n "\par", kter�
p�i��t� do "\dimen0" celkovou v��ku postupn� kumulovan� sazby. Jakmile tato
v��ka dos�hne "0.9\maxdimen", p�edefinujeme makro 
"\balancecolumns" na "\flushcolumns" a spust�me p�ed�asn� "\endmulti". Toto makro 
vypr�zdn� box pomoc� opakovan�ho "\splitpart", ov�em nevypr�zdn� ho cel�. 
Jen tu ��st, kter� zapln� cel� str�nky. Jakmile bude cht�t 
"\splitpart" p�ej�t k~vybalancov�n� sazby pomoc�
"\balancecolumns" na ��dku \cite[mul:balance], spust� se m�sto b�n�ho
"\balancecolumns" makro \db flushcolumns. Toto makro ignoruje zbytek �innosti
"\endmulti" a� po "\relax" na ��dku \cite[mul:relax], tak�e vysko�� z
trojit� zano�en�ho "\if". Mus� tedy vr�tit p��slu�n� mno�stv� "\fi" a d�le
vystartuje nov� "\setbox6=\vbox". Uvnit� tohoto boxu nejprve vysype zbytek
boxu~6, pomoc� "\unskip\unskip" odstran� "\vfil" a "\vskip-\prevdepth",
kter� tam vlo�il "\endmulti" na ��dku~\cite[mul:prevgraf],
vr�t� se k z�lohovan�mu v�znamu makra \db ibalancecolumns 
a znovu definuje "\par" obdobn�m zp�sobem jako v~"\begmulti". 
Pak pokra�uje ve �ten� sazby.

\inext{flushcolumns}{\empty}{+-}


\subsec Barvy
%%%%%%%%%%%%%

Deklarujeme \db ifpgcolor, co� budeme pot�ebovat v makru "\locpgcolor".
D�le deklarujeme \db lastpage. Tento registr budeme pr�b�n� zv�t�ovat p�i
�ten� REF souboru v makru "\Xpage" a na konci �ten� REF souboru tedy bude 
obsahovat ��slo posledn� strany.

\inext{ifpgcolor}{\empty}{+-}

Od verze pdf\TeX{}u 1.40 nab�z� tento program primitivy
"\pdfcolorstackinit" a "\pdfcolorstack". Makra v OPmac tyto
primitivy nepou��vaj�, proto�e:

\begitems
\item * �e�en� v OPmac jsem vytvo�il a pou�il podstatn� d��v, ne� si program�to�i
        pdf\TeX{}u v�bec v�imli, �e existuje probl�m s p�ech�zen�m barev na nov�
        str�nky.
\item * Primitivy "\pdfcolorstackinit" a "\pdfcolorstack" st�le nejsou dokumentovan�.
\item * Barevn� �e�en� v "pdftex.def" pro La\TeX{} nepova�uji za koncep�n�
        spr�vn�, proto�e se sna�� pomoc� "\aftergroup" vytvo�it zd�n�, �e
        barvy funguj� lok�ln� uvnit� skupiny. To je zbyte�n� komplikace
        nav�c, kter� jde proti p�irozenosti nastavov�n� barev v PDF souboru.
\enditems

Barvy se v PDF p�ep�naj� pomoc� PDF speci�l� "<num> <num> <num> <num> k"
(pro text a plochy) a "<num> <num> <num> <num> K" pro linky. Pro oba typy
barev p�iprav�me barevn� makra \db Blue, \db Red, \db Brown, \db Green, \db
Yellow, \db Cyan, \db Magenta, \db White, \db Grey, \db LightGrey, \db Black. 
U�ivatel si m��e definovat dal��.

\inext{Blue}{\empty}{+-}

Probl�m barev v PDF je, �e od v�skytu speci�lu pro barvu jsou zm�n�n� barvy
a� po jin� v�skyt takov�ho speci�lu nebo po konec strany. Na ka�d� nov�
stran� za��n� sazba v barv� �ern�. N�m ov�em n�kdy m��e obarven� text p�et�ci
na dal�� stranu. Pak ale mus�me v "\output" rutin� (v makru "\prepage")
nastavit barvu, kter� p�etekla. Ov�em jak pozn�me, �e n�co p�eteklo do dal��
strany? Jedin� pomoc� REF souboru a asynchronn�ho "\write". Proto makro \db
setcmykcolor nevkl�d� do PDF jen po�adovan� speci�l, ale taky ukl�d� o sob�
informaci do REF souboru. Jakmile se p�i �ten� REF souboru objev� "\Xpage",
zkontrolujeme, zda naposledy nastaven� barva byla �ern�. Pokud ne, d�me
pokyn makru "\prepage" prost�ednictv�m makra "\pg:<��slo strany>", aby
aktivovalo hned po "\headline" barvu naposledy nastavenou. To je tedy
z�kladn� idea, nyn� implementace:

\inext{ifpdftex}{\count=2 \empty}{+-}

Makro \db pdfK m� implicitn� hodnotu "k" (barva pro texty a plochy) a
p�echodn� p�i pou�it� \db linecolor m� hodnotu "K". Pr�v� nastavenou barvu
pak makro "\setcmykcolor" ulo�� do REF souboru. 
Jen tehdy, kdy� je explicitn�
zn�mo, �e barva nep�ete�e do dal�� strany, je mo�n� pou��t p�ed pou�it�m
p�ep�na�e barvy prefix \db locpgcolor, kter� potla�� v takov�m p��pad� tisk
informac� do REF souboru. N�sledn� budou potla�eny z�pisy informac� do REF souboru
v�ech barevn�ch p�ep�na�� a� po "\Black" v�etn�. Dal�� barevn� p�ep�na�e (po
"\Black") se chovaj� u� norm�ln�.
Toto opat�en� je zde jen proto, aby byl REF soubor
pon�kud men�� a p�ehledn�j�� i v p��pad�, kdy navrhujeme bohat� barevn� dokument.

Makra \db Xpdfcolork a \db XpdfcolorK udr�uj� p�i �ten� REF souboru
informaci o naposledy vlo�en� barv� v makrech \db pdflastcolork a 
\db pdflastcolorK (n�zev koresponduje typu barvy). 

\inext{Xpdfcolork}{\empty}{+-}

Output rutina vkl�d� na ka�d� str�nce do REF souboru 
\db Xpage "{<��slo strany>}".
Toto makro p�i �ten� REF souboru kontroluje, zda byla naposledy pou�ita
na p�edch�zej�c� stran� barva �ern�. Pokud ne, p�id� do makra 
"\pg:<��slo strany>" pokyn pro nastaven� barvy ve tvaru 
\db setpgcolor "<k nebo K>{<��sla barvy>}". 
Toto makro se spust� v output rutin� na stran� "<��slo strany>"
za "\headline", ale p�ed sestaven�m boxu s textem.

\inext{Xpage}{\empty}{+-}

Makro \db draft vlo�� do "\headline" box nulov� v��ky a ���ky "\draftbox",
kter� vystr�� svou �edou sazbu ven ze sv�ho rozm�ru a je ti�t�n d��v, ne�
jak�koli jin� materi�l na str�nce.

\inext{draft}{\empty}{+-}

V makru \db draftbox "{<text>}" je "<text>" oto�en o 55 stup��, zv�t�en
desetkr�t a vyti�t�n v barv� "\LightGrey". K tomu jsou 
vyu�ity PDF transformace sou�adnic.

\inext{draftbox}{\empty}{+-}


\subsec Klikac� odkazy
%%%%%%%%%%%%%%%%%%%%%%

Makro \db destactive "[<typ>:<lejbl�k>]{<v��ka>}" zalo�� c�l odkazu jen tehdy, kdy�
je "<lejbl�k>" nepr�zdn�. Ve vertik�ln�m m�du se nalep� na p�edchoz� box
d�ky "\prevdepth=-1000pt" a po vlo�en� boxu s c�lem vr�t� hodnotu
"\prevdepth" do p�vodn�ho stavu, aby n�sleduj�c� box byl spr�vn� ��dkov�n.
V horizont�ln�m m�du post� vlo�� "\destbox". Makro 
\db destbox "[<typ>:<lejbl�k>]{<v��ka>}" vytvo�� box nulov� v��ky a z~n�j
vystr�� nahoru c�l klikac�ho odkazu vzd�len� od ��a�� o "<v��ka>". Intern�
pou�ije pdf\TeX{}ov� primitiv "\pdfdest" s parametrem "xyz", co�
charakterizuje obvyklou mo�nost chov�n� PDF prohl��e�e p�i odskoku na c�l. 
Podrobn�ji viz manu�l k~pdf\TeX{}u.

\inext{dest}{\empty}{+-}

V u�ivatelsk� dokumentaci je zm�n�no m�sto "\destactive" makro \db dest
se stejn�mi parametry. Toto makro je implicitn� pr�zdn� a tedy ne�in�. 
Teprve "\hyperlinks" je p�inut� k �innosti.

Klikac� text vytvo�� makro \db link "[<typ>:<lejbl�k>]{<barva>}{<text>}". 
Makro pou��v�
pdf\TeX{}ov� primitiv "\pdfstartlink", ve kter�m je vymezena v��ka a hloubka
aktivn� plochy. Nakonec p�epne na po�adovanou "<barvu>" (pokud nen� �ern�),
vytiskne aktivn� "<text>" a p�epne zp�t na �ernou barvu. Pdf\TeX{}ov� primitiv
"\pdfendlink" ukon�� sazbu aktivn�ho textu. 

\inext{link}{^^B\cbrace}{++}

Makro \db urllink "[<typ>:<lejbl�k>]{<text>}" pracuje 
analogicky jako "\link". Jen nav�c p�id�v� n�kter�
atributy do PDF v�stupu a pracuje s barvou "\urlcolor".

\inext{urllink}{^^B\cbrace}{++}

Makro \db url "{<odkaz>}" vys�z� "<odkaz>" strojopisem, p�i�em� znak "/" je
na p�echodnou dobu aktivn� a definov�n jako "\\". Toto makro p�i sestavov�n�
extern�ho odkazu zp�tn� expanduje na norm�ln� "/", ale p�i sazb� expanduje
na "\discretionary", aby bylo mo�n� v n�m rozd�lit sazbu do v�ce ��dk�.

\inext{url}{\empty}{+-}

Makra \db toclink, \db pglink, \db citelink, \db reflink, \db ulink, kter� se
specializuj� na ur�it� typ linku, implicitn� ned�laj� nic:

\inext{toclink}{\empty}{+-}

Ov�em po pou�it� makra \db hyperlinks "{<barva-lok>}{<barva-url>}" se
uveden� makra "\toclink", "\pglink", "\citelink" a "\reflink" probouzej� k
�ivotu:

\inext{hyperlinks}{\empty}{+-}

Pdf\TeX{}ov� primitivy pro klikac� odkazy dovoluj� dopravit do PDF dal��
atributy odkazu za slovem "attr". Tam je mo�n� d�t najevo, �e chceme vid�t
aktivn� plochy ve form� r�me�k�. To za��d� makro \db pdfborder "{<typ>}", kter�
expanduje na nic, pokud nen� kontroln� sekvence "\<typ>border" definov�na.
Jinak expanduj� na "arrt" "/C" s obsahem podle "\<typ>border".

\inext{pdfborder}{\empty}{+-}

Pokud je dokument zpracov�n do DVI v�stupu, je vhodn� v��e zm�n�n� makra
deaktivovat:

\inext{ifpdftex}{\empty}{+-}


\subsec Outlines -- obsah v z�lo�ce PDF dokumentu
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Hlavn� probl�m implementace strukturovan�ho obsahu do z�lo�ky PDF dokumentu
spo��v� v~tom, �e p�i vkl�d�n� jednotliv�ch polo�ek obsahu je nutno zn�t
po�et p��m�ch potomk� ka�d� polo�ky (v~r�mci stromov� struktury polo�ek),
ov�em tito p��m� potomci budou za�azeni pozd�ji. OPmac tento probl�m �e��
dv�ma pr�chody nad daty, kter� jsou vytvo�eny pro tisk obsahu, tj. v makru
"\toclist". V prvn�m pr�chodu spo��t� pot�ebn� potomky a ve druh�m
pr�chodu za�ad� v�echny polo�ky postupn� jako \uv{outlines} do z�lo�ky.
P�ipomeneme si, �e v "\toclist" se nach�z� seznam maker tvaru
"\tocline{<odsazen�>}{<font>}{<��slo>}{<text>}{<strana>}".
Makro \db outlines "{<�rove�>}" nejprve nastav� "\tocline" na hodnotu 
"\outlinesA" a projde "\toclist". Pak je nastav� na hodnotu "\outlinesB" a 
znovu projde "\toclist". 

\inext{def\nb outlines}{^^B\cbrace}{++}

V makru \db outlinesA "{<odsazen�>}{<font>}{<��slo>}{<text>}{<strana>}"
po��t�me potomky. Makro je navr�eno tak, aby bylo
snadno roz���iteln� na libovolnou �rove� hloubky stromu, nicm�n� pro pot�eby
OPmac sta�� hloubka t�i (kapitoly, sekce, podsekce). �rove� uzlu p�e�teme v
parametru "<odsazen�>". Pro kapitolu je "<odsazen�>"=0, pro sekci je
"<odsazen�>"=1 a pro podsekci je "<odsazen�>"=2. 
P�edstavme si vedle sebe �adu counter�
"\count0:\count1:\count2". P�i sekven�n�m �ten� jednotliv�ch uzl� stromu
si ka�d� uzel zv�t�� v t�to pomysln� �ad� hodnotu sv�ho
counteru o~jedni�ku. Kapitoly zv�t�uj� "\count0", sekce "\count1", podsekce
"\count2". Sta�� tedy zv�t�it "\count<odsazen�>". �ada counter� pak
jednozna�n� ur�uje zpracov�van� uzel.
Uzly pro kapitoly maj� p�id�lenu kontroln� sekvenci "ol:\the\count0"
a uzly pro sekce maj� p�id�lenu kontroln� sekvenci 
"ol:\the\count0:\the\count1". Jsou to makra, jejich� obsahem je po�et
potomk� dan�ho uzlu. Makrem \db addoneol "<csname>" zv�t��me obsah dan�
kontroln� sekvence o~jedni�ku. P��kazem "\ifcase<odsazen�>" �e��me, kter�mu
rodi�i je t�eba zvednout tuto hodnotu. P�i nule (kapitola) nikomu,
nebo� dan� uzel nem� rodi�e. P�i "<odsazeni>"=1 zv�t��me o
jedni�ku po�et potomk� nad�azen� kapitole a p�i "<odsazeni>"=2 nad�azen�
sekci. Asi by bylo p�ehledn�j�� na za��tku definovat v�echny pot�ebn�
sekvence "ol:<n�co>" a nastavit jim hodnotu~0. Ov�em �et��me pam�t� i �asem,
tak�e zakl�d�me sekvenci "ol:<n�co>" teprve v makru "\addoneol" a to tehdy,
kdy� je ji poprv� pot�eba zv�t�it o~jedni�ku.

\inext{outlinesA}{\count=2 ^^B\cbrace}{++}

V makru \db outlinesB "{<odsazen�>}{<font>}{<��slo>}{<text>}{<strana>}"
vkl�d�me jednotlivou polo�ku obsahu do z�lo�ek pomoc� pdf\TeX{}ov�ho
primitivu\hfil\break
"\pdfoutline goto name{<lejbl�k>} count<potomci> {<text>}".
��slo "<potomci>" je opat�eno znam�nkem m�nus pr�v� tehdy, kdy� chceme, aby
polo�ka ve v�choz�m stavu nezobrazovala sv� potomky, ale jen troj�heln��ek.
Potomci se zobraz� a� po kliknut� na troj�heln��ek. V makru \db outlinelevel
m�me makrem "\outlines" p�ipravenu �rove� rozev�en�, kterou si u�ivatel
p�eje. Nejprve p�i�ten�m "\count<odsazen�>" dostaneme �adu
"\count0:\count1:\count2" do stejn�ho stavu, jako v p�edchoz�m prvn�m pr�chodu
a m�me t�m jednozna�n� p�id�len uzel stromu.
Do "\tmpnum" vlo��me �daj o po�tu potomk� dan�ho uzlu. K tomu je pot�eba
rozv�tvit v�po�et p��kazem "\ifcase", proto�e pro r�znou �rove� uzlu m�me
�daj v~r�zn� definovan�m makru. P��kazem "\protectlist" zastav�me expanze
p��padn�ch maker registrovan�ch pomoc� "\addprotect" a definujeme vlnku jako
mezeru (v z�lo�ce vypad� l�p ne� vlnka). D�le pomoc� "\setcnvcodesA"
expandujeme "\toasciidata". Pomoc� "\setlccodes\toasciidata" p�iprav�me 
"\lccode" znak� tak, aby "\lowercase" odstranil h��ky a ��rky. To
vz�p�t� provedeme, ale nejprve je�t� do toho m��e promluvit u�ivatel v makru
"\cnvhook", kter� je implicitn� nastaveno na makro pr�zdn�.

\ilabel [outlines:setlccodes] {setlccodes}

\inext{outlinesB}{^^B\cbrace}{++}

Makro \db setcnvcodesA zkontroluje podle definovanosti "\r", zda je zapnut�
"\csaccents" a pokud je, expanduje "\toasciidata". 
Makro \db toasciidata pot�ebujeme expandovat, proto�e 
neobsahuje p��m� z�pis znak�. D�vod je z�ejm�, nechceme, aby se 
soubor {\tt opmac.tex} stal z�visl� na pou�it�m k�dov�n�. 

\inext{setcnvcodesA}{\count=2 ^^B\cbrace}{++}

Na ��dku \cite[outlines:setlccodes]
se makro \db setlccodes spust� jako "\setlccodes AA�A�A�a...{}{}".  
Toto makro si odloupne dva parametry "xy", provede "\lccode`x=`y" a 
v~rekurzivn�m cyklu pokra�uje v~�innosti, dokud nenaraz� na "{}{}".

\inext{setlccodes}{\empty}{+-}

Makro \db insertoutline "{<text>}" vlo�� jedinou polo�ku do z�lo�ky. Pro
tuto polo�ku se p�edpokl�d� nulov� po�et potomk�. Vyu�it�: u�ivatel m��e
takto odk�zat na za��tek nebo konec dokumentu.

\inext{insertoutline}{\empty}{+-}

Pokud je dokument zpracov�n do DVI v�stupu, je vhodn� v��e zm�n�n� makra
deaktivovat:

\inext{ifpdftex}{\empty}{+-}



\subsec Verbatim
%%%%%%%%%%%%%%%%

Verbatim v�pisy budou odsazeny o "\ttindent". Je nastaven na hodnotu
"\parindent" v dob� �ten� souboru a spole�n� s "\parindent" by m�l
u�ivatel zm�nit i "\ttindent".  ��ta� \db ttline ��sluje ��dky b�n�ho verbatim v�stupu,
��ta� \db viline ��sluje ��dky souboru �ten�ho pomoci "\verbinput". Souborov�
deskriptor \db vifile bude p�i�azen souboru v makru "\verbinput".

\inext{newcount}{\empty}{+-}

Makra \db setverb, \db begtt "...\endtt" jsou dokumentov�na v TBN, str. 29.

\inext{setverb}{testparA}{++}

Makro "\begtt" o�ich� na konci sv� �innosti, zda se nach�z� pod "\endtt"
pr�zdn� ��dek (alias "\par"). K tomu slou�� makra \db testparA (p�esko�� 
mezeru, kter� za "\endtt" v�dy je), \db testparB (p�e�te n�sleduj�c� znak
pomoc� "\futurelet") a \db testparC (o�et��, zda tento n�sleduj�c� znak je
"\par").

\inext{testparA}{\empty}{+-}

Makro \db activettchar pracuje podobn�, jako makro "\adef". Nav�c
pot�ebuje pou��t nov� na�ten� znak ve sv� aktivn� kategorii jako separ�tor
vymezuj�c� konec parametru.

\inext{activettchar}{\empty}{+-}

Makro \db verbinput si pomoc� "\tmpa" ov���, zda minule byl �ten stejn�
soubor. Pokud ne, otev�e soubor "#2" ke �ten� pomoc� "\openin" a ulo�� do
\db vifilename jm�no naposledy otev�en�ho souboru. D�le zkontroluje pomoc�
"\ifeof", zda je mo�n� ze souboru ��st. Pokud ne, vyp��e se varov�n� a
pomoc� \db skiptorelax se p�esko�� zbytek obsahu makra a� po "\relax",
tak�e se neprovede nic dal��ho. Je-li soubor �sp�n� otev�en nebo byl-li
otev�en ji� minule, pust� se makro "\verbinput" do prozkoum�n� parametru
"#1" zapsan�ho v z�vorce p�ed jm�nem souboru.

\inext{verbinput}{\empty}{+-}

C�lem vyhodnocen� parametru v z�vorce makra "\verbinput" jsou dva �daje: \db
vinolines bude obsahovat po�et ��dk�, kter� je od za��tku souboru nutno
p�esko�it, ne� se m� zah�jit p�episov�n� ��dk� a \db vidolines bude
obsahovat po�et ��dk�, kter� se maj� p�epsat ze souboru do dokumentu.
P�smena "vi" na za��tku t�chto n�zv� p�edstavuj� zkratku pro "verbinput".
Vy�et�en� parametru ukon�en�ho textem "+\relax" se v makru \db
viscanparameter v�tv� na p��pad, kdy parametr obsahuje symbol "+" a pou�ije
se pak \db viscanplus. Druh� p��pad, kdy u�ivatel nenapsal symbol plus
(tak�e parametr "#2" makra "\viscanparameter" je pr�zdn�) je d�le 
vy�et�en v makru \db viscanminus. Ob� makra si odd�l� do sv�ch parametr�
prvn� a druhou ��slici (ka�d� z nich m��e b�t pr�zdn�) a nastav� podle
zdokumentovan�ch pravidel pro z�pis parametru odpov�daj�c� intern� �daje
"\vinolines" a "\vidolines". Vych�z� p�itom z p�edpokladu, �e registr
"\viline" obsahuje ��slo naposledy p�e�ten�ho ��dku (nebo nulu, jsme-li na
za��tku souboru).

\inext{viscanparameter}{\count=3 ^^B\cbrace}{++}

Makro \db doverbinput provede samotnou pr�ci: p�esko�� "\vinolines" ��dk� a
p�ep��e "\vidolines" ��dk�. To provede v prvn�m a druh�m cyklu "\loop". Ne�
se k t�mto cykl�m dostane, mus� ud�lat jist� p��pravn� pr�ce. Nejprve ode�te
od "\vinolines" po�et u� p�e�ten�ch ��dk�, proto�e p�i opakovan�m �ten�
stejn�ho souboru jej neotev�r�me znova, jen p�esko��me p��slu�n� men�� po�et
��dk�. Pokud ale se uk�e, �e rozd�l je z�porn� (je pot�eba se v souboru
vracet dozadu), makro znovuotev�e soubor ke �ten� pomoc� "\openin" a uprav�
podle toho p��slu�n� �daje o ��dc�ch. Pak zah�j� skupinu, d�le pomoc�
"\setverb" nastav� speci�ln�m znak�m kategorii 12 a pomoc� "\adef{ }{ }"
nastav� meze�e aktivn� kategorii (bude expandovat na neaktivn� mezeru jako
"\space") a tak� nastav� kategorii 12 znaku, kter� byl deklarov�n pomoc�
"\activettchar". P�iprav� odsazen� podle "\ttindent" a spust� u�ivatelsk�
"\tthook". Je-li pot�eba tisknout ��sla ��dk�, p�iprav� si na to font
"\sevenrm", kter� m� velikost rovnu 0,7 n�sobku z�kladn� velikosti. A pust� se do
zm�n�n�ch dvou cykl� "\loop". V obou cyklech se m��e st�t, �e naraz�me
ne�ekan� na konec souboru. To je o�et�eno testem "\ifeof\vifile" a n�slednou
�pravou ��ta�e "\tmpnum" tak, abychom okam�it� vysko�ili z cyklu. Druh�
cyklus obsahuje je�t� jeden speci�ln� rys: p�eje-li si u�ivatel ��st a� do
konce souboru, je nastaveno "\vidolines" na nulu a p�ed zah�jen�m cyklu je
��ta� "\tmpnum" nastaven na "-1". Uvnit� cyklu je pak zaji�t�no, �e v tomto
p��pad� nen� ��ta� zv�t�ov�n o jedni�ku. Po ukon�en� pr�ce v t�chto dvou
cyklech je ukon�ena skupina, vlo�ena mezera "\ttskip" a makrem "\testparB"
se ov���, zda n�sleduje pr�zdn� ��dek.

\inext{doverbinput}{^^B\cbrace}{++}

V prvn�m cyklu "\loop" v t�le makra "\doverbinput" se opakovan� vol�
\db vireadline, co� je makro, kter� p�e�te dal�� ��dek ze souboru. V druh�m
cyklu se opakovan� vol� "\vireadline" n�sledovan� \db viprintline. Toto
makro vytiskne p�e�ten� ��dek do dokumentu. P�ed ��dkem m��e b�t v "\llap" 
vyti�t�no ��slo ��dku. Z�le�� na hodnot� "\ttline". Je to naprogramov�no v
souladu s u�ivatelskou dokumentac�.

\inext{vireadline}{\empty}{++}


\subsec Jednoduch� tabulka
%%%%%%%%%%%%%%%%%%%%%%%%%%

Tabulku makrem "\table" vytvo��me jako "\vbox", ve kter�m je "\halign". Je
tedy pot�eba na��st deklaraci typu "{llc|rr}" a p�ev�st ji na deklaraci pro
"\halign". Tato deklarace obsahuje znak "#" a tento znak se obt��n� p�id�v�
do t�la maker. Nashrom�d�me tedy postupn� deklaraci pro "\halign" do
registru typu "\toks", kter� je nazvan� \db tabdata. D�le definujeme intern�
\db tabstrutA, kter� bude obsahovat u�ivatel�v "\tabstrut", ov�em p�echodn�
budeme toto makro m�nit. Tak� deklarujeme ��ta� \db colnum, ve kter�m budeme
m�t po p�e�ten� deklarace ulo�en po�et sloupc� tabulky.
D�le b�hem skenov�n� "<deklarace>" vytvo��me makro \db
ddlinedata, kter� bude obsahovat "&\dditem &\dditem ..." (po�et t�chto dvojic
bude roven $n-1$, kde $n$ je po�et sloupc�). Pokud je v deklaraci dvojit�
svisl� ��ra, bude v makru "\ddlinedata" na p��slu�n�m m�st� je�t� "\vvitem".
Makro "\ddlinedata" pak pou�ijeme v "\crli" a v "\tskip", 
Str��ek P��hoda to m��e pou��t jinde a jinak. Kone�n� makro \db vvleft je
nepr�zdn�, pokud �pln� vlevo tabulky je dvojit� ��ra.

\inext{newtoks}{\empty}{+-}

Makro \db table "{<deklarace>}{<data>}" vypad� takto:

\inext{table}{\empty}{+-}

Makro \db scantabdata postupn� �te znak po znaku z deklarace "\table" a podle
p�e�ten�ho znaku ukl�d� do "\tabdata" odpov�daj�c� �sek skute�n� deklarace pro
"\halign". Vol� p�itom "\addtabvrule" nebo "\addtabitem{\tabdeclare<znak>}".

\inext{scantabdata}{^^B\cbrace}{++}

OPmac p�eddefinuje t�i "<znaky>" pro "<deklaraci>", sice "<znaky>" "c", "l", "r"
v makrech \db tabdeclarec, \db tabdeclarel, \db tabdeclarer.

\inext{tabdeclarec}{\empty}{+-}

Makro \db unsskip vkl�dan� na konec ka�d� datov� polo�ky odebere mezeru,
pokud m� nenulovou z�kladn� velikost. U�ivatel� toti� n�kdy d�vaj� kolem
datov�ch polo�ek mezery a n�kdy ne, p�itom cht�j�, aby se jim to chovalo
stejn�. Je n�ro�n� si pamatovat, �e mezery p�ed polo�kou jsou
ignorov�ny primitivem "\halign", ale mezery za polo�kou jsou podstatn�. Tak
rad�ji i mezery za polo�kou ud�l�me nepodstatn�.

\inext{unsskip}{}{++}

P��klad: po deklaraci: "{|cr||cl|}" makro "\scantabdata" vytvo��:

\begtt
tabdata: \vrule\tabiteml\hfil#\unsskip\hfil\tabitemr 
        &\tabiteml\hfil#\unsskip\tabitemr \vrule\kern\vvkern\vrule 
        &\tabiteml\hfil#\unsskip\hfil\tabitemr
        &\tabiteml#\unsskip\hfil\tabitemr\vrule
ddlinedata: &\dditem &\dditem\vvitem &\dditem &\dditem
\endtt

Makra \db addtabitem, \db addtabdata a \db addtabvrule vlo�� do "\tabdata" a
"\ddlinedata" po�adovan� �daj. Makro "\addtabitem" pozn� podle "\colnum=0", 
zda vkl�d� data pro prvn� sloupec (nep�id�v�~"&") nebo pro dal�� sloupce
(p�id�v�~"&"). Makro "\addtabvrule" pozn� podle "\tmpa", zda p�ed 
n�m p�edch�z� dal�� "\vrule". Pokud ano, vlo�� dodate�nou mezeru
"\kern\vvkern" a p�id� "\vvitem" do "\ddlinedata". 

\inext{addtabitem}{\empty}{+-}

Ne� se pust�me do v�kladu dal��ch maker, p�edvedeme p��klad, ve kter�m je
definov�no dal�� p�smeno "P" pro "<deklaraci>". P�smeno "P" vymez� 
tabulkovou polo�ku, je� m� stanovenou ���ku a del�� text se l�me 
do v�ce ��dk�. Je mo�n� si vyzkou�et t�eba tento k�d:

\begtt
\newdimen\Pwidth
\def\tabdeclareP {\enskip\vtop{\hsize=\Pwidth \rightskip=0pt plus1fil
    \baselineskip=1.2em \lineskiplimit=0pt \noindent ##\tabstrut}\enskip}

\Pwidth=3cm \table{|c|P|}{\crl
   aaa & Tady je del�� text�k, kter� se nevejde na jeden ��dek. \crl
   bb  & A tady je taky je n�co del��ho. \crl}
\endtt

Pus�me se nyn� do rozboru maker na ukon�en� ��dk�.
Makro \db crl p�id� ��ru pomoc� "\noalign". Makro \db crll p�id� dvojitou
��ru pomoc� "\noalign".

\inext{crl}{\empty}{+-}

Makro \db crli provede "\cr" a d�le se vno�� do ��dku tabulky, ve kter�m
klade postupn� n�sleduj�c� 
"\omit\tablinefil &\omit\tablinefil &..." 
P�itom v m�st� dvojit� vertik�ln� ��ry naklade nav�c "\tabvvline".
Makro \db tablinefil vlo�� natahovac� ��ru na ���ku cel� polo�ky a makro 
\db tabvvline vlo�� dv� "\vrule" vzd�leny od sebe o "\vvkern". T�m vznik�
p�etrzen� m�sto v postupn� tvo�en� lince. Ke spr�vn�mu nakladen� uveden�ch
povel� pou�ije makro "\crli" obsah makra "\ddlinedata" a vlevo p�id�v�
"\vvleft". P�ed spu�t�n�m makra "\ddlinedata" definuje odpov�daj�c�m
zp�sobem \db dditem a \db vvitem.

\inext{crli}{\empty}{+-}

Makro \db tskip prost�ednictv�m \db tskipA p�echodn� vypr�zdn� "\tabstrut"
p�edefinov�n�m "\tabstrutA" a tak� vypr�zdn� "\dditem" a "\vvitem", aby
po pou�it� "\ddlinedata" vznikl ��dek tabulky s pr�zdn�mi polo�kami. 
��dek je vypodlo�en� strutem stanoven� v��ky "\tmpdim".
Nakonec je pot�eba vr�tit "\tabstrutA" do p�vodn�ho stavu.

\inext{tskip}{\empty}{+-}

Glob�ln� zm�na ���ek v�ech linek tvo�en�ch pomoc� "\vrule" a "\hrule" je
provedena makry \db rulewidth a \db rulewidthA. My�lenka je dokumentov�na v
TBN na str.~328.
\dgn \nb orivrule
\dgn \nb orihrule

\inext{orihrule}{\empty}{+-}

Makro \db frame "{<text>}" vlo�� vn�j�� "\vbox{\hrule..\hrule}".
V n�m se nach�z� dal�� box "\hbox{\vrule\kern\vvkern..\kern\vvkern\vrule}"
a v n�m "\vbox{\kern\hhkern..\kern\hhkern}". 
Nejv�ce uvnit� je pak "\hbox{<text>}". To by pro sazbu r�movan�ho textu
sta�ilo, nicm�n� my je�t� �e��me �pravu v�sledn�ho boxu tak, aby m�l ��a��
ve stejn�m m�st� jako je ��a�� textu. Proto ulo��me "\hbox{<text>}" do boxu0
a zm���me mu hloubku. V prom�nn� "\tmpdim" spo��t�me celkovou hloubku
v�sledn�ho boxu. Ve v�po�tu p�i��t�me v��ku "\hrule", kter� nemus� b�t
0.4pt. Proto si jej� v��ku zm���me v boxu1. Ve vn�j��m "\vbox"u po
nakreslen� spodn� "\hrule" se pak vrac�me pomoc� "\kern-\tmpdim" na �rove�
��a�� a zde um�st�me strut hloubky "\tmpdim", aby sazba sm�rem dol�
nep�e�n�vala, ale byla obsa�ena v~hloubce v�sledn�ho boxu.

\inext{frame}{\empty}{+-}


\subsec Vlo�en� obr�zku
%%%%%%%%%%%%%%%%%%%%%%%

Nejprve deklarujeme \db picw.

\inext{picw}{\empty}{+-}

Makro \db inspic je zkratka za pou�it� primitiv� "\pdfximage", 
"\pdfrefximage" a "\pdflastximage". Kdo si to m� po��d pamatovat.
Nen�-li aktivov�n PDF v�stup, nap��eme jen varov�n� a neprovedeme nic.
Pokud budeme pracovat se stejn�mi obr�zky v jednom dokumentu, bude 
vhodn� mo�nosti primitiv� vyu��t naplno.

\inext{ifpdftex}{\empty}{+-}


\subsec PDF transformace
%%%%%%%%%%%%%%%%%%%%%%%%

Makro \db pdfscale "{<vodorovn�>}{<svisle>}" pracuje jednodu�e:

\inext{pdfscale}{\empty}{+-}

Na druh� stran� makro \db pdfrotate "<�hel>" vytvo��
"\pdfsetmatrix{"$\cos\varphi\enspace\sin\varphi\enspace
                {-}\sin\varphi\enspace\cos\varphi$"}",
co� nen� jednoduch�, proto�e funkce $\cos$, $\sin$ nejsou v \TeX{}u
implementov�ny. Bal��ek "trig.sty" nab�z� vyhodnocov�n� t�chto funkc� pomoc�
Taylorov�ch polynom�, nicm�n� OPmac nechce b�t z�visl� na bal��c�ch a tak�
chce uk�zat alternativn� zp�sob implementace. Makro "\pdfrotate" pracuje
zhruba takto: je-li argument 0, neprovede nic, je-li argument 90, provede
oto�en� o~90 stup��. V ostatn�ch p��padech zavol� makro \db pdfrotateA,
kter� rozlo�� argument na celou "#1" a zlomkovou "#2" ��st. V dal�� ��sti 
na ��dc�ch~\cite[rot:360] a� \cite[rot:smallsin] se
zab�v� jen cel�mi stupni. Nejprve pomoc� prvn�ho a druh�ho "\loop" posune
argument o cel� n�sobky 360 stup�� tak, �e pot� je argument mezi
0 a� 360 stupni, a p�itom se hodnoty funkc� $\sin$ a $\cos$ nezm�nily.
Ve t�et�m "\loop" postupn� sni�uje argument o 90 stup�� a p�itom d�l� rotaci
o 90 stup�� tak dlouho, a� m�me argument mezi nulou a devades�ti.
Je-li d�le argument v�t�� ne� 44 stup��, oto��me se o 45 a sn���me argument
o 45. Je-li d�le argument v�t�� ne� 22, oto��me se o 22 a sn���me argument o
22. Nyn� m�me argument v mno�in� $\{0, 1, 2, 3, \ldots, 22\}$. Pro ka�d�
prvek z t�to mno�iny argument� m�me p�edp�ipraveny hodnoty funkc� 
$\cos$ a $\sin$ v makrech \db smallcos a \db smallsin. Pou�ijeme je pro
z�v�re�nou rotaci. T�m m�me sazbu oto�enou o cel� stupn�.
Dal�� ��st makra na ��dc�ch \cite[rot:174532] a� \cite[rot:else]
�e�� jemn� doto�en� podle zlomkov� ��sti argumentu. V intervalu nula a�
jeden stupe� aproximujeme funkci $\cos$ konstantn� jedni�kou a funkci $\sin$
line�rn� funkc� $x\cdot \pi/180$. V dan�m rozmez� je to velmi dobr�
aproximace.

\ilabel [rot:360] {360}
\ilabel [rot:smallsin] {smallsin}
\ilabel [rot:174532] {174532}
\ilabel [rot:else] {else\space\space\space\space}

\inext{pdfrotate}{\empty}{+-}

Pro p��pad, �e nepracujeme s PDF v�stupem, definujeme kl��ov� primitivy
pdf\TeX{}u jako makra, kter� ned�laj� nic.

\inext{ifpdftex}{\empty}{+-}



\subsec Pozn�mky pod �arou a na okraji str�nek
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Makro \db fnote p�edpokl�d�, �e spr�vn� ��slo pozn�mky na dan� str�nce je
p�ipraveno v makru "\fn:<��slo>", kde "<��slo>" je celkov� ��slo pozn�mky nap���
cel�m dokumentem sledovan� glob�ln�m ��ta�em \db fnotenum.
Makro ohl�s� svou existenci do REF souboru z�znamem "\Xfnote" (bez
parametru). D�le vytiskne zna�ku pomoc� "\fnmarkx" a ve skupin� p�ejde na
men�� sazbu a zavol� plain\TeX{}ov� makro "\vfootnote", kter� vlo�� sazbu
pomoc� tzv. insertu (TBN, kapitola~6.7). Plain\TeX{}ov� nastaven� t�to
t��dy insertu nen� makrem OPmac nijak m�n�no.

\inext{fnotenum}{^^B\cbrace}{++}

Makro \db fnotemark p�i�te lok�ln� k "\fnotenum" sv�j parametr a vytiskne
odpov�daj�c� zna�ku. Cel� pr�ce makra prob�h� ve skupin�, tak�e po ukon�en�
makra se "\fnotenum" vr�t� do sv� p�vodn� hodnoty.

\inext{fnotemark}{^^B\cbrace}{++}

Makro \db fnotetext teprve zvedne ��ta� "\fnotenum" glob�ln� a vytiskne
pozn�mku pomoc� plain\TeX{}ov�ho "\vfootnote".

\inext{fnotetext}{^^B\cbrace}{++}

Makro \db fnmarkx vytiskne otazn�k nebo \db thefnote. P�edpokl�d� se, �e si
u�ivatel p�edefinuje "\thefnote" k obrazu sv�mu. Lok�ln� ��slo pozn�mky na
str�nce m� p�ipraveno v makru \db locfnum.

\inext{fnmarkx}{\empty}{+-}

P�i �ten� REF souboru se pro ka�dou stranu p�e�te nejprve "\Xpage", co�
je makro, kter� pronuluje \db fnotenumlocal. 
Makru \db Xfnote tedy sta�� pozvednout
"\fnotenumlocal" o jedni�ku a pomoc� 
"\sxdef" si tuto hodnotu zapamatovat v makru "\fn:<��slo>".

\inext{Xfnote}{\empty}{+-}

Registr \db mnotenum. 
glob�ln� ��sluje okrajov� pozn�mky a pln� podobnou funkci, jako registr
"\fnotenum" pro pod��rov� pozn�mky.

\inext{mnotenum}{\empty}{+-}

Makro \db mnote ve vertik�ln�m m�du zalo�� box nulov� v��ky pomoc�
"\mnoteA" a vycouv� na p�vodn� m�sto sazby pomoc� "\vskip-\baselineskip". V
odstavcov�m m�du toto makro nalep� box nulov� v��ky pod pr�v� vytvo�en�
��dek v odstavci. V�me, �e "\vadjust" nalep� sv�j materi�l bez mezery pod
tento ��dek. My ov�em pot�ebujeme vycouvat nahoru na ��a�� ��dku. To nejde
snadno prov�st, proto�e hloubka ��dku je prom�nliv�. Proto do je ��dku
vlo�en "\strut" a p�edpokl�d� se, �e nyn� m� ��dek hloubku "\dp\strutbox" a
o tento rozm�r makro vycouv� nahoru. Vlo�� po�adovan� box v��ky nula na
�rovni ��a�� a pak se vr�t� na p�vodn� m�sto.

\inext{mnote}{^^B\cbrace}{++}

Makro \db mnoteA si zjist�, zda je v makru "\mn:<��slo>" ulo�en primitivn�
p��kaz "\left" nebo "\right". Podle toho pozn�, zda m� um�stit pozn�mku
doleva nebo doprava. Rovn� d� o sob� v�d�t do REF souboru vlo�en�m
sekvence "\Xmnote" (bez parametru). Sazba mus� v obou p��padech vyprodukovat
box nulov� v��ky i hloubky. Proto je "\vtop", uvnit� kter�ho je text pozn�mky
zpracov�n, vlo�en p�echodn� do boxu0 a je mu pronulov�na hloubka. Nulov�
v��ka je za��zena pomoc� "\vbox to0pt{\vss\box0}". Vlastn� sazbu pozn�mky
zahajujeme pomoc� "\noindent" s t�m, �e je p�ipraven pru�n� "\leftskip" nebo
"\rightskip" podle toho, zda pozn�mku klademe vlevo nebo vpravo.
P�i kladen� vlevo mus�me pou��t "fill", abychom p�eprali natahovac� mezeru z
"\parfillskip".

\inext{mnoteA}{^^B\cbrace}{++}

Makro \db Xmnote pracuje b�hem �ten� REF souboru a vyu��v� toho, �e makro
"\Xpage" nastavuje ��slo pr�v� procesovan� strany do registru "\lastpge".
Tak�e sta�� pou��t "\sxdef" n�sleduj�c�m zp�sobem:

\inext{Xmnote}{\empty}{+-}

Makro \db fixmnotes "<token>" p�edefinuje v cyklu v�echny definovan�
kontroln� sekvence "\mn:<��slo>" tak, �e budou obsahovat "<token>".
T�m toto makro zlikviduje pr�ci makra "\Xmnote", ale o to n�m pr�v� jde v
p��pad�, kdy� chceme m�t pozn�mky na jednozna�n� dan� stran�.

\inext{fixmnotes}{\empty}{+-}


\subsec Bibliografick� reference
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Nejprve uvedeme deklarace deskriptoru \db auxfile a ��ta�� 
\db bibnum a \db lastcitenum.

\inext{auxfile}{\empty}{+-}

Makro \db cite "[<lejbl�k1>,<lejbl�k2>,...]" si prost�ednictv�m \db citeA
zavol� "\rcite{<lejbl�k>}" pro ka�dou jednotlivou polo�ku odd�lenou ��rkou ve
sv�m parametru. Makro "\citeA" v sob� skr�v� fintu: parametr nem� jedin�,
ale dva "#1#2". Proto�e prvn� z nich je neseparovan�, ignoruj� se p��padn�
mezery za ��rkou a "#1" obsahuje prvn� p�smeno "<lejbl�ku>". Uvnit� makra
m�n�me \db citesep, co� je ��rka a mezera, kter� se m� mezi �daji
vytisknout. Makro \db nocite "[<lejbl�k1>,<lejbl�k2>,...]" je definov�no
stejn�, jen p�iprav� jin� v�znam makra "\docite", krz kter� budeme tisknout
v "\rcite" pot�ebn� �daj. Ve�ker�
�innost maker "\cite" a "\nocite" prob�h� uvnit� skupiny.

\inext{cite}{\empty}{+-}

Makro \db rcite "{<lejbl�k>}" �e�� zhruba �e�eno n�sleduj�c� v�ci:


\begitems
\item * Zjist�, zda je definov�n "\csname bib:<lejbl�k>\endcsname". Pokud ano,
  vytiskne jeho hodnotu, pokud ne, vytiskne do textu otazn�ky a na termin�l
  varov�n�. Tato kontroln� sekvence za�ne b�t zn�m� po pou�it�
  "\bib[<lejbl�k>]" nebo "\bibitem{<lejbl�k>}". Tato makra ulo��
  odpov�daj�c� informaci do REF souboru, odkud ji p�i opakovan�m \TeX{}ov�n� 
  vyzvedneme. Je to klasick� �innost, kterou provozujeme i u ostatn�ch
  k���ov�ch referenc�.
\item * Ulo�� o sob� zpr�vu do bufferu "\citelist". To pou�ijeme
  v makrech "\usebibtex" nebo "\usebbl".
\enditems

Makro "\rcite" je naprogramov�no zhruba takto

\def\begtthook{\langleactive}
\begtt
function rcite(<lejbl�k>) {
  if (<lejbl�k> == '*') { <zapi� do> \citelist '*'; return; }
  if (\bib:<lejbl�k> == nedef) {
    <zapi� do> \citelist <lejbl�k>;
    <na termin�l:> "Warning, cite [label] unknown";
    <do tiskov�ho v�stupu:> "??";
    \bib:<lejbl�k> = empty;
    return;
  if (\bib:<lejbl�k> == empty) {
    <do tiskov�ho v�stupu:> "??";
    return;
  }
  if (\bib:<lejbl�k> kon�� znakem '&') {
    <zapi� do> \citelist <lejbl�k>;
    <odstra� znak & z obsahu makra> \bib:<lejbl�k>;
  }
  <tiskni obsah makra> \bib:<lejbl�k>;
} 
\endtt

\def\begtthook{\langleactive}
V�klad k�du: Proto�e chceme �et�it pam�t� bufferu "\citelist", zapisujeme
tam ka�d� "<lejbl�k>" jen jednou. Zda se nedeklarovan� "<lejbl�k>" vyskytl
poprv� pozn�me podle nedefinovan� hodnoty "\bib:<lejbl�k>". Zda se vyskytl
pozd�ji znovu pozn�me podle toho, �e m� hodnotu "empty". Zda se deklarovan�
"<lejbl�k>" vyskytl poprv� pozn�me podle znaku "&" v jeho obsahu. 

N�vrh k�du v C-like notaci nyn� p�evedeme do maker v \TeX{}u:

\inext{rcite}{^^B\cbrace}{++}

Asi nejzaj�mav�j�� vychyt�vka v tomto makru se t�k� testu na znak "&".
Implicitn� p�i �ten� REF souboru se do makra "bib:<lejbl�k>" ulo��
"\bibnn{<hodnota>}&". P��kaz "\if" za sebou tot�ln� expanduje v�e
n�sleduj�c�, tak�e nejprve naraz� na "&", pak se obsah "bib:<lejbl�k>"
expanduje prost�ednictv�m \db bibnn "{<hodnota>}" na nic a za t�mto 
\uv{nic} se zjev� druh� znak "&", kter� se tedy p�ilep� na ten prvn�. 
Ano, je pravda, �e tyto dva znaky jsou stejn�. 
Odstran�n� tohoto znaku prob�h� znovu tot�ln� expanz�,
tentokr�t "\bibnn" prvn� parametr "<hodnota>" zopakuje a druh� parametr
se znakem "&" zahod�.

Ne� se pust�me do v�kladu makra "\docite", p�iprav�me si makra \db printcite
"<polo�ka>" a \db printdashcite "<polo�ka>". Prvn� z nich tiskne jednu 
polo�ku odd�lenou od p��padn�
dal�� ��rkou, druh� tiskne polo�ku, p�ed kterou p�edch�z� poml�ka
vyzna�uj�c� interval polo�ek. Pointa makra "\printcite" je v tom, �e si samo
po prvn�m zavol�n� p�iprav� separ�tor "\citesep" (kter� je na za��tku
�innosti "\cite" pr�zdn�), tak�e p�i opakovan�m vol�n� "\printcite" se
vytiskne i po�adovan� separ�tor. Poml�ka v "\printdashcite" je schov�na do
"\hbox", aby nedoch�zelo t�sn� za n� ke zlomu ��dku.

\inext{printcite}{\empty}{+-}

Makro \db docite "<polo�ka>" vytiskne otazn�ky p�i pr�zdn�m parametru a jinak
vytiskne prost�ednictv�m "\printcite" jednu "<polo�ku>". Krom� toho �e�� p�i
nenulov�m "\lastcitenum" slu�ov�n� po sob� n�sleduj�c�ch ��sel polo�ek do
interval�. Naposledy vyti�t�nou polo�ku uchov�v� v registru "\lastcitenum".
P�i p���t�m zavol�n� zv�t�� "\lastcitenum" o jedni�ku a srovn� ji s
"<polo�kou>". Jsou-li si rovny, jde o n�sleduj�c� polo�ku v �ad� a takovou
polo�ku netiskneme, nicm�n� si jej� hodnotu uchov�me v "\tmpb". Pokud je
mezi souvislou �adou polo�ek d�ra, tj. "\lastcitenum" se nerovn�
"<polo�ce>", pak dovytiskneme p�edchoz� interval pomoc� 
"\printdashcite{\the\tmpb}" a n�sledn� vytiskneme i "<polo�ku>".
Makro \db shortcitations jednodu�e nastavuje "\lastcitenum" na nenulovou
hodnotu a t�m probud� k �ivotu hlavn� ��st makra "\docite".

\inext{docite}{\empty}{+-}

N�sleduje k�d makra \db bib "[<lejbl�k>]", kter� prost�ednictv�m
\db wbib "{<lejbl�k>}{<hodnota>}" vlo�� do REF souboru propojen� �daje o
tom, jak� m� "<lejbl�k>" p�i�azeno ��slo v seznamu literatury.
Makro "\wbib" p�ipoj� p�ed "\wref" p��kaz "\immediate" pr�v� tehdy, kdy�
"\wref" je ve stavu, kdy skute�n� zapisuje do souboru REF.
Makro \db Xbib pracuje p�i �ten� souboru REF a d�l� to, co jsme si �ekli u�
d��ve: nastav� hodnotu makra "\bib:<lejbl�k>" na "\bibnn{<hodnota>}&".

\inext{bib}{\empty}{+-}

Makro \db addcitelist "{<lejbl�k>}" p�id� do \db citelist �daj ve tvaru
"\lcite[<lejbl�k>]". Hranat� z�vorky jsou pou�ity proto, aby fungoval test
"\isinlist\citelist{[<lejbl�k>]}". Jak uvid�me za chv�li, makro
"\addcitelist" zm�n� b�hem �innosti makra "\usebibtex" sv�j v�znam na
\db writeaux, aby p��padn� pou�it� "\cite" a� za "\usebitex" rovnou
zapisovalo do AUX souboru. Podobn� makro "\addcitelist" zm�n� v makru
"\usebbl" sv�j v�znam \db writeXcite "{<lejbl�k>}", 
aby v p���t�m pr�chodu \TeX{}em
m�lo makro "\usebbl" p�ehled i o v�skytech "\cite", kter� jsou naps�ny 
pozd�ji, ne� "\usebbl".

\inext{addcitelist}{\empty}{+-}

Ne� se pust�me do v�kladu maker "\usebibtex", "\genbbl" a "\usebbl", uvedeme
stru�n� popis �innosti Bib\TeX{}u. P��kaz "bibtex <dokument>" zp�sob�,
�e program {\tt bibtex} se pod�v� do souboru "<dokument>.aux" a tam si v��m�
sekvenc� \db bibdata "{<bib-b�ze>}", \db bibstyle "{<bib-style>}" a \db
citation "{<lejbl�k>}". Na z�klad� toho n�sledn� p�e�te soubor
"<bib-b�ze>.bib" se zdrojov�mi z�pisy bibliografick�ch �daj�.
Pro konverzi t�chto zdrojov�ch z�pis� do v�stupn�ho souboru "<dokument>.bbl"
pou�ije stylov� soubor "<bib-style>.bst". Nen�-li mezi sekvencemi
"\citation" uvedeno "\citation{*}", program {\tt bibtex} zahrne do v�stupu
jen ty bibliografick� �daje, kter� maj� "<lejbl�k>" shodn� s n�kter�m z
"<lejbl�k�>" uveden�ch v parametrech sekvenc� "\citation". Ka�d� sekvence
"\citation{<lejbl�k>}" v souboru "<dokument>.aux" typicky odpov�d� jednomu
pou�it� p��kazu "\cite[<lejbl�k>]".

Makro \db usebibtex "{<bib-b�ze>}{<bst-styl>}" otev�e soubor AUX
prost�ednictv�m \db openauxfile "{<bib-b�ze>}{<bst-styl>}". Nap��e tam tedy
po�adovan� data pro Bib\TeX{}. D�le z "\citelist" p�ep��e do AUX souboru
lejb�lky ve form�tu "\citation{<lejbl�k>}". Nakonec se uvnit� skupiny pust� do
�ten� souboru BBL prost�ednictv�m makra "\readbblfile".

\inext{usebibtex}{\count=2 ^^B\cbrace}{++}

Makro \db readbblfile "{<soubor>}" vyzkou��, zda je "<soubor>.bbl" p�ipraven
ke �ten�. Pokud ne, pod� o tom odpov�daj�c� zpr�vu na termin�l. Jinak
nastav� ��ta� "\bibnum" na nulu a (v�domo si toho, �e je spu�t�no ve
skupin�) pust� se do lok�ln�ch re-definic La\TeX{}ov�ch konstrukc�, kter� se
typicky v BBL souborech pou��vaj�. Nastav� "\leftskip" na "\iindent" a
spust� "\bibtexhook". Kone�n� na�te soubor BBL.

\inext{readbblfile}{^^B\cbrace}{++}

V BBL souboru se vyskytuj� povely \db bibitem. Za ka�d�m z nich se mo�n�
objev� parametr v~hranat� z�vorce "[<zna�ka>]" a n�sledn� je uveden
"{<lejbl�k>}". Pak na dal��ch ��dc�ch jsou bibliografick� data jednoho
z�znamu ukon�en� pr�zdn�m ��dkem. Objev�-li se "[<zna�ka>]", d�v� t�m
Bib\TeX{} najevo, �e se m� tato "<zna�ka>" pou��t m�sto b�n�ho ��slov�n�
z�znam�. N�sleduje k�d, kter� takov� �daje p�e�te, vytiskne a vlo�� do REF
souboru o tom zpr�vu prost�ednictv�m "\wref{<lejbl�k>}{<hodnota>}".
Rozli�uj� se dva re�imy tisku: nen�-li p��tomna "[<zna�ka>]" (makro "\tmpa"
je pr�zdn�), pak pomoc� "\llap" vytiskneme "[<��slo>]". Jinak se posuneme o
"-\iindent" a tiskneme "[<zna�ku>]" n�sledovanou mezerou. Pak se vytisknou
dal�� �daje bibliografick�ho z�znamu.
\dgn\nb bibitemB \dgn\nb bibitemC \dgn\nb bibitemD

\inext{bibitem}{^^B\cbrace}{++}

Makro \db genbbl "{<bib-b�ze>}{<bst-style>}" otev�e AUX soubor a zap��e do
n�j �daje pot�ebn� pro Bib\TeX{} v�etn� "\citation{*}". Pot� se makro pokus�
p�e��st v�stup z Bib\TeX{}u pomoc� "\readbblfile". V tomto p��pad� pracuje
"\bibitem" ve zvl�tn�m re�imu, kdy netiskne "<hodnoty>", ale "<lejbl�ky>".
Z toho d�vodu je p�edefinov�no makro "\bibitemC".

\inext{genbbl}{^^B\cbrace}{++}

Makro \db usebbl "/<typ> <bbl-file>" spust� jin� makro s n�zvem "\bbl:<typ>".
T�i takov� makra jsou definov�na pomoc� "\sdef". Prvn� "\bbl:a" je
jednoduch�: prost� projde BBL soubor a vytiskne �daje z~n�j.
Druh� makro "\bbl:b" projde BBL
soubor v re�imu, p�i kter�m jsou bibliografick� data ka�d�ho z�znamu (a� po
pr�zdn� ��dek alias "\par") p�e�tena do parametru "#2" makra "\bibitemC".
Cel� �daj je pak vyti�t�n jen za p�edpokladu, �e "[<lejbl�k>]" je p��tomen 
v seznamu "\citelist". T�et� makro "\bbl:c" pracuje jako druh� a� na to, �e
�daj netiskne, ale zapamatuje si ho do makra "\bb:<lejbl�k>". Po takov�m
projit� BBL souboru je�t� projde "\citelist", kde se "\lcite[<lejbl�k>]"
prom�n� v "\bb:<lejbl�k>", tak�e se z�znam vytiskne. Nyn� ale v po�ad�, v
jak�m jsou "<lejbl�ky>" za�azeny do "\citelist".

\inext{usebbl}{\count=3 ^^B\cbrace}{++}

Za zm�nku stoj� je�t� pr�ce uveden�ch maker s "\citelist". P�ed v�skytem makra
"\usebbl" se lejbl�ky z "\cite" a "\nocite" hromad� v "\citelist". Ov�em
dal�� "\cite" a "\nocite" se mohou vyskytovat za p��kazem "\usebbl". Pokud
se tak stane, pracuje "\addcitelist" nyn� ve v�znamu "\writeXcite" a ulo��
pot�ebnou informaci do REF souboru. P�i dal��m \TeX{}ov�n� se tato informace
p�e�te makrem \db Xcite "{<lejbl�k>}" z REF souboru takto:

\inext{Xcite}{}{++}

\noindent To tedy znamen�, �e se ulo�� do seznamu "\citelistB". Kone�n�
makra "\bbl:b" a "\bbl:c" si dva seznamy "\citelist" a "\citelistB" p�ed svou
�innost� spoj� do seznamu jedin�ho nazvan�ho "\citelist".


\subsec �prava output rutiny
%%%%%%%%%%%%%%%%%%%%%%%%%%%%

M�sto p�vodn�ho makra "\plainoutput" pou��v� OPmac makro \db opmacoutput.

\inext{opmacoutput}{}{++}

OPmac m�n� output rutinu proti origin�ln� "\plainoutput" jen v nejnutn�j��ch v�cech.
�e�� tyto dva probl�my:

\begitems
\item * M�sto p��m�ho "\shipout" nech� nejprve box sestavit jako "\box0",
  pak provede "\protectlist" a pak provede "\shipout\box0".
\item * Mezi "\makeheadline" a "\pagebody" vkl�d� "\prepage".
\enditems

Prvn� �prava zabr�n� expanzi maker p�idan�ch pomoc� "\addprotect" v dob�
pr�ce p��kazu "\shipout", tedy v dob�, kdy expanduj� parametry "\write".
T�mto makr�m je p�id�len prost�ednictv�m \db doprotect "<makro>" 
pro tento okam�ik v�znam "\relax". Je pot�eba je�t�
vysv�tlit, pro� bylo nutn� sestavit nejprve "\box0" a teprve pot� jej poslat
ven pomoc� "\shipout". Je to z toho d�vodu, �e v dob� sestavov�n� "\box0"
jsou expandov�na "\headline" a "\footline" a pro ten p��pad je�t� chceme,
aby v�echna makra spr�vn� expandovala. 

\inext{opmacoutput}{\empty}{+-}

Druh� �prava vkl�d� makro \db prepage, kter� zajist� tisk str�nkov� ��slice
do "\reffile" (to je docela u�ite�n�) a krom� toho nastav� spr�vnou barvu
textu strany pomoc� PDF speci�lu. 

\inext{prepage}{\empty}{+-}

Kdy� budou barvy p�ech�zet na dal�� stranu, jist� nechceme m�t obarvenu
str�nkovou ��slici. Je tedy pot�eba do \db footline vlo�it "\Black". Kdy�
bude u�ivatel m�nit velikost font� v dokumentu, jist� nechce m�t
str�nkovou ��slici poka�d� jinak velkou. Proto je do "\footline" vlo�eno
"\thefontsize". Je nastaveno pevn� na 10pt. P�edpokl�d�me, �e pokud bude
n�kdo cht�t jinak velkou str�nkovou ��slici, jednodu�e si "\footline"
nastav� podle sv�ho. Jinak je "\footline" shodn� s p�vodn�m nastaven�m 
v~plain\TeX{}u.

\inext{footline}{\empty}{+-}


\subsec Okraje
%%%%%%%%%%%%%%

V registrech \db pgwidth a \db pgheight budeme m�t po zavol�n� "\setpagedimens"
���ku a v��ku strany. V~registru \db shiftoffset budeme m�t p��padn� rozd�l
okraj� mezi levou a pravou str�nkou.

\inext{pgwidth}{\empty}{+-}

Makro \db margins "/<typ> <form�t> (<lev�>,<prav�>,<horn�>,<doln�>)<jednotka> " 
si nastav� registry "\pgwidth" a "\pgheight" prost�ednictv�m "\setpagedimens" a d�le v
souladu s u�ivatelskou dokumentac� nastav� pot�ebn� okraje. V makru "\tmp"
je schov�na jednotka, kterou u�ivatel taky m��e zapomenout napsat. V~takov�m
p��pad� vyp��eme varov�n� a dopln�me jednotku "mm". Jakmile m�n�me
"\hoffset" nebo "\voffset", nastav�me je nejprve na "-1in" (t�m se dostaneme
na okraj pap�ru) a pak budeme po�adovanou velikost okraje k t�mto registr�m
p�id�vat. Nemohu za to, �e Knutha napadla takov� ne p��li� poda�en� my�lenka
d�t v�choz� bod sazby kamsi doprost�ed pap�ru um�st�n� pomoc� ujet�ch
jednotek. Za zm�nku stoj� je�t� dv� my�lenky. Makro \db rbmargin
"\h(v)offset\h(v)size{<okraj>}" provede v�po�et hodnoty "\hoffset" nebo
"\voffset" v p��pad�, �e je d�na prot�j�� hodnota okraje ne� je okraj p��mo
nastaviteln� pomoc� "\h(v)offset".
A kone�n� posun okraje p�i p�echodu z prav� na levou str�nku "\shiftoffset"
po��t�me jako "\pgwidth"~"-"~"\hsize"~"-"~"2*<lev�>" co� d� stejnou hodnotu jako
"<prav�>-<lev�>". Zm�na "\hoffset" o tuto hodnotu je provedena v makru
"\pghook", tedy v "\output" rutin�, schov�na do skupiny, tak�e po ukon�en�
"\output" rutiny se vr�t� "\hoffset" na p�vodn� hodnotu.

\inext{margins}{\empty}{+-}

Makro \db setpagedimens "<form�t> " spust� 
\db setpagedimensA "<���ka> <v��ka>/" a k tomu mus� 
dop�edu vyexpandovat obsah makra "\pgs:<form�t>". To provedeme pomoc� t��
"\expandafter".

\inext{setpagedimens}{\empty}{+-}

Jednotliv� "<form�ty>" pap�ru je pot�eba deklarovat.

\inext{sdef}{\empty}{+-}

Makro \db magscale "[<factor>]" zv�t��/zmen�� sazbu nastaven�m 
registru "\mag" a definuje dosud pr�zdn� makro \db trueunit hodnotou 
"true", aby pozd�ji p�i �innosti makra "\setpagedimensA" z�staly zachov�ny
rozm�ry str�nek. Pokud ale je makro "\magscale" spu�t�no a� po nastaven�
velikosti str�nek, jsou tyto velikosti dodate�n� korigov�ny na \uv{true} 
jednotky pomoc� makra \db truedimen.

\inext{trueunit}{\empty}{+-}


\subsec Z�v�r
%%%%%%%%%%%%%

Nakonec pomoc� "\inputref" p�e�teme REF soubor (pokud existuje) a vrhneme se
na zpracov�n� dokumentu, kter� n�m p�ipravil u�ivatel. P�eji dobr� po��zen�. 

\inext{inputref}{\empty}{+-}

\doindex


\bye


