%%  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

\chyph
\def\projectversion{Apr. 2016}
\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} \noactive{\nb empty}

\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{%
   Tu�n� je ozna�ena strana, kde je slovo
   dokumentov�no, pak n�sleduje seznam v�ech stran, na kter�ch se slovo 
   vyskytuje.
   \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}{+-}

OPmac u��v� v makrech pro speci�ln� vlastnosti PDF v�stupu v�hradn�
primitivy pdf\TeX{}u. Lua\TeX{} n�m v roce 2016 p�id�lal starosti, proto�e
p�edefinoval pdf\TeX{}ov� primitivy. Proto p�i detekov�n� nov�ho Lua\TeX{}u
(to pozn�me podle "\pdfextension") nastav�me v�znam primitivu "\pdfoutput"
do p�vodn�ho stavu a d�le, na konci souboru maker (viz
sekci~\ilink[zaver]{\numref[zaver]}), vol�me speci�ln� soubor
"opmac-luatex.tex", kter� nastav� dal�� pdf\TeX{}ov� primitivy podle
p�vodn�ho v�znamu.

\inext {pdfextension}{\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.
Xe\TeX{} sice nen� pdf\TeX, ale po dobu �ten� maker jej za pdf\TeX{} budeme
pova�ovat a na konci �ten� maker (viz sekci~\ilink[zaver]{\numref[zaver]}) 
to sprav�me.

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

Makra \db sdef a \db sxdef umo��uj� pohodln� definovat kontroln� sekvence
ohrani�en� pomoc� "\csname...\endcsname". Stejn� tak \db slet nastav� v�znam
sekvenc� ohrani�en�ch 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.
"\lccode" nastav�me ve skupin�, tak�e po ukon�en� skupiny se vrac� k
v�choz� hodnot�.

\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}{+-}

Makro \db eoldef "\foo#1{<makro>}" pracuje jako "\def", ale parametr "#1" je
separov�n koncem ��dku. Tak�e t�eba

\begtt
\eoldef\foo#1{param={#1}}
\foo tady je parametr
\endtt
expanduje na "param={tady je parametr}". Implementace se op�r� o to, �e
p�i "\eoldef\foo" se definuj� "\foo" a "\\foo:M".
P�itom "\foo" ve skupin� pozm�n� catcode znaku pro konec ��dku a spust�
\db eoldefA "\foo". Toto makro na�te parametr "#2" do konce ��dku (po "^^M"), 
d�le ukon�� skupinu a spust� "\\foo:M{parametr}". Kone�n� 
"\\foo:M" vykon� to, co definoval u�ivatel.

\inext {eoldef}{\empty}{+-}

Makro \db maybebreak "<rozm�r>" umo�n� u�ivateli rozlomit ��dek 
nebo str�nku v m�st� pou�it�. Pomocn� marko \db maybebreakA se spust� po
na�ten� parametru. Zlom se uskute�n�, chyb�-li do konce
��dku/str�nky zhruba m�n� ne� "<rozm�r>" m�sta. Jinak se zlom neuskute�n� a
nestane se nic. Makro je z�visl� na m�du \TeX{}u (vertik�ln�/horizont�ln�). 
Chcete-li j�m l�mat
str�nky, pi�te t�eba "\par\maybebreak3cm". Makro vyu��v� triku, �e p�i�te a
ode�te stejnou hodnotu rozta�itelnosti mezery, tak�e tyto dv� mezery t�sn�
za sebou se (p�i nezlomen� v~"\penalty-130") anuluj�.

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

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}{}{+-}

Podobn� je naprogramov�no makro \db bslash, kter� vytiskne oby�ejn� zp�tn�
lom�tko:

\inext {bslash}{}{+-}

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 {muskip}{}{+-}

Definovan� makra chceme p�i "\write" do souboru nechat v p�vodn�m stavu:

\inext {addprotect}{}{+-}

Makro "\exfont" se vyskytuje v souboru "exchars.tex" z \CS{}plainu.
P��kaz "\addprotect\exfont" zaprotektuje v�echny znaky deklarovan� v tomto
souboru nar�z. Podrobnosti lze nal�zt v uveden�m souboru.

Makro \db replacestrings "{<string1>}{<string2>}" vym�n� v makru "\tmpb"
ve�ker� v�skyty "<string1>" za "<string2>". Pro tento ��el definuje pracovn�
makro \db replacestringsA se separ�torem "<string1>". Jak to pracuje je
uk�z�no na p��kladu n��e.
P�ed spu�t�n�m "\replacestringsA" je t�eba nejprve vyvrhnout obsah "\tmpb"
do vstupn� fronty, pot� prov�st "\def\tmpb{}" a nakonec prov�st
"\replacestringsA". To je ud�l�no pomoc� triku s "\edef\tmpb" a se dv�ma "\expandafter". 
V makru pracujeme s tokeny "!" a "?" kategorie 3, kter� slou�� jako
separ�tory. P�edpokl�d�me, �e takov� nestandardn� tokeny se ve zpracov�van�m 
textu nikdy neobjev�, proto�e vyk�i�n�k a otazn�k maj� norm�ln� kategorii
12.

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

Jak to pracuje si uk�eme na p��kladu "\replacestrings{XX}{YY}", pokud m�me
v "\tmpb" ulo�en t�eba text "ahaXXuffXXkonec". Makro "\replacestringsA" je v
takov�m p��pad� definov�no jako:

\begtt
\def\replacestringsA #1XX#2!{%
   \ifx!#2!\addto\tmpb{#1}\else\addto\tmpb{#1YY}\replacestringsA#2!\fi}%
\endtt
%
a jednotliv� kroky zpracov�n� prob�haj� takto:

\begtt
\replacestringsA ahaXXuffXXkonec?XX!
#1 = "aha" #2 = "uffXXkonec?XX!"
\addto\tmpb{ahaYY}
\replacestringsA uffXXkonec?XX!
#1 = "uff" #2 = "konec?XX!"
\addto\tmpb{uffYY}, tj. \tmpb obsahuje "ahaYYuffYY".
\replacestringsA konec?XX!
#1 = "konec?" #2 = "" (pr�zdn� parametr)
\addto\tmpb{konec?}, tj. \tmpb obsahuje "ahaYYuffYYkonec?" a rekurze kon��.
\endtt
%
D�le se p�edefinuje "\def\replacestrin""gsA#1?{\def\tmpb{#1}}" a provede se

\begtt
\replacestringsA ahaYYuffYYkonec?
#1 = "ahaYYuffYYkonec"
\def\tmpb{ahaYYuffYYkonec}
\endtt
%
tedy t�mto algoritmem odstran�me koncov� otazn�k. Pro� jsme ho tam vlastn�
d�vali? Kdyby tam nebyl, tak by nespr�vn� fungovalo
"\replacestrings{XX}{YY}" p�i "\tmpb" ve tvaru "ahaX".


\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 ptthook
\dgn \nb iiskip
\dgn \nb itemhook
\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 prepghook
\dgn \nb pghook
\dgn \nb toclinehook
\dgn \nb fnotehook
\dgn \nb mnotehook
\dgn \nb captionhook

\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" (tj. je detekov�n dostate�n�
nov� csplain). Pokud ne, upozorn� na nedostupnost vicejazy�n� podpory na
termin�lu a pot�ebn� makra pro fonty si definuje. Je to kopie k�du ze
souboru "csfontsm.tex" z bal��ku \csplain{}.

\inext {regfont}{\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}{+-}

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". Soubor "ams-math.tex" na�teme jen tehdy, kdy� nen� definov�no
"\normalmath". Je toti� mo�n�, �e u�ivatel na�etl matematick� makro je�t�
p�ed zavol�n�m "\input opmac".

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

Po na�ten� souboru "ams-math.tex" disponujeme makry \db regtfm na registraci
r�zn�ch metrik pro r�zn� designovan� velikosti font� a \db whichtfm je
definov�no tak, aby 
expandovalo 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}. 

�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�.
Na ��dku~\cite[typoscale:roundA] je "#1" p�evedeno na "(#1/1000)pt":
��slo 3277sp je $2^{16}/20$sp, tedy 1/20pt. Tato hodnota je nejprve vyn�sobena
"#1" a vyd�lena 50. Pro� bylo ��slo 1000 rozlo�eno na $20\times50$?
Aby nedo�lo k p�ete�en� hodnoty typu dimen p�i velk�m "#1".

\ilabel [typoscale:roundA] {3277sp}

\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 typobase nastav� "\baselineskip" a "\fontdim" podle
\db baselineskipB a \db fontdimB, co� jsou makra, kter� maj� ulo�enu
z�kladn� velikost ��dkov�n� a z�kladn� velikost p�sma.

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

Makro \db em p�ep�n� kontextov� do odpov�daj�c� varianty a ve spolupr�ci s
makry "\additcorr" a "\afteritcorr" 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.
Makro \db afteritcorr se probud� k �innosti na konci skupiny a p�id�
italickou korekci, pokud nen�sleduje te�ka nebo ��rka.

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

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

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

Makro \db fontfam je definov�no v souboru "fontfam.tex". Nen� ��eln� je
zav�d�t p��mo do OPmac, proto�e makro p�e�te tak� rozs�hl� data o fontech,
kter� mohou zbyte�n� zat�ovat pam�, pokud u�ivatel "\fontfam" nikdy
nepou�ije. Tak�e tento makro soubor a data jsou p�e�teny a� p�i prvn�m
pou�it� "\fontfam". Uveden� soubor maker definuje "\fontfam", tak�e na
n�sleduj�c�m ��dku nevid�te ��dnou rekurzi.

\inext {fontfam}{\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}{+-}

Je-li detekov�n m�sto CSplainu e\TeX, nastav�me zna�ky jazyk� dle hodnoty
"\language" v e\TeX{}u:

\inext {uselanguage}{\empty}{+-}

Makro \db isolangset "{<dlouh�-n�zev>}{<iso-zkratka>}" p�i�ad� dloh�mu n�zvu 
jazyka (a souvisej�c� hodnot� registu "\language") jeho
zkratku dle ISO~639-1 p�i pou�it� form�tu generovan�ho z "etex.src". 
Naopak, p�i pou�it� CSplainu makro ned�l� nic, proto�e ISO
zkratky a jejich propojen� na hodnoty "\language" jsou nastaveny 
p��mo v CSplainu.


\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 
pomoc� makra "\openrefA" 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 zavol� \db openrefA, kter� REF soubor 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}{\count=2 ^^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.

Jako prvn� je do REF souboru vlo�en p��kaz \db Xrefversion "{<��slo>}". Pokud
toto "<��slo>" men� rovno \db REFversion, REF soubor se nep�e�te. T�m
je zaru�eno, �e OPmac nezkolabuje p�i �ten� REF souboru kv�li tomu, �e je
zde zmaten� verz�. ��slo verze "\REFversion" zv�t��m o jedni�ku v�dy, kdy� 
v~budouc� verzi OPmac p�id�m nebo uberu v REF souboru n�jakou funkci.

\inext {REFversion}{\empty}{+-}

\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. Ostatn� balast v k�du (kontroluj�c� definovanost
makra "\csname l0:<lejbl�k>\endcsname") je od toho, aby OPmac pohl�dal
p��padn� dvoj� pou�it� stejn�ho "<lejbl�ku>" a upozornil na to.

\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
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Od verze OPmac Jul. 2013 jsou zcela p�epracov�na pomocn� makra pro n�vrh
typografie kapitol, sekc� a podsekc�. Nyn� m� autor typografick�ho n�vrhu
l�pe pod vlastn� kontrolou, co se vkl�d� do vertik�ln�ho seznamu, co� je pro
programov�n� mo�n�ch str�nkov�ch zlom� a nezlom� d�le�it�. 

Autor typografie dokumentu by m�l definovat pro
tisk kapitoly, sekce a podsekce makra "\printchap", "\printsec" a
"\printsecc". Makra maj� jeden parametr "#1", kter� obsahuje text titulku.
Typick� struktura ka�d�ho takov�ho makra je:

\bgroup\def\begtthook{\langleactive}
\begtt
\par 
<penalta obvykle z�porn�, neboli bonus, pro zlomen� str�nky p�ed nadpisem>
<mezera p�ed nadpisem>
{<nastaven� fontu> \noindent \dotocnum{<zna�ka>}#1\nbpar}
<p��padn� vlo�en� zna�ky (insertmark) pro plovouc� z�hlav�>
\nobreak <mezera pod napisem>
\endtt
\par\egroup

Pro realizaci maker "\printchap", "\printsec" a "\printsecc" m��e autor
n�vrhu vyu��t n�sleduj�c�ch intern�ch maker OPmac:

\begitems
\item* "\dotocnum{<zna�ka>}" -- um�st� c�le odkaz�, za��d� obsah, vytiskne "<zna�ku>"
\item* "\thetocnum"  -- "<zna�ka>", nap�. 3.2.4 pro secc, 3.2 pro sec a 3 pro chap
\item* "\insertmark{<text>}" -- vlo�� "\mark" s expandovan�m "\thetocnum" 
        a neexpandovan�m "<textem>"
\item* "\nbpar" -- jako "\par", ale mezi ��dky je nezlomiteln� mezera
\item* "\remskip<velikost>" -- mezera (pod nadpisem) odstraniteln� 
        n�sleduj�c�m "\norempenalty"
\item* "\norempenalty<��slo>" -- vlo�� penaltu "<��slo>" jen pokud nep�edch�z� 
       "\remskip"
\enditems

Aby fungoval obsah a c�le odkaz�, je {\it nutn�\/} pou��t "\dotocnum".
Parametr makra "\dotocnum" nemus� obsahovat jen "\thetocnum", ale tak�
te�ky a mezery kolem "<zna�ky>". P�edch�z�-li "\nonum", makro "\dotocnum"
nevytiskne cel� sv�j druh� prametr, tedy v�etn� p��padn�ho \uv{okol�}
zna�ky. N�vrh tisku sekce m��e vypadat takto:

\begtt
\def\printsec#1{\par
  \norempenalty-500
  \vskip 12pt plus 2pt
  {\secfont \noindent \dotocnum{\thetocnum\quad}#1\nbpar}%
  \placemark{#1}%
  \nobreak \remskip 6pt plus 1pt
}
\endtt
V tomto n�vrhu bude nad nadpisem penalta $-500$ (bonus za zlomen� nad
nadpisem), d�le je "12pt" mezera, pak je titulek "#1" vyti�t�n� fontem
"\secfont". P�ed t�mto titulkem je ��seln� zna�ka odd�len� od titulku
mezerou "\quad". Titulek m��e b�t na v�ce
��dc�ch. Proto�e je ukon�en "\nbpar", nebude povolen mezi jednotliv�mi ��dky
titulku ��dkov� zlom. 

Vysv�tl�me si nyn� na p��kladu �innost a smysl "\remskip" a "\norempenalty".
P�edpokl�dejme pro ilustraci definici "\printsec", jako je uveden� v��e.
Pokud je d�le t�eba definice podsedkce "\printsecc" zah�jena p��kazy 

\begtt
\par \norempenalty-200 \vskip 8pt plus2pt
\endtt
%
pak se mohou d�t tyto v�ci:

\begitems
\item* N�sleduje-li podsekce t�sn� za sekc�, pak se vyma�e spodn� mezera od sekce
  "6pt plus1pt" a m�sto n� se vlo�� mezera "8pt plus2pt". Mezery se tedy
  nes��taj�. Nav�c v tomto p��pad� se nevlo�� penalta $-200$, tak�e mezi
  sekc� a podeskc� nedojde nikdy ke str�nkov�mu zlomu.
\item* N�sleduje-li za sekc� oby�ejn� text, pak je pod sekc� a nad textem mezera
  "6pt plus 1pt", kter� je nezlomiteln�.
\item* P�edch�z�-li p�ed podseskc� oby�ejn� text, pak se vlo�� p�ed nadpisem
  podsekce "\penalty-200" n�sledovan� "\vskip 8pt plus2pt". Tato mezera je
  ochotn� zlomiteln� (bonus $-200$), tak�e se m��e nadpis podsekce objevit na
  n�sleduj�c� stran�.
\enditems

Je mo�n� mezeru pod nadpisem slo�it ze dvou druh�:

\begtt
\def\printsec{%
  ...
  \nobreak \vskip 2pt \remskip 4pt plus1pt}
\endtt

V tomto p��klad� se odstran� p�i n�sleduj�c� podsekci z celkov� mezery 
"6pt plus1pt" jen jej� ��st "4pt plus1pt".

Defaultn� hodnoty maker \db printchap, \db printsec a \db printsecc vypadaj�
v OPmac takto:

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

P��kazem "\firstnoindent" d�vaj� tato makra najevo,
�e n�sleduj�c� odstavec nebude m�t odstavcovou zar�ku.

{\bf Upozorn�n�}: Od verze Apr. 2016 jsou makra "\tit", "\chap", "\sec" a
"\secc" definov�na pomoc� "\eoldef", tedy titulek ve zdrojov�m k�du je
ukon�en koncem ��dku a ne n�sleduj�c�m pr�zdn�m ��dkem. Chcete-li m�t del��
titulek ve zdrojov�m k�du rozd�len do v�ce ��dk�, ukon�ete \uv{pokra�ovac�
��dky} symbolem~"%". 
Pokud chcete makra "\chap", "\sec" atd. pou��t uvnit� vlastn�ch maker,
nelze je pou��t p��mo. M��ete to ale vy�e�it t�eba takto:

\begtt
\def\mymacro#1{... \csname\string\sec:M\endcsname{#1} ...} 
\endtt

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". 

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

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}{+-}

V dal�� ��sti t�to sekce je implementace maker "\chap", "\sec" a "\secc".
Pro ��slov�n� kapitol, sekc� a podsekc� pot�ebujeme ��ta�e a dal�� registry:

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

\inext{newcount}{newcount}{++}

Makro \db notoc je mo�no pou��t jako prefix p�ed "\chap", "\sec", "\secc" s
t�m, �e se kapitola, sekce, podsekce nedostane do obsahu. Makro
\db nonum je mo�not pou��t jako prefix p�ed stejn�mi makry s t�m, �e
kapitola, sekce, podsekce nebude m�t ��slo. I ne��slovan� kapitola se m��e
dostat do obsahu. Je-li obsah klikac�, po�ebuje m�t svoje referen�n� ��slo
pro vytvo�en� linku. K tomu slou�� registr "\nonumnum". 

\inext{notoc}{\empty}{+-}

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. Aktu�ln� ��ta� m� v�dy n�zev \db thetocnum.
S touto hodnotou (naz�visle na tom, zde jde o kapitlu, sekci nebo podsekci,
bude pracovat "\dotocnum". D�le makra p�iprav� obsah makra \db dotocnumafter,
co� je prom�nliv� ��st makra "\dotocnum".
Kone�n� uveden� makra "\chap", "\sec" a "\secc" 
zavolaj� odpov�daj�c� makro "\printchap",
"\printsec" a "\printsecc".

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

V prom�nliv� ��sti makra "\dotocnum", tedy v "\dotocnumafter", se �e��
ulo�en� informac� o kapitole, sekci nebo podsekci do obsahu. K tomu je
vyu�ito makro \db wtotoc "<�rove�><font>{<text>}", kter� vytvo��
\bgroup\def\begtthook{\langleactive}
\begtt
\write\reffile
  {\string\Xtoc{<�rove�>}{<font>}{<expandovan� thetocnum>}{<text>}{\the\pageno}}
\endtt
\par\egroup

\noindent
P�itom "<�rove�>" je ��slo rovn� nule, jedn�-li se o kapitolu, je rovn�
jedn�, jedn�-li se o sekci a je rovno dv�ma, jedn�-li se podsekci.

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

Makro \db wcontents je v k�du ponech�no pro zp�tnou kompatibilitu (ukl�dalo
do REF souboru �daje pro obsah "\Xchap", "\Xsec" a "\Xsecc").
N�kdy v roce 2016 je pravd�podobn� zcela odstran�m.

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

Makro \db dotocnum "{<text>}" um�st� c�l odkazu do m�sta, kter� je od
��a�� vzd�leno o "\destheight". Toto m�sto se kryje s horn� hranou okna
prohl��e�e po kliknut� na odkaz. D�le toto makro vygeneruje data pro obsah
pomoc� p�edp�ipraven�ho "\dotocnumafter".
Pokud p�edch�z� "\notoc", makro nezap��e nic do obsahu. Pokud p�edch�z�
"\nonum", makro nevytiskne sv�j parametr, tak�e je titulek bez ��sla.
D�le v~takov�m p��pad� je pro hyperlinkov� odkazy ��slo "\nonumnum" uvozeno
vyk�i�n�kem, co� navazuje v~obsahu na makro "\toclinkA".

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

V makrech "\chap", "\sec", "\secc" je po zavol�n� "\printchap", "\printsec"
nebo "\printsecc" vol�no \db resetnonunotoc, kter� vr�t� hodnotu p�ep�na��
"\ifnonum" a "\ifnotoc" na imlicitn� hodnoty. T�m je zaru�eno, �e makra
"\nonum" a "\notoc" ovlivn� jen n�sleduj�c� kapitolu, sekci nebo podsekci
a funguj� jako prefixy. Makro nav�c kv�li p�echodu na verzi OPmac Jul. 2013
kontroluje, zda makra "\printchap", "\printsec" a "\printsecc" skute�n�
pou�ila makro "\dotocnum". Pokud ne, n�le�it� na to upozorn�.

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

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 "{<text>}" vlo�� do "\mark" data ve form�tu 
"{<thetocnum>} {<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.

Makro \db remskip "<velikost>" je implimentov�no jako "\vskip<velikost>"
n�sledovan� smluvenou nezlomitelnou penaltou 11333. Makro \db norempenalty
pak podle t�to hodnoty posledn� penalty v seznamu v�tv� svou �innost.
V registru \db remskipamount je ulo�ena naposledy vlo�en� mezera z "\remskip".

\inext{remskip}{\empty}{+-}

Makro \db othe pracuje stejn� jako primitiv "\the" s t�m rozd�lem, �e
nezobraz� nic (a sejme n�sleduj�c� te�ku), pokud je hodnota registru nulov�.
T�mto zp�sobem lze tisnout dokument jen se sekcemi bez kapitol. ��slo
kapitoly se pak nezobrazuje jako "0.", proto�e se nezobrazuje v�bec.

\inext{othe}{\empty}{+-}

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 a vytiskne zah�jen� popisku makrem "\printcaption".
Makro "\caption" t�m kon�� svou �innost a d�le je zpracov�n 
odstavec s~nastaven�mi
"\leftskip", "\rightskip". Sekvence "\par" je p�edefinov�na tak, �e prvn� v�skyt 
"\par" (alias 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 printcaption "{<slovo>}{<��slo>}" vytiskne zah�jen� popisku
tabulky a obr�zku. Za ��slem implicitn� nen� ��dn� interpunkce, jen
"\enspace". Je mo�n� p�edefinovat "\printcaption" s interpunkc� t�eba takto:
"\def\printcaption#1#2{{\bf#1 #2:}\space}"

\inext{printcaption}{\empty}{+-}

P�edefinujeme makro z plain\TeX{}u "\endinsert" tak, �e dop�edu vlo��me
"\par". Pak bude mo�n� t�sn� za odstavec zah�jen� pomoc� "\caption" vkl�dat
"\endinsert". T�ko lze toti� p�esv�d�ovat u�ivatele, aby tam d�val pr�zdn�
��dek.

\inext{endinsert}{\empty}{+-}

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, kter� jsou shodn�, jako parametry 
makra \db Xtoc "<�rove�><info><��slo><text><strana>".

\inext{Xtoc}{}{++}

Makra \db Xchap, \db Xsec a \db Xsecc p�etrv�vaj� v k�du jen pro zp�tnou
kompatibilitu a n�kdy v roce 2016 je odstran�m.

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

Makro \db tocline "{<�rove�>}{<info>}{<��slo>}{<text>}{<strana>}" vytvo��
��dek obsahu. �daj "<�rove�>" je ��slo 0 pro kapitolu, 1 pro
sekci a 2 pro podsekci. �daj "<info>" pou��v� OPmac pro informaci 
o fontu, kter�m se m� tisknout ��dek v obsahu. 
��dek obsahu tiskneme jako odstavec, proto�e "<text>" m��e b�t t�eba
del��. Registr "\leftskip" nastav�me jako sou�in "<�rove�>" 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}{+-}

Makro \db toclinkA je citliv� na vyk�i�n�k jako prvn� znak argumentu. Pokud
tam je, vytiskne jen mezeru velikosti 0.8em, jinak vytiskne argument.
Vyk�i�n�k do argumentu d�me v p��pad� kapitol a sekc� prefixovan�ch
jako "\nonum". V obsahu pak nechceme m�t ��dn� ��slo, jen p��slu�nou mezeru.

\inext{toclinkA}{\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. Nyn� jen
uvedeme, �e "\Xindex" je jen speci�ln� variantou obecn�ho makra 
\db Xindexg p�i "#1=,". Tak�e pracuje s kontroln�mi sekvencemi typu
"\,<heslo>". N�sleduj�c� text popisuje jen tento p��pad. Makro "\Xindexg"
je mo�n� pou��t pro praleln� vytv��en� dal��ch seznam� str�nek
stejn�ch hesel (nap�. seznam vyzna�en� kurz�vou, tu�n� atd.). Jak to ud�lat
je pops�no v OPmac triku 0072.

�daje o stran�ch spojen�ch s rejst��kov�m heslem jsou ukl�d�ny do makra
"\,<heslo>" a jsou rozd�leny do dvou ��st� ve tvaru "{prvni}{druhy}".
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>&". Jsou pou�ita pomocn� makra
\db firstdataA a \db seconddataA.

\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> == <empty> || <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

V makru "\Xindex" pracujeme je�t� se dv�ma pomocn�mi makry 
\db pgfolioA a \db pgfolioB. Pro kladn� str�nky se tato makra chovaj�
stejn�, jako kdyby tam v�bec nebyla. Ov�em v plain\TeX{}u
(viz maro "\folio") se mohou str�nkov� ��slice vyskytnout 
na za��tku dokumentu z�porn�, v takov�m p��pad� se maj� tisknout
��msk�mi ��slicemi. Proto jsou uveden� makra definov�na pon�kud chyt�eji.

\inext{pgfolioA}{\empty}{+-}

\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�ho 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:par] {exhyphenpenalty}

\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 na 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. Toto porovn�n� je prota�eno krz
"\meaning", proto�e nechceme porovn�vat kategorie, ale jen stringy.
Pokud se stringy rovnaj�, m�sto podslova se vlo�� \db
iiemdash, co� je pomlka. Na konci �innosti se
nastav� "\previi" na \db currii (nov� slovo se pro dal�� zpracov�n� st�v�
p�edchoz�m) a vytiskne se 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 "\makeindex" nastavuje na ��dku \cite[mkindex:par] lok�ln� 
parametry sazby odstavce v rejst��ku. Vlevo
budeme m�t "\leftskip" 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�. 

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
p�ed "<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�m
�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�. 

Nejprve p�iprav�me data pro porovn�vac� algoritmus.

\inext{sortingdata}{\empty}{+-}

Mezi jednotliv�mi ��rkami v makru \db sortingdata jsou skupiny znak�, kter�
se z hlediska prvn�ho pr�chodu �adic�m algoritmem nerozli�uj�. Jednotliv�
znaky v "\sortingdata" se rozli�� p�i p��padn�m druh�m pr�chodu. �azen�
znak� v "\sortingdata" odpov�d� po�adovan�mu abecedn�mu �azen�.

D�le je makrem \db setignoredchars vyjmenov�n seznam znak�, kter� se p�i
�azen� zcela ignoruj� (jakoby tam v�bec nebyly). Typicky jde o interpunkci.
Makro nastav� v�em t�mto znak�m pomoc� "\setlccodes" k�d te�ky a tato te�ka
se posl�ze z porovn�van�ho textu odstran�. Seznam znak� je odd�len te�kou a
ukon�en dvojic� "{}{}". Seznam ignorovan�ch znak� odpov�d� pravidl�m �esk�ho
�azen�. Norma doporu�uje sice pro p��pad, kdy se hesla neli�� jinak ne� t�mito znaky, 
nasadit dal�� pr�chod �azen�, ale pro jednoduchost a velkou v�jime�nost
takov� situace toto v OPmac implementov�no nen�.

Makra \db specsortingdatacs a \db specsortingdatask deklaruj� n�hrady p�ed
pou�it�m �adic�ho algoritmu. Jednotiv� n�hrada je deklarov�na jako
"<string1>:<string2>" a je od dal�� deklarace n�hrady odd�lena mezerou.
T�mto zp�sobem jsou implementov�ny sp�e�ky ch, Ch a CH, kter� se nahrazuj�
znaky "^^T", "^^U" a "^^V". Ty vystupuj� v �adic�m algoritmu jako jedin�
znak, a maj� sv� m�sto v makru "\sortingdata" Sloven�tina m� sice dal��
sp�e�ky dz, Dz, DZ, d�, D�, D�, ale ty jsou �azeny t�sn� za D, tak�e jsou
�azeny spr�vn� i za situace, kdy nejsou nahrazeny jedin�m znakem. Nicm�n�,
pokud by n�kdo cht�l tyto sp�e�ky (nap��klad pro o�et�ov�n� v�jimek) pou��t
jako samostatn� znaky, m��e si definovat sv� makro "\sortingdata", kter� by
obsahovalo

\begtt
   ...
   dD\v d\v D,%
   ^^N^^O^^P,%  dz Dz DZ
   ^^Q^^R^^S,%  d� D� D�
   eE\'e\'E\v e\v E,%
   ...
\endtt
a d�le definuje
\begtt
\def\specsortingdatask {ch:^^T Ch:^^U CH:^^V
   dz:^^N Dz:^^O DZ:^^P d\v z:^^Q D\v z:^^R D\v Z:^^S}
\endtt
%
Makra pro sp�e�ky maj� n�zev ve tvaru "\specsortingdata<k�d jazyka>".
Pou�ije se makro odpov�daj�c� jazyku podle nastaven�ho d�len� slov.
Nen�-li makro pro pou�it� jazyk definov�no, ��dn� n�hrady se neprovedou.
Je t�eba upozornit (nap��klad u�ivatele ma�ar�tiny), pokud by se v t�chto
sp�e�k�ch cht�li roz�oupnout, vyhn�te se znak�m "^^I" a "^^M", kter�m
plain\TeX, resp. ini\TeX, nastavuje speci�ln� kategorie.

Implementaci �adic�ho algoritmu zah�j�me makrem \db setprimarysorting, kter�
se spust� jednou p�i sestaven� rejst��ku, p�e�te v��e uveden� data a
p�iprav� odpov�daj�c� datov� stuktury pro prvn� pr�chod �adic�ho algoritmu.
Hlavn� �innost� tohoto makra je, �e p�iprav� "\lccode" znak� vyjmenovan�ch v
"\sortingdata" podle jejich vzestupn�ho po�ad�, p�itom znak�m v jedn�
skupin� (odd�len� ��rkou) p�i�ad� stejn� "\lccode". Text p�ed �azen�m pak
budeme konvertovat pou�it�m "\lowercase".

\inext{setprimarysorting}{\empty}{+-}

Vid�me, �e makro "\setprimarysorting" nejprve expanduje "\sortingdata",
aby se realizovaly znaky typu "\v c" podle nastaven�ho k�dov�n�.
D�l� to jen tehdy, kdy� je definov�no makro "\r", tj. uveden� sekvence pro
akcenty expanduj� na spr�vn� k�dy. Rovn� pomoc� 
"\let"\db asciisorting \unskip"=t"
je mo�n� zabr�nit pou�it� "\sortingdata" a �adic� algoritmus �ad� podle
ASCII.

D�le "\setprimarysorting" p�iprav� makro
\db specsortingdata (bez p��pony jazyka) z makra 
"\specsortingdata<aktu�ln� jazyk>". Nejrve je expanduje a pak pomoc� triku s
"\meaning" za spolur�ce s~makrem \db setprimarysortingA p�evede v�echny znaky 
v makru na kategorii 12, proto�e toto budeme pro �adic� algoritmus pot�ebovat.

Kone�n� se v makru "\setprimarysorting" p�iprav� (za pou�it� opakovan�ho
vol�n� "\act") "\lccode" v�ech znak� zm�n�n�ch v "\sortingdata".
Pov�imneme si, �e pro prvn� pr�chod dostanou stejn� "\lccode" v�echny znaky
ve skupin� mezi ��rkami. 
Je to t�m, �e v makru "\setprimarysorting" se zved� "\tmpnum" jen v m�st�
��rky. 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. 
Makrem "\setignoredchars" se zcela nakonec nastav� ignorovan�m znak�m
"\lccode" te�ky.

Makro \db sortingmessage ukl�d� informaci o pou�it�m "\sortingdata", co�
bude pozd�ji vyps�no na termin�l makrem "\dosorting".

Makro \db setsecondarysorting se vol� opakovan� a p��le�itostn� pro p��pady,
kdy jsou hesla z~hlediska prim�rn�ho �azen� toto�n�. Nastav� jinak "\lccode"
znak�. Tentokr�t maj� v�echny znaky ze "\sortingdata" rozd�ln� "\lccode", ve
vzestupn�m po�ad�.

\inext{setsecondarysorting}{\empty}{+-}

Makro \db preparesorting se vol� (s nastaven�mi parametry podle
"\setprimarysorting") pro ka�d� heslo jednou. Heslo je ulo�eno v n�zvu
kontroln� sekvence, kter� je parametrem makra "\preparesorting". Data pro
prim�rn� �azen� jsou u� p�ipravena na ��dc�ch \cite[mkindex:od] a�
\cite[mkindex:do] v makru "\makeindex". V p��padech, kdy jsou dv� hesla
shodn� z hlediska prim�rn�ho �azen� (to nastane asi velmi v�jime�n�), je pro
danou dvojici hesel znovu zavol�no makro "\preparesorting", tentokr�t s
p�ednastaven�mi daty podle "\setsecondarysorting". Makro "\preparesorting"
m� za �kol ulo�it v�sledek sv� konverze do "\tmpb".

\inext{preparesorting}{\empty}{+-}

V�imneme si, �e "\preparesorting" vykon�v� j�dro sv� �innosti v \db
preparesortingA, kter� p�ebere text hesla extrahovan� do parametru "#3".
Toto makro pomoc� \db preparesortingB opakovan� vol� "\replacestrings", aby
nahradilo sp�e�ky odpov�daj�c�mi n�hradami. D�le pomoc� "\lowercase" provede
konverzi a kone�n� pomoc� "\replacestrings{.}{}" odstran� z hesla nejen
te�ky, ale i znaky vyjmenovan� v makru "\setignoredchars".

P�iprav�me si pomoc� "\newif" makro \db ifAleB, 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. Makro \db sortreturn ukon��
�innost a� po koncov� "\relax" a d�le vykon� sv�j parametr.

\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 }{\empty}{+-}

{\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 obej�t probl�m \uv{dimension too large}.
\enditems 

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

\ilabel[mul:prevgraf]  {prevgraf}

\inext{mullines}{\count=5 ^^B\cbrace}{++}

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 se ned� zm��it jeho
v��ka pomoc� "\dimen0=\ht6". Box samotn� sice m��e b�t vy��� ne� p�t metr�,
ale "\dimen0" nikoli: objev� se chyba \uv{dimension too large}.
Z toho d�vodu je v makrech zavedena prom�nn� \db mullines, kter� pomoc�
p�edefinovan�ho "\par" (na ��dku \cite[mul:prevgraf]) 
po��t� po�et ��dk� sazby. Je-li "\mullines" v�t�� ne�
"\tmpnum" (co� p�i dan�m "\baselineskip" odpov�d� 0,8"\maxdimen"), makro
pracuje, jakoby v��ka boxu 6 byla 0,8"\maxdimen", tedy rozb�hne se
"\splitpart" a "\makecolumns". P�itom makro "\makecolumns" sni�uje hodnotu
"\mullines" o~po�et vyti�t�n�ch ��dk�, tak�e p���t� u� m��e b�t "\mullines"
men�� ne� "\tmpnum". K tomu ur�it� na n�kolika posledn�ch str�nk�ch dojde,
tak�e nakonec "\balancecolumns" pracuje s p�esnou v��kou boxu~6. 

 
\subsec [barvy] Barvy
%%%%%%%%%%%%%%%%%%%%%

A� po verzi OPmac Nov. 2014 byly barvy implementov�ny pomoc� "\pdfliteral"
za pou�it� maker, kter� sama implementuj� "\colorstack" pomoc� REF
souboru. V prosinci 2014 jsem se rozhodl tento k�d z OPmac odstranit a
vyu��t p��mo primitivn� "\pdfcolorstack" (v pdf\TeX{}u od verze 1.40). 
OPmac se tak zbavil asi 30~��dk�
pom�rn� komplikovan�ho k�du a u�et�il mno�stv� z�pis� do REF souboru. Tyto
zm�ny jsou v souladu s~my�lenkou \uv{v jednoduchosti je s�la}. Uveden� rozhodnut� nen�
zcela zp�tn� kompatibiln�, proto�e opou�t� mo�nost samostatn�ho nastaven�
barvy pro tenk� linky a pro text. Domn�v�m se, �e to nevad�, proto�e pokud
u�ivatel pot�ebuje element�rn� manipulaci s barvami, pou�ije s�m p��mo
"\pdfliteral". Makra "\setcmykcolor" se nyn� op�raj� o "\pdfcolorstack" a
nastavuj� oba typy barev spole�n�. Bylo sice mo�n� inicializovat dva
z�sobn�ky barev (pro linky a pro text), ale to by fungovalo jen
v~pdf\TeX{}u. Nikoli v~Xe\TeX{}u. C�lem ov�em je, aby se barvy v pdf\TeX{}u a Xe\TeX{}u
chovaly pokud mo�no stejn�. Nav�c, kdy� u�ivatel nap��e barevn� odmocninu,
mus� m�t oba typy barev zapnuty sou�asn� na stejnou hodnotu, jinak m� v��ko
odmocniny v jin� barv� ne� vodorovnou ��ru. Je tedy i pro u�ivatele
jednodu��� tyto dva typy barev nerozli�ovat.

Makro \db localcolor (na rozd�l od p�edchoz� verze) pouze 
nastavuje "\localcolortrue". Podle \db localcolortrue
resp. \db localcolorfalse se bude v�tvit �innost p�ep�na�� barev, kter�
ukl�daj� aktu�ln� barvu do z�sobn�ku. To je tedy druh� m�rn� odli�nost od star�� verze
OPmac Nov. 2014, kdy makro "\localcolor" p��mo ukl�dalo aktu�ln� barvu do z�sobn�ku
barev, zat�mco p�ep�na�e barev toto ne�e�ily. P�vodn� typick� pou�it� makra
"\localcolor" nen� ve sporu s jeho nov�m v�znamem.

\inext{iflocalcolor}{\empty}{+-}

Makro "\longlocalcolor" d��ve umo��ovalo p�echod barvy na dal�� str�nku,
nyn� je tato vlastnost p��mo �e�ena d�ky "\pdfcolorstack", tak�e net�eba
rozli�ovat mezi "\localcolor" a \db longlocalcolor.
Makro \db linecolor nyn� ned�l� nic, proto�e nerozli�ujeme mezi barvou linek
a barvou textu. V p�vodn� verzi bylo prefixem pro barvy linek.

\inext{backward}{\empty}{+-}

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}{+-}

Makro \db setcmykcolor "{<CMYK barva>}" nastav� po�adovanou barvu. 
Nejprve p�epne makro "\ensureblacko" do aktivn�ho stavu. V tomto stavu makro
setrv� pr�v� tehdy, kdy� je v dokumentu pou�it aspo� jednou p�ep�na� barvy.
D�le makro "\setcmykcolor" nastav� p�i
"\localcolorfalse" barvu p��mo a p�i "\localocolortrue" barvu vlo�� do
z�sobn�ku a pomoc� "\aftergroup" zajist� n�vrat k p�vodn� hodnot�.
Nav�c nastav� na odpov�daj�c� hodnotu makro \db currentcolor.

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

Makro "\currentcolor" je nastaveno na v�choz� hodnotu \db pdfblackcolor

\inext{pdfblackcolor}{currentcolor}{++}

Makro \db ensureblacko "{<sazba>}" je pou�ito pro sazbu z�hlav� a z�pat� ve
v�stupn� rutin� v~makru "\opmacoutput". Implicitn� se "\ensureblacko{<sazba>}" chov�
stejn� jako samotn� "<sazba>", ale po pou�it� p�ep�na�e barvy
"\setcmykcolor" za�ne fungovat jako \db ensureblackoA, co� zajist� bravu
"<sazby>" v~�ern�m. Je to provedeno tak, �e je na za��tku "<sazby>"
alokov�na nov� �rove� z�sobn�ku barev s v�choz� �ernou barvou a na konci
"<sazby>" je tato �rove� z�sobn�ku ukon�ena.

\inext{ensureblacko}{\empty}{+-}

Makra \db colorstackpush "{<CMYK barva>}" a \db colorstackpop implementuj�
pr�ci se z�sobn�kem barev za pou�it� odpov�daj�c�ch \TeX{}ov�ch primitiv�.
Nen�-li p��tomen pdf\TeX{} ve verzi aspo� 1.40, je barva nastavena pomoc�
"\pdfliteral" (co� v komplikovan�j��ch p��padech p�i p�echodu na dal��
str�nky nefunguje spr�vn�), jinak je pou�it "\pdfcolorstack", kter� je
inicializov�n pomoc� "\pdfcolorstackinit". Pov�imn�te si, �e se sou�asn�
pracuje s barvou textu "<c> <m> <y> <k> k" i s barvou tenk�ch linek 
"<c> <m> <y> <k> K". 
Kone�n� makro \db colorstackset "{<CMYK barva>}" nastavuje barvu p��mo s
um�st�n�m t�to bravy na vrchol z�sobn�ku m�sto bravy p�edchoz�.

\inext{pdfcolorstack}{\empty}{+-}

Makra "\colorstackpush", "\colorstackpop" a "\colorstackset" jsou
odpov�daj�c�m zp�sobem p�edefinov�na v souboru "opmac-xetex.tex", aby bylo
mo�n� pracovat s barvami i v Xe\TeX{}u.

P�ep�na�e barev stejn� jako makra "\localcolor" nebo "\longlocalcolor" se
mohou vyskytnout v~nadpise. Tak�e je pot�eba je zabezpe�it proti rozsyp�n�.

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

Nen�-li pou�it pdf\TeX{}, n�kter� makra pro barvu deaktivujeme:

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

Makro \db draft vlo�� do "\prepghook" 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}{}{++}

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}{+-}

Kdy� nen� pou�it pdf\TeX{}, barvy nefunguj�, tak�e makro "\draft" deaktivujeme.

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


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

Makro \db destactive "[<typ>:<lejbl�k>]" 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 prost� vlo�� "\destbox". Makro 
\db destbox "[<typ>:<lejbl�k>]" vytvo�� box nulov� v��ky a z~n�j
vystr�� nahoru c�l klikac�ho odkazu vzd�len� od ��a�� o "\destheight". 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. PDF prohl��e�e v�t�inou  
l�cuj� horn� hranu okna p�esn� s~m�stem c�le, je tedy 
pot�eba c�l um�stit pon�kud v��e, abychom vid�li i odkazovan� text.
K~tomu pr�v� slou�� obsah makra \db destheight.

\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.

N�kdy je ��eln� v re�imu \uv{draft} dokumentu tisknout v m�st� c�l� odkaz�
jm�na lejbl�k�, aby autor vid�l, jak� lejbl�ky pou�il a l�pe se mu d�lo
modifikovalo. Sta�� p�edefinovat pro tento re�im makro
"\destbox" t�eba takto:

\begtt
\def\destbox[#1#2:#3]{\vbox to0pt{\kern-\destheight
   \pdfdest name{#1#2:#3} xyz\relax
   \if#1r\llap{\labelfont[\detokenize\expandafter{#3}]}\vss \else 
   \if#1c\vss\llap{\labelfont[\detokenize\expandafter{\tmpb}] }\kern-\prevdepth
   \else \vss \fi\fi}}
\def\labelfont{\localcolor\Red\tt\thefontsize[10]}
\endtt

P�i tomto �e�en� budou lejbl�ky z "\label" ti�t�ny nahoru v m�st� c�le
zat�mco lejbl�ky z~"\bib" a "\bibitem" budou ti�t�ny vedle polo�ky se seznamem
literatury. V obou p��padech budou lejbl�ky zelen� a d�ky "\llap" neovlivn�
polohu ostatn� sazby. 

Klikac� text vytvo�� makro \db linkactive "[<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. K pou�it� je p�ipraveno makro
\db link, kter� dostane hodnotu "\linkactive" p�i "\hyperlinks", jinak pouze
p�ep��e sv�j argument.

\inext{link}{\empty}{+-}

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".
Toto makro vytvo�� extern� odkaz. Je pou�ito v~makru "\url" 
prost�ednictv�m makra "\ulink".

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

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. Zde je tak� definov�no makro \db urlcolor.

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

Makro "\toclink" �te parametr ve from�tu \uv{��slo kapitoly, sekce,
kapitoly.sekce atd.}.
Makro "\pglink" zase vy�aduje sv�j parametr jen jako ��slo strany. Kdy� je dokument
rozd�len do blok� a v~ka�d�m je samostatn� ��slov�n� stran, respektive bloky
obsahuj� samostatn� ��slov�n� sekc�, je pot�eba rozli�it mezi t�mito bloky,
aby intern� odkaz p�i "\hyperlinks" v dokumentu byl jednozna�n�. Proto 
jsou zavedena (implicitn� pr�zdn�) makra \db tocilabel a \db pgilabel.
Ka�d� blok v dokumentu by pak m�l m�t sv�j vlastn� "\tocilabel" a
"\pgilabel" o co� se mus� program�tor maker postarat s�m.


\inext{tocilabel}{}{+-}

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 "attr" "/Border[0 0 0]", pokud nen� kontroln� sekvence 
"\<typ>border" definov�na. Jinak expanduje na "arrt" "/Border[0 0 .6]" a 
"/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}{+-}

Makro \db url "{<text>}" se pou��v� k tisku URL. Vytiskne "<text>" fontem
\db urlfont, p�itom kolem znak� lom�tko, te�ka a dal��ch p�id�v� nulovou
mezeru s dodate�nou m�rnou rozta�itelnost� \db urlskip. Mezera vpravo od
t�chto znak� je nav�c zlomiteln� s penaltou definovanou v makru \db
urlbskip. Dvojit� lom�tko \db urlslashslash m� zlomitelnou mezeru jen na
konci. Makro "\|" je lok�ln� definov�no jako pr�zdn�, ale p�i "\urlfont"
nab�v� hodnoty \db urlspecchar. Tak�e ve skute�n�m odkaze se neprojev�, ale
p�i tisku ano. U�ivatel si m��e "\urlspecchar" definovat dle sv�ch p�edstav
(nap��klad jako "\hfil\break").

\inext{url}{\empty}{+-}
   
Makro "\url{<text>}" pracuje tak, �e ulo�� "<text>" do "\tmpb" a nech�
vym�nit p��slu�n� znaky uvnit� "\tmpb" pomoc� "\replacestrings".
Nakonec vytiskne "<text>" prost�ednictv�m "\ulink".

Aktivn� vlnku lze v "<textu>" vym�nit za "\char`\~". Podobn� lze �e�it
n�kter� dal�� znaky, ale ne v�echny: procento, backlash.
U t�chto znak� bychom nejprve museli vym�nit jejich
kategorie. Pak by ale makro "\url" nefungovalo uvnit� parametr� jin�ch
maker. V z�jmu jednoduchosti makra "\url" to ned�l�me. Tak�e pokud u�ivatel
m� v URL znak procento, mus� ps�t "\%"
nebo si zm�n� kategorie s�m. Podobn� pozn�mka plat� pro znaky "{", "}", "\",
"#" a "$".  %$


\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�>}{<info>}{<��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�>}{<info>}{<��slo>}{<text>}{<strana>}"
vkl�d�me polo�ku obsahu do z�lo�ek. 
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 outlinesC "{<�rove�>}{<lejbl�k>}{<minus>}{<potomci>}{<text>}"
kone�n� zavol� primitivn� 
"\pdfoutline goto name{<lejbl�k>} count<minus><potomci> {<text>}".
a vytvo�� lejbl�k v dan� �rovni zano�en� na
z�klad� p�edpo��tan�ho �daje "<potomci>", kter� obsahuje po�et potomk� pr�v�
vkl�dan� z�lo�ky. �daj "<minus>" je (po expanzi)
pr�zdn�, pokud nechceme m�t potomky skryt� a obsahuje znak minus, pokud
chceme m�t potomky ve v�choz�m stavu skryt�. 
P�ipom�n�m, �e v makru \db outlinelevel
m�me makrem "\outlines" p�ipravenu �rove� rozev�en�, kterou si u�ivatel
p�eje. Makro "\outlinesC" je p�ipraveno k
p�edefinov�n� v modulu "opmac-xetex.tex", kter� pro vytvo�en� z�lo�ek
pou��v� "\special" a nepot�ebuje zn�t �daj "<potomci>". P��slu�n� "\special" 
vyu�ije p��mo �daj "<�rove�>".

\inext{outlinesC}{}{+-}

Makro \db setcnvcodesA zkontroluje, zda je u�ivatelem definov�no makro
"\toasciidata<iso-k�d>". Pokud je, pou�ije ho jako "\toasciidata" ke
konverzi akcentovan�ch znak� na neakcentovan�. Jinak 
podle definovanosti "\r" zkontroluje, zda je zapnut�
"\csaccents" a pokud je, expanduje intern� "\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. Jako lejbl�k je pou�ito
"oul:<oulnum>", kde \db oulnum pr�b�n� zv�t�ujeme o jedni�ku.

\inext{oulnum}{\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 printttline vytiskne ��slo ��dku.

\inext{printttline}{\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. Do sekvenc� \db savedttchar a \db savedttcharc
je ulo�ena ASCII hodnota znaku a jeho p�vodn� kategorie.

\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 vlo�� p�e�ten� ��dek do "\tmpb". Nakonec se "\tmpb" vytiskne stejn�m
zp�sobem, jako p�i p�e�ten� textu makrem "\begtt".

\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\tabstrutA 
      &\tabiteml\hfil#\unsskip\tabitemr \vrule\kern\vvkern\vrule\tabstrutA 
      &\tabiteml\hfil#\unsskip\hfil\tabitemr\tabstrutA
      &\tabiteml#\unsskip\hfil\tabitemr\vrule\tabstrutA
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##\unskip\tabstrutA}\hss\enskip
}
\Pwidth=3cm \table{|c|P|}{\crl \tskip3pt
   aaa & Tady je del�� text�k, kter� se nevejde na ��dek. \crl \tskip3pt
   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. Makro \db crlli sest�v� ze dvou "\crli"
odd�len�ch od sebe vertik�ln� mezerou vlo�enou pomoc� "\noalign".

\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�� "\hbox{\vrule<vnit�ek>\vrule}".
Uvnit� tohoto boxu se nach�z� "\vtop{<dal��>\kern\vvkern\hrule}", tak�e "<dal��>"
z�st�v� na ��a��. P�itom "<dal��>" je "\vbox{\hrule\kern\vvkern<dal��2>}",
tak�e "<dal��2>" z�st�v� na ��a��. V tuto chv�li jsou ji� vytvo�eny ��ry
vlevo, vravo, naho�e i dole. Kone�n� "<dal��2>" je
"\hbox{\kern\hhkern<text>\kern\hhkern}".

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


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

Nejprve deklarujeme \db picwidth a \db picheight. Z d�vodu zp�tn�
kompatibility je d�le ztoto�n�n "\picwidth" se sekvenc� \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.

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

Makro \db inspicpage m��e p�i nata�en� PDF obsahovat text "page<number>".
Pak se jako obr�zek pou�ije odpov�daj�c� strana PDF dokumentu.


\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}{+-}

Makro \db runningfnotes vypne lok�ln� ��slov�n� pozn�mek na ka�d� str�nce.
M�sto toho se budou pozn�mky ��slovat podle registru "\fnotenum". Ten se
zv�t�uje o jedni�ku v cel�m dokumentu. Chcete-li m�t pozn�mky ��slovan�
zvlṻ nap��klad v ka�d� kapitole, je nutno nav�c resetovat tento ��ta�
nap��klad pomoc� "\addto\chaphook{\global\fnotenum=0}". 

\inext{runningfnotes}{\empty}{+-}

Registr \db mnotenum. 
glob�ln� ��sluje okrajov� pozn�mky a pln� podobnou funkci, jako registr
"\fnotenum" pro pod��rov� pozn�mky. Registr \db mnoteskip ud�v� hodnotu
vertik�ln�ho posunu 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>" definuje intern� makro \db mnotesfixed
s obsahem "\left" nebo "\right" podle p��n� u�ivatele. Makro "\mnoteA" se
pak na definovanost "\mnotesfixed" pt� a pokud je definovan�, nepou�ije
�daje p�e�ten� ze souboru.

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


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

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

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

Makro \db cite "[<lejbl�k1>,<lejbl�k2>,...]" si opakovan� zavol� 
"\citeA<lejbl�k-i>", kde se p�iprav� ��sla citovan�ch publikac� do
lok�ln� tvo�en�ho seznamu "\savedcites". Pot� zavol� "\printsavedcites",
kter� lok�ln� tvo�en� seznam ��sel vytiskne. Krom� toho makro "\citeA" ud�l�
plno dal��ch pot�ebn�ch v�c�, jak uvid�me za chv�li.
Makro \db nocite se chov� jako "\cite" a� na to, �e se nic netiskne.
Makro \db rcite vytiskne ��sla publikac�, ale bez hranat�ch z�vorek kolem.
Makro \db savedcites je glob�ln� pr�zdn� a zapln� se v�dy znovu uvnit�
skupiny vymezen� makrem "\cite" nebo "\nocite" nebo "\rcite".

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

Makro \db citeA "<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,
  p�id� obsah tohoto makra (co� je ��slo citovan�ho z�znamu) 
  do "\savedcites". Pokud ne, p�id� do
  "\savedcites" otazn�k a na termin�l vyp��e varov�n�.
  Kontroln� sekvence "\csname bib:<lejbl�k>\endcsname" bude obsahovat
  "<��slo citace>" 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 "\citeA" je naprogramov�no zhruba takto

\def\begtthook{\langleactive}
\begtt
function citeA(<lejbl�k>) {
  if (<lejbl�k> == '*') { <zapi� do> \citelist '*'; return; }
  if (\bib:<lejbl�k> == nedef) {
    <p�idej do> \citelist <lejbl�k>;
    <na termin�l:> "Warning, cite [label] unknown";
    <p�idej do> \savedcites "?,";
    <lok�ln� vypni t��d�n� a zkracov�n� seznamu> \savedcites;
    \bib:<lejbl�k> = empty;
    return;
  if (\bib:<lejbl�k> == empty) {
    <p�idej do> \savedcites "?,";
    <lok�ln� vypni t��d�n� a zkracov�n� seznamu> \savedcites;
    return;
  }
  if (\bib:<lejbl�k> kon�� znakem '&') {
    <p�idej do> \citelist <lejbl�k>;
    <odstra� znak & z obsahu makra> \bib:<lejbl�k>;
  }
  <p�idej do> \savedcites <expandovan�> "\bib:<lejbl�k>,";  
} 
\endtt

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
nedeklarovan� "<lejbl�k>" pozd�ji znovu pozn�me podle toho, �e m� makro 
"\bib:<lejbl�k>" 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{citeA}{^^B\cbrace}{++}

Makro sn�m� sv�j parametr jako "#1#2," aby mohly b�t "<lejbl�ky>" odd�leny
p�ed ��rkou mezerou, kter� je neseparovan�m parametrem "#1" ignorov�na.
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�.

Makro \db printsavedcites p��padn� set��d� seznam "\savedcites" 
podle velikosti zavol�n�m "\sortcitesA" 
a d�le opakovan� na jednotliv� prvky seznamu zavol� makro
"\citeB", kter� prvky seznamu vytiskne a p��padn� je zkr�t� pomoc� interval�
(m�sto "3,4,5" p��e "3--5"). Pomocnou prom�nnou "\tmpb" vyu�ije makro
"\citeB", jak uvid�me pozd�ji p�i v�kladu tohoto makra.

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

Makro \db sortcitesA se�ad� seznam "\savedcites" podle velikosti. Tak�e t�eba
"4,7,3,5," se prom�n� na "3,4,5,7,". Implicitn� je definov�no jako pr�zdn�
makro, tak�e �azen� se neprovede. Nicm�n� u�ivatel ho pou�it�m makra
\db sortcitations v~hlavi�ce sv�ho dokumentu probud� k �ivotu.

O�iven� "\sortcitesA" nejprve vyvrhne do �tec� fronty obsah "\savedcites"
ukon�en� dal�� ��rkou (m�me zde dv� ��rky vedle sebe) a n�sledn� spust� \db
sortcitesB, kter� postupn� odeb�r� jednotliv� prvky ze �tec� fronty, p�ed�v�
je do nov� tvo�en�ho set��d�n�ho seznamu, kam je vkl�d� na spr�vn� m�sto.
V�choz� hodnota nov� tvo�en�ho seznamu obsahuje ��slo "300000", kter� bude
v�dy na konci seznamu, proto�e se p�edpokl�d� v�t�� ne� jak�koli t��d�n�
prvek. Zaj�mav� trik s "\edef\savedcites{...\expandafter}" zp�sob�, �e se
"\savedcites" nejprve vyvrhne (po aplikaci dvou "\expandafter") do �tec�
fronty a teprve pot� dostane novou hodnotu pomoc� "\edef". Na konci makra
"\sortcitesA" ze seznamu odebereme koncov� ��slo "300000".

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

Vlo�en� prvku do zat��d�n�ho seznamu prob�h� pomoc� \db sortcitesC, co� je
makro, kter� nov� tvo�en� seznam, kter� je nyn� tak� vyvr�en ve �tec�
front�, projde zleva doprava, dokud nenaraz� na ��slo v�t�� ne� vkl�dan�.
P�i t� �innosti opakovan� sb�r� hodnoty a vkl�d� je zp�t do "\savedcites".
Je-li za�azovan� prvek "\tmpa" men�� ne� odebran� prvek z fronty, vlo�� se
pomoc� \db sortcitesD do "\savedcites" p�vodn� "\savedcites" n�sledovan�
"\tmpa" n�sledovan� testovan�m prvkem n�sledovan� zbytkem vstupn�
fronty (a� po "\end").

\inext{sortcitesC}{\empty}{+-}

Makro \db citeB "<polo�ka>," ukon�� �innost p�i pr�zdn�m parametru,
jinak se po vyti�t�n� "<polo�ky>" zavol� znova.
Vytiskne dva otazn�ky, je-li parametrem otazn�k, 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 "\citeB".

\inext{citeB}{\empty}{+-}

�innost "\cite" je kone�n� zavr�ena vol�n�m maker
\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� uprav� separ�tor \db citesep, kter� je glob�ln� a tedy na za��tku
�innosti "\cite" pr�zdn�. P�i opakovan�m vol�n� "\printcite" se tedy
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}{+-}

P�i pou�it� \db nonumcitations potla��me p��padn� p�edchoz�
"\shortcitations" a "\sortcitations" a d�le nastav�me \db citelinkA
na jinou, ne� implicitn� pr�zdnou hodnotu. Makro "\citelinkA" vytiskne 
"\bim:<��slo citace>", tedy zna�ku citace (je to nastaveno v "\Xbib").
Nen�-li zna�ka citace zn�m�, vyp��eme varov�n� a tiskneme "<��slo citace>".
Makro \db etalchar je pot�ebn� p�i pou�it� Bib\TeX{}ov�ho stylu "alpha".

\inext{nonumcitations}{\empty}{+-}

Makro \db ecite "[<lejbl�k>]{<text>}" nejprve provede 
"\citeA#1,,,", tedy vlastn� "\nocite[<lejbl�k>]" a pak si 
\db eciteB vyzvedne ze "\savedcites"
prvn� �daj p�ed ��rkou, tedy "<��slo citace>", a ulo�� do "#1". V~"#2" je p��padn� zbytek ze
"\savedcites" a d�le v "#3" pokra�uje "<text>". Makro vytiskne jen
"<text>", kdy� je odkaz nedefinov�n, jinak vytiskne "<text>" prost�ednictv�m
makra "\citelink".

\inext{ecite}{\empty}{+-}

N�sleduje k�d makra \db bib "[<lejbl�k>]". Nejprve je o�et�eno, zda je pou�it
zkr�cen� nebo roz���en� z�pis "\bib[<lejbl�k>] = {<zna�ka>}". P��padn�
mezera p�ed rovn�tkem je odstan�na pomoc� triku s~"\rommannumeral", kter�
p�i z�porn�m ��sle expanduje na pr�zdn� v�sledek, ale p��padn� mezera za "`\." p�i
skenov�n� tohoto ��sla je poz�ena.
P�i zkr�cen�m z�pisu makra "\bib" (bez rovn�tka)
se zavol� "\bibB" s pr�zdn�m "\bibmark", v druh�m p��pad� se
"\bibmark" nejprve napln� prost�ednictv�m makra \db bibA.
Makro \db bibB vlo�� prost�ednictv�m
\db wbib "{<lejbl�k>}{<��slo citace>}{<zna�ka>}" do REF souboru propojen� �daje o
tom, jak� m� "<lejbl�k>" p�i�azeno "<��slo citace>" v seznamu literatury.
Makro "\tmpb" je napln�no "<lejbl�kem>" pro p��padn� pou�it� v "\dest" (p�i
draft m�du) nebo pro pou�it� v makru "\printbib".
Makro "\wbib" p�ipoj� p�ed "\wref" p��kaz "\immediate", aby byly zaps�ny
do REF souboru aktu�ln� hodnoty parametr�.

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

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{<��slo citace>}&".
D�le definuje "\bim:<��slo citace>" jako t�et� parametr, kter� je p�i pou�it� 
"\bib" pr�zdn�, ale p�i �ten� "*.bbl" souboru vygenerovan�ho pomoc� 
"alpha.bst" nebo "apalike.bst" tam bude ulo�ena "<zna�ka>". D�le "\Xbib"
definuje \db lastbibnum jako "<��slo citace>", tak�e po p�e�ten� REF souboru
obsahuje nejv�t�� pou�it� "<��slo citace>". To se m��e hodit, pokud design�r
chce odsadit seznam literatury podle ���ky nejv�t��ho ��sla citace. 

\inext{Xbib}{\empty}{+-}

Makro \db printbib se vlo�� na za��tek ka�d�ho z�znamu v seznamu literatury.
Implicitn� vytiskne "\the\bibnum" v hranat� z�vorce a p�i "\nonumcitations"
netiskne nic. V obou p��padech nastav� odsazen� druh�ho a dal��ch ��dk� 
odstavce na "\iindent". Design�r si m��e toto makro p�edefinovat dle sv�ho
uv�en�.

\inext{printbib}{\empty}{+-}

Makro \db addcitelist "{<lejbl�k>}" p�id� do \db citelist �daj ve tvaru
\db citeI "[<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 "\usebibtex" 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��e 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>}{<��slo citace>}{<zna�ka>}".
Makro "\tmpb" je napln�no "<lejbl�kem>" pro p��padn� pou�it� v "\dest" (p�i
draft m�du) nebo pro pou�it� v makru "\printbib".
\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 "\citeI[<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".

Makro \db usebib je definov�no v souboru maker (modulu) "opmac-bib.tex".
Tuto sadu maker nen� ��eln� zahrnout p��mo do OPmac, proto�e je z�visl� na
extern�m bal��ku "librarian.tex". Soubor maker tedy zav�d�me a� v p��pad�, �e
u�ivatel skute�n� pou�il makro "\usebib". Je pou�it stejn� trik, jako 
v~p��pad� makra "\fontfam".

\inext{usebib}{}{++}

U�ivatel nicm�n� m��e makro soubor na za��tku sv�ho dokumentu volat
explicitn� pomoc� "\input opmac-bib".


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

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

\begitems
\item * M�sto p��m�ho "\shipout" nech� nejprve box sestavit jako "\box0",
  pak provede "\protectlist" a pak provede "\shipout\box0". T�m jsou
  zabezpe�eny tzv. protektovan� p��kazy p�i "\write".
\item * Pomoc� "\ensureblacko" jsou �e�eny barvy z�hlav�, z�pat�, "\topins"
  a "\footins".
\item * Je vlo�en "\pghook" po sestaven� box�, ale p�ed
  "\shipout". Implicitn� je "\pghook" pr�zdn�. 
  M�n� jej makro "\margins" pro ��ely pravolev�ho st��d�n� okraj�.
\item * Makro "\pagecontents" obsahuje nav�c "\prepage" (kv�li odkaz�m na str�nku).
\enditems

M�sto p�vodn�ho makra "\plainoutput" pou��v� OPmac makro "\opmacoutput",
kter� je obklopeno makry "\begoutput" a "\endoutput". Makro \db begoutput
zap��e do REF souboru �daj o ��sle strany a p�edefinuje makra, kter� se
mohou vyskytnout v z�hlav� �i z�pat� str�nky, pokud od nich chceme, aby 
se chovaly jinak ne� obvykle. Makro \db endoutput je pr�zdn� a je ur�eno 
pro str��ka P��hodu. Makro \db prephoffset je rovn� implictn� pr�zdn�,
spou�t� se v "\begoutput" a m��e v n�m b�t nastaveno st��d�n�
okraj� pro lich� a sud� str�nky, viz t� makro "\margins".

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

Makro \db opmacoutput se chov� analogicky, jako "\plainoutput". Rozd�l je v
tom, �e nejprve sestav� celou stranu do boxu0 a v t� dob� expanduj� makra v
"\headline" a "\footline". Pak spust� "\pghook" a
"\protectlist". Makro "\protectlist" nastav� d�ky \db doprotect kontroln� sekvence
ozna�en� jako "\addprotect<sekvence>" na "\relax", tak�e b�hem "\shipout" (tedy
b�hem expanze z�znam� "\write") se nebudou expandovat.
Dal�� �innost je zcela shodn� s �innost� makra "\plainoutput".

\inext{opmacoutput}{doprotect}{++}

Barvy jsou v textu nastaveny pomoc� "\pdfcolorstack", tak�e na za��tku
n�sleduj�c� strany za��n� barva, kter� skon�ila na stran� p�edchoz�. 
My ale nechceme, aby
barva textu ovlivnila barvu z�hlav� a z�pat�. Proto je sazba "\makeheadline"
a "\makefootline" realizov�na pomoc� makra "\ensureblacko". 

Makro \db prepage se spust� na za��tku "\pagecontents" a zajist� ulo�en�
c�le pro odskok podle ��sla strany. Makra \db preboxcclv a \db postboxcclv
se spust� na za��tku a na konci sazby boxu~255, jsou pr�zdn� a z�st�vaj� v
k�du pro zachov�n� zp�tn� kompatibility.

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

OPmac p�edefinov�v� makro \db pagecontents z plain\TeX{}u tak, �e p�id�v�
makra "\prepage", "\preboxcclv" a "\postboxcclv". Tak� obsah box� "\topins"
a "\footins" tiskne pomoc� "\ensureblacko".

\inext{catcode}{\empty}{+-}

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}{+-}

Makro \db Xpage z REF souboru nastavuje \db lastpage a "\fnotenumlocal".
S t�mito registry tak� spolupracuj� makra "\Xlabel", "\Xmnote" a "\Xfnote".
 
\inext{lastpage}{\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 setpagedimensB "(<���ka>,<v��ka>)<jednotka> ", pokud je prvn�m znakem
"<form�tu>" z�vorka, jinak spust� \db setpagedimensA, co� je makro, kter�
pou�ije definovan� form�t, ten expanduje a zavol� "\setpagedimensB". Pomocn�
makro \db setpagedimensC "<reg>=<num>:<jednotka>" p�i�ad� do "<reg>" dan�
rozm�r.

\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 [zaver] Z�v�r
%%%%%%%%%%%%%%%%%%%%%

V p��pad�, �e je pou�it Xe\TeX, na�teme dodate�n� makra
ze souboru "opmac-xetex.tex". Tato makra nahrazuj� n�kter� makra z OPmac
Xe\TeX-specifickou variantou nebo emuluj� pdf\TeX{}ov� primitivy.
V p��pad�, �e je pou�it nov� LuaTeX, na�teme makra "opmac-luatex.tex", kter�
rekonstruuj� pdf\TeX{}ov� primitivy dle p�vodn�ho v�znamu.
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{version}{\empty}{+-}

\doindex


\bye
