\ifnum \catcode37=13 \relax \else\def\edefverb{}\fi
% \if 1\autodocmanual \expandafter\ifx\csname skipsrc\endcsname \relax
% \kniha{Dokumentační systém \MDef}{}{Martin Manďák} \else \newpage \fi
% \obsahknihy \section{Definiční soubor maker MDef} \vskip0pt\defverb
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%                                                                          %%
%%  Kodovani:     $Enc: win1250$                                            %%
%%  mdef.tex:     definiční soubor maker MDef                               %%
%%  verze:        2.0                                                       %%
%%  autor:        Martin Manďák (martin@mandak.net, http://www.mandak.net)  %%
%%  TeX system:   plainTeX a odvozené systémy                               %%
%%                                                                          %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%                                                                          %%
%%  Tento soubor maker vznikl při tvorbě dokumentace k projektu Stabilita   %%
%%  letounu. Makra z něj můžete libovolně šířit, používat a modifikovat     %%
%%  jen s podmínkou, že bude ve Vašem dokumentu uveden autor tohoto         %%
%%  souboru maker stejně jako každý, kdo a kdy provedl nějakou změnu.       %%
%%                                                                          %%
%%  Soubor je schopen sám sebe dokumentovat spuštěním dávky                 %%
%%                          csplain mdef.tex                                %%
%%                      nebo pdfcsplain mdef.tex                            %%
%%  Další informace zjistíte nejlépe z takto vzniklé dokumentace...         %%
%%                                                                          %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\edefverb \def\nic{0}
%\def\nic{1}
\if 1\nic
 \hyphenation{} \vskip 6pt
 Tato sbírka maker
 tvoří ucelený systém pro vytváření dokumentace. Je napsána
 takovým způsobem, že umožňuje \uv{dokumentovat sama sebe}.
 Vznikla z důvodu zbytečné komplikovanosti systému \LaTeX, který sice
 má velké možnosti přizpůsobení, ale působí značně těžkopádným
 dojmem, mnoho úprav podle mých představ by znamenalo třeba i zásahy do
 samotného zdroje \LaTeX u nebo instalaci balíků, které často dělají
 spoustu věcí, které vůbec nepotřebuji a zbytečně tak zabírají místo v
 paměti, zpomalují zpracování dokumentu a ztěžují hledání případných chyb.
 \par
 Jako řešení tohoto problému jsem zvolil napsání vlastní sady maker
 v plain\TeX u, která
 jsou snadno přizpůsobitelná mým požadavkům jejich přímou úpravou
 (na rozdíl od \LaTeX u zde vždy vím, co dělám).
 Vygenerováním této dokumentace jste dostali návod,
 jak používat zde definovaná makra, ale i vysvětlující komentář, z nějž
 by mělo být zřejmé, co a jak upravit, abyste získali vlastní požadovaný
 vzhled dokumentu.
 Pokud budete mít vlastní specifické požadavky, pak vám tento můj výtvor
 snad přijde vhod jako studijní materiál pro vytvoření vlastních maker.
 \par
 Pokud budete mít jakékoliv dotazy nebo připomínky k tomuto souboru
 maker nebo i obecně k \TeX u, můžete mě kontaktovat na emailové adrese
 \mailodkaz{martin@mandak.net}{martin@mandak.net}.
 Nové verze a informace k tomuto i jiným programům naleznete na adrese
 \httpodkaz{www.mandak.net}{http://www.mandak.net}.
 Současná dokumentace odpovídá stavu před implementací pdf odkazů.
 \subsection{Co je zahrnuto}
  Zde uvádím stručný seznam možností tohoto balíku maker:
   \begitem
     \item Dělení dokumentu na knihy, 5 úrovní kapitol
     \item 3 úrovně odrážek nebo číslovaných seznamů
     \item číslované rovnice, obrázky a tabulky
     \item verbatim prostředí v několika verzích, vkládání
           dokumentovaného C++ nebo Tcl souboru
     \item generování několika typů obsahů
     \item vkládání poznámek, různé značky k různým účelům (viz.
           kapitolu \secref{DocOstPrik})
     \item křížové reference na knihu, kapitolu, rovnici, stránku, obrázek,
           tabuku
     \item všechny odkazy jsou při kompilaci pdf\TeX em funkční (od \MDef
           verze 2, dokumenty napsané pro starší verzi stačí překompilovat
           s novou verzí maker)
   \enditem
  Do budoucna:
   \begitem
    \item načtení obsahu vždy na začátku dokumentu kvůli pdf outlinům.
          Momentálně se načítá jen při obsahu, takže pokud by obsah
          byl na konci dokumentace, outlinky by asi byly 1rozměrné\dots
    \item Dodělat reference mezi různými objekty definované uživatelem.
          Pro odkazy na sekci již jsou, ale jen pro počítání s bookno,
          samostatné byly rozladěny a momentálně by asi způsobovaly chybu.
   \enditem

\subsection{Dokumentační platforma}

Protože tento dokumentační systém je součástí multiplatformního projektu,
věnoval jsem zpracování dokumentace velkou pozornost.
Vzhledem k univerzálnosti byla vybrána jako
primární platforma pro dokumentaci systém \TeX , který poskytuje
špičkové výstupy v oblastech publikace především matematiky. Jeho velkou
předností je, že výstup je dvi nebo postscript (ideální pro tisk),
ale především dnes už také pdf jako dnes asi nejuniverzálnější
formát pro dokumentaci
přenášenou mezi platformami při dokonalém zachování formátování
všech grafických prvků i kódování národních znakových sad.
Výhoda \TeX u je také možnost algoritmizovat zpracování zdrojových
textů, čehož jsem s výhodou využili při naprogramování zpracování
dokumentace vepsané přímo do zdrojového C++ kódu.

Další potenciální alternativní výstupy  generované ze zdrojových
kódů \TeX u předpoládám xml resp. html, unixové manuálové stránky,
případně help soubor pro MS Windows.
Vzhledem k co nejsnadnějšímu přizpůsobení vzhledu a konverzím
dokumentace jsem zamítl připravené dokumentační formáty jako
\LaTeX, protože při komplikovanějším přizpůsobování použitých stylů
nám vyšlo jako jednodušší vytvořit si vlastní od základu přizpůsobený
našim požadavkům a v případě potřeby mnohem snadněji upravitelný.

Zvolili jsme tedy vytvoření vlastního formátu na bázi formátu plain\TeX,
jehož použití je takové, aby byly snadné i požadované konverze
do případných jiných formátů než dvi, ps a pdf. Vypracování nástrojů pro
alternativní výstupy je otázkou budoucího vývoje.

\subsection{Hierarchie dokumentace}
Dokumentace je založena na formátu plain\TeX , takže fungují klasická
plainová makra, ale ta by se neměla přímo používat z důvodu zachování
plné kontroly nad vzhledem dokumentu při generování všech formátů
dokumentace.

Základní dělení dokumentace je na tzv. knihy, z nichž každá by měla
tvořit určitou část dokumentace takovým způsobem, aby se dala použít
jak samostatně, tak i jako součást celé kompletní dokumentace.
Každá kniha je dále dělena na kapitoly, přičemž má možnost
hierarchického dělení až na pět úrovní kapitol.

Systém je navržen tak, aby bylo možno vytvořit jak kompletní dokumentaci
(všechny knihy v jednom celku) tak dílčí dokumentace, kdy potřebujeme
pouze určitou knihu, bez jakýchkoliv úprav zdrojových kódů dokumentace,
jen spuštěním \TeX{} procesoru pro jiný soubor.

Všechna makra a nastavení jsou uložena v
souboru \soubor{mdef.tex}, který se příkazem \texmac{\\input} vloží
za začátku každé knihy i celé dokumentace
(podrobněji viz. kapitolu \secref{DocKnihy}).
Struktura kompletního dokumentu pak vypadá takto:
\begitem
 \item celá dokumentace
  \iitem první kniha
   \iiitem kapitoly a texty první knihy\dots
  \iitem druhá kniha
   \iiitem kapitoly a texty druhé knihy\dots
  \iitem další kniha\dots
   \iiitem kapitoly a texty další knihy\dots
\enditem
Přičemž každá kniha může stát také samostatně a nezávisle na ostatních.

\newpage
\section{Uživatelské příkazy dokumentace}
V následující části jsou stručně popsány příkazy dokumentace definované v
souboru \soubor{mdef.tex}.
Při psaní tohoto popisu jsem předpokládal, že čtenář je obeznámen se
základními principy a vlastnostmi systému plain\TeX{} alespoň na úrovni
knihy \litref{Jemny}.

\subsection{Dělení na knihy}
\seclabel{DocKnihy}
Každá kniha tvoří buďto část celé dokumentace, anebo může existovat
samostatně. Tím je vlastně dáno, že existují z hlediska našeho
dokumentačního systému čtyři typy souborů:
\begnum
 \item kořenový soubor celé dokumentace\newline
       (viz. kapitolu \secref{DocMaindocMakro})
 \item soubory představující kořenové soubory jednotlivých knih\newline
       (viz. kapitolu \secref{DocKnihaMakro})
 \item další soubory, na něž se soubory předchozích dvou skupin odkazují.
       Jde o další \TeX{} soubory, ale i grafické či jiné soubory
       použité v dokumentaci.
 \item soubor \soubor{mdef.tex}, který je vlastně speciálním
       případem 3. skupiny souborů. Má smysl, aby byl obsažen pouze
       na začátku souborů 1. a 2. skupiny, jinde jeho \texmac{\\input}
       nemá smysl, ale jeho \texmac{\\input} navíc nevadí --- soubor
       se \uv{sám kontroluje}, aby
       byl zahrnut pouze při prvním \texmac{\\input mdef} a v
       dalších je jeho obsah vynechán.
\endnum

\subsubsection{Popis hlavního souboru}
\seclabel{DocMaindocMakro}
Hlavní soubor je vždy jen jeden pro celý dokumentační systém,
resp. pro určitou kombinaci spojení několika různých knih
a příkazem \texmac{\\input mdef} je z něj volán soubor s makry a
definicemi dokumentačního systému (podrobněji viz. kapitolu
\secref{DocDefinice}).

Poté se spouští makro
\texmac{\\maindoc\l nadpis 1\p\l nadpis 2\p\l anotace\p}, které systému
říká, že se kompiluje více knih do jednoho celku a dále vysází titulní
stranu dokumentace (nadpis 1 a nadpis 2 jsou uprostřed na dvou řádcích)
a dále stranu s anotací, kde mohou být uvedeni autoři, copyright apod.
Syntaxe anotace je taková, že v ní nesmí být vícekrát řádkováno
(\texmac{\\par}), tisku na více řádek se docílí makrem
\texmac{\\cr} (jako v prostředí \texmac{\\halign}), které znamená
vždy jedno zařádkování.

Za makrem \texmac{\\maindoc} se příkazem \texmac{\\input} volají
kořenové soubory knih a makra pro globální obsah,
viz. kapitolu \secref{DocObsah}. Možné je zde vkládat i lokální
obsahy knih vždy
za příslušným souborem knihy (v tom případě nebude takový obsah
zahrnut při samostatném zpracování knihy).
Dokumentace je ukončena plainově příkazem
\texmac{\\bye} nebo \texmac{\\end}.

\subsubsection{Popis knihy}
\seclabel{DocKnihaMakro}
Každá kniha může být zpracována programem \TeX{} či jiným procesorem
samostatně na jeho bázi nebo jako součást většího dokumentačního celku.

Na začátku každého souboru knihy je \texmac{\\input mdef},
který zavede příslušná makra pouze v případě, že se kompiluje pouze
jedna kniha. Následně se volá makro
\texmac{\\kniha\l nadpis 1\p\l nadpis 2\p\l autor\p}, kde nadpis 1 a
nadpis 2 mají podobný efekt jako u příkazu \texmac{\\maindoc}, nadpis 1
bude použit v obsahu nebo v seznamu knih.
Autor (či jiná vhodná poznámka jako datum apod.) bude uveden v pravém
dolním rohu titulní strany knihy (negeneruje se samostatná stránka s
anotací jako u \texmac{\\maindoc}).

Za makrem \texmac{\\kniha} následuje samotná dokumentace. Ta má všechny
číslované objekty číslovány vždy od jedné (jak číslování kapitol, tak
rovnic, tabulek\dots), je-li kniha součástí většího celku, je před každé
číslování přidána římská číslice vyjadřující číslo aktuální knihy.
Pouze číslování stránek je nezávislé na knihách a je vždy od začátku
celého dokumentu (ať knihy nebo kompletní dokumentace) až do konce
kontinuální.

Soubor představující kmenový soubor knihy je ukončen makrem
\texmac{\\konecknihy},
které je definováno tak, aby se ukončilo buď pouze načítání souboru (a
pokračuje se nadřadzeným souborem hlavní dokumentace) nebo kompletně
ukončil běh \TeX u (v případě zpracování pouze jedné knihy).
Makro \texmac{\\konecknihy} má vliv pouze na ukončování načítání souboru
\TeX em, z hlediska dělení dokumentu na knihy nemá jiný význam, aktuální
kniha pokračuje až do dalšího makra \texmac{\\kniha} nebo ukončení
celého dokumentu.

\subsection{Nadpisy}
K dispozici je pět úrovní nadpisů, všechny jsou hierarchicky číslovány a
je tedy potřeba postupovat od vyšší úrovně k nižší (jinak se vynechaná
úroveň nadpisu projeví jako číslo 0 v číslování). Postupuje se v tomto
pořadí:
\begitem
 \item \texmac{\\section\l Nadpis první úrovně\p},
 \item \texmac{\\subsection\l Nadpis druhé úrovně\p},
 \item \texmac{\\subsubsection\l Nadpis třetí úrovně\p},
 \item \texmac{\\partsection\l Nadpis čtvrté úrovně\p},
 \item \texmac{\\ppartsection\l Nadpis páté úrovně\p},
 \item \texmac{\\nosection\l Nadpis úvodníku\p} --- ten je na hierarchii
       nezávislý..
\enditem
Všechny úrovně nadpisů jsou implicitně uváděny v obsahu a na kterýkoliv
z nadpisů se lze odkazovat pomocí
\texmac{\\seclabel} a
\texmac{\\secref}, viz. kapitolu \secref{DocReferenci}.

Makro \texmac{\\nosection} není číslováno, je zahrnuto z důvodu
potřeby nečíslovaných kapitol na začátku dokumentace (mimo knihu).
V obsahu bude uvedeno na stejné úrovni jako \texmac{\\section}.

\subsection{Odrážky a číslování}
Makra pro odrážky a číslování vypadají z pohledu uživatele maker
dokumentačního systému tak, že \uv{vnitřek} seznamu
vypadá stále stejně a pokud se změní uvozující značka, lze jednoduše
změnit číslovaný seznam na seznam s odrážkami nebo obráceně.

Dostupné jsou tři úrovně odrážek nebo číslování.
Prostředí pro výčty resp. pro odrážky
začíná příkazem
\texmac{\\begnum} a končí příkazem
\texmac{\\endnum} resp.
\texmac{\\begitem} a
\texmac{\\enditem}.

V obou prostředích se pro jednotlivé položky používají příkazy
\texmac{\\item},
\texmac{\\iitem} a
\texmac{\\iiitem} pro příslušný prvek první, druhé a třetí úrovně.

V prostředích pro odrážky a výčty by se neměl vyskytovat
\texmac{\\par}, tedy dvojité zařádkování, protože tím dochází k chybnému
přenastavení parametrů sazby.

\subsection{Rovnice}
Rovnice a matematika jsou jednou z nejsilnějších stránek systému \TeX{}.
Zahrnul jsem tedy několik způsobů pro jejich vkládání:
\begnum
 \item Přímo do textu pomocí oddělovačů \texmac{\$},
 \item klasicky \uv{plainově} pomocí \texmac{\$\$}, příslušná rovnice pak
       nebude číslována,
 \item po vzoru \LaTeX u uzavřená mezi \texmac{\\[} a \texmac{\\]},
       rovnice pak bude očíslována a lze se na ni odkazovat.
\if 10 \item soustavy rovnic???\dots \fi
\endnum
Syntaxe uvnitř rovnice musí odpovídat plain\TeX ovým zvyklostem.

\subsection{Tabulky}

Tabulky v mém systému fungují tak, že se příkazem \texmac{\\zactab}
zahájí prostředí tabulky. Hned za tímto příkazem je vše až do konce
řádku bráno jako popisek k tabulce. Na dalším řádku je popis tabulky
podle syntaxe prostředí \texmac{\\halign}.
Za popisem tabulky na dalším řádku jsou již vlastní data tabulky.

Políčka tabulky mohou být oddělena buď klasicky
\TeX ově znakem \texmac{\&} nebo tabulátorem, což umožňuje použít
např. tabulky exportované StarCalcem, Excelem nebo jiným tabulkovým
procesorem, databázovým programem, programem pro měření a sběr dat apod.
Řádky tabulky se neukončují sekvencí \texmac{\\cr}, ale obyčejným
zařádkováním.
Při použití \texmac{\\cr} (není doporučeno) nesmí být bezprostředně
před ani za touto značkou zařádkováno.

Tabulkové prostředí je ukončeno příkazem \texmac{\\kontab} umístěným na
samostatném řádku.

Další verzí tabulky je její obdoba bez popisku, může sloužit
např. k zápisu soustav rovnic apod. Její číslo není započítáváno do
počtu tabulek.
Vnitřní syntaxe této tabulky je stejná jako v předchozím případě, pouze místo
\texmac{\\zactab} a \texmac{\\kontab}
se použije
\texmac{\\zacmat} a \texmac{\\konmat} a popis tabulky na prvním řádku se
vynechává (tedy je rovnou zařádkováno).

U obou typů tabulek se horizontální linka vkládá příkazem
\texmac{\\linka} na samostatném řádku. Chceme-li vložit dvojitou linku
(např. pro oddělení záhlaví), použijeme místo \texmac{\\linka} příkaz
\texmac{\\dlinka}. V současné verzi je tabulka
uzavřena v jediném boxu, což v praxi znamená, že se musí vejít na jednu
stránku, jinak dojde k jejímu přetečení přes okraje stránky.

\subsection{Obrázky}
Dokumentace umožňuje i vkládání obrázků.
Obrázky musí být připraveny v různých formátech podle požadovaného
výstupu dokumentace. Pro postscriptový výstup je potřeba mít obrázky ve
formátu eps (encapsulated postscript) a to jak rastrové, tak vektorové.
Pro pdf výstup se nejlépe použije formát pdf
(vektorová grafika) nebo pro rastrovou grafiku jpg či tiff.
O tom, v jakém formátu se bude hledat obrázek při zpracování pdf\TeX em
rozhoduje makro \texmac{\\obrazekprip{přípona}}, kde \texmac{přípona}
je přípona vkládaných grafických obrázků a implicitně je pdf. Po zavolání
tohoto makra se přípona mění globálně a bude se používat pro obrázky
až do konce zpracování dokumentu nebo do dalšího zavolání makra
\texmac{\\obrazekprip} s jinou příponou.

Chceme-li mít obrázek v jiné než \uv{přirozené} velikosti, můžeme použít
registry \texmac{\\obrazekx} resp. \texmac{\\obrazeky}, které jsou typu
\texmac{dimen} a lze jim přiřadit šířku resp. výšku (případně oba parametry)
následujícího obrázku. Nulová hodnota znamená původní velikost a na
tuto hodnotu jsou oba registry nastaveny ihned po vložení obrázku.

Použití makra pro vložení obrázku je následující:
\texmac{\\obrazek\l soubor\p\l Popisek obrázku\p},
kde soubor je jméno souboru bez přípony, tu si systém
připojí pro příslušný výstup jakou bude potřebovat (a soubor v
příslušném formátu ovšem musí existovat).

\subsection{Reference}
\seclabel{DocReferenci}
V jednotlivých knihách jsou zavedeny křížové reference na různé
objekty. Odkazovat se lze na rovnice, tabulky, stránky, obrázky,
kapitoly, knihy, fungují dopředné i zpětné reference.
Všechny reference spolehlivě
fungují po trojím průchodu \TeX{} procesorem. Druhý průchod je nutný z
důvodu vybavení i dopředných referencí (načtení souboru referencí
z předchozího běhu), třetím průchodem dojde k případnému srovnání
odkazů které se změnily např. v důsledku prodloužení obsahu na více
stránek po druhém průchodu \TeX{} procesorem.

Příslušnou značku \\label
je nejlepší umisťovat těsně za příslušný objekt, na nejž chceme
odkazovat. Umístění před odkazovaný objekt způsobí, že značka bude
odkazovat na předchozí objekt stejného typu.
Konkrétní príkazy pro návěští / odkaz jsou:
\zacmat
\hfil # &\qquad # \hfil& \qquad # \hfil
 knihy    & \texmac{\\knihalabel\l reference\p} & \texmac{\\kniharef\l reference\p}
 kapitoly & \texmac{\\seclabel\l reference\p}   & \texmac{\\secref\l reference\p}
 rovnice  & \texmac{\\eqlabel\l reference\p}    & \texmac{\\eqref\l reference\p}
 stránky  & \texmac{\\strlabel\l reference\p}   & \texmac{\\strref\l reference\p}
 tabulky  & \texmac{\\tablabel\l reference\p}   & \texmac{\\tabref\l reference\p}
 obrázky  & \texmac{\\obrlabel\l reference\p}   & \texmac{\\obrref\l reference\p}
\konmat
Systém \MDef{} má definovanou proměnnou \texmac{\\globalrefs}, která je
implicitně nula a v tom případě jsou všechny reference vždy lokální
v rámci jedné knihy (tedy lze mít i při jednom zpracování dokumentace
více stejných značek, každou v jiné knize, i když to zásadně nedoporučuji).
Nastavíme-li \texmac{\\globalrefs} na jedničku, budou odkazy kapitol
všech úrovní, odkazy na stránku a odkazy na literaturu brány jako globální
a lze se odkazovat na kapitoly, stránky a položky literatury i mezi knihami
(ovšem v případě stejných značek bude \TeX{} hlásit chybu).

\subsection{Prostředí verbatim}
Prostředí verbatim funguje tak, že vše, co je napsáno mezi zadanými
značkami, je vysázeno bez formátování --- tedy tak, jak je zapsáno ve
zdrojovém textu. Toho se využívá např. při sazbě zdrojových kódů
programů apod. Za tímto účelem je v systému \MDef{} připraveno několik
prostředí:
\begnum
 \item \uv{obyčejný} verbatim, začíná příkazem
       \texmac{\\verb} a končí příkazem \texmac{\\everb}, oba příkazy
       je nejlepší psát samostatně stojící na řádku,
 \item verbatim s číslováním řádek pro snadnější orientaci ve zdrojových
       textech. K zahájení a ukončení prostředí se použijí příkazy
       \texmac{\\cverb} a \texmac{\\ecverb}. Že se má začít číslovat od
       začátku (prvního řádku) oznámíme \TeX u příkazem
       \texmac{\\begcfile}, jinak se čísluje sekvenčně i přes několik
       volání \texmac{\\cverb}.
 \item speciální prostředí pro přímé vkládání dokumentovaných zdrojových
       textů programů, podrobněji viz. kapitolu \secref{DocDocInput}
\endnum

\subsection{Dokumentování zdrojových kódů programů}
\seclabel{DocDocInput}
Systém \MDef{} umožňuje psát dokumentaci ke zdrojovým textům
programů (C++ a Tcl) přímo do těchto zdrojových kódů. To vede především k
jednoduššímu udržovaní dokumentace při změnách v programu, ale také k
lepší přehlednosti programu pro jeho autora i případného upravovatele.

\subsubsection{Makra pro vložení C++ souboru}
Jsou implementována dvě makra, která se liší pouze způsobem číslování
řádek zdrojového kódu programu. Jde vlastně o \uv{speciální}
\texmac{\\input} rutiny, které připraví takové chování \TeX u, že
soubor, který je běžně kompilovatelný C++ kompilátorem se v nezměněné
podobě dá zařadit do dokumentace a kompilovat takto \TeX em.

Zmíněná makra mají stejnou syntaxi jako makro
\texmac{\\input}.
Jejich tvar je
\texmac{\\csrcdocinput soubor} a
\texmac{\\csrctldocinput soubor}, kde soubor je jmého C++ souboru včetně
přípony. První z maker dokumentuje zdrojový kód a řádky céčkovského
zdroje jsou číslovány od jedné postupně tak , jako by v~souboru chyběla
dokumentace. Tento způsob ale může někomu vadit (při hledání v souboru
jsou čísla řádek v dokumentaci různá od skutečných), proto může použít
druhou verzi makra, která čísluje řádky podle jejich skutečné pozice ve
vstupním souboru. Pokud budou v C++ souboru nějaké \TeX ové definice, které
nebudou \texmac{\\global}, budou tyto platit jen v rámci vloženého souboru,
ve zbytku dokumentu se neprojeví.

\subsubsection{Syntaxe dokumentace C++ souboru}
Zdokumentování lze aplikovat na jakýkoliv C++ zdrojový kód programu.
Základním pravidlem je, že všechna dokumentace je umístěna v C++
komentáři (\uv{dvojlomítko} \csrc{//}),
tudíž ji céčkovský kompilátor přeskočí. \TeX{} procesor je
ale nastaven tak, že si těchto dvojlomítek \uv{nevšímá},
takže do nich lze psát volně dokumentaci, která před začátkem výpisu
zdrojového kódu programu zapne prostředí \texmac{\\cverb} a před dalším
začátkem dokumentace jej ukončí. V praxi může dokumentovaný C++
soubor vypadat např. takto:
\verb
// % Tento komentář v komentáři se neobjeví nikde
// \section{Nějaká kapitola popisující program}
// Text představující popis programu, lze tady používat běžné \TeX ové
// příkazy nebo jen psát text\dots
// \par
// \dots{} Odstavec se bohužel musí psát jak je výše předvedeno, dvojité
// zařádkování s dvojitými lomítky nefunguje.
// \cverb
#include <stdio.h>

int main () {    // tohle se vypíše jak je zapsáno (jsme ve verbatimu)
  printf ( "Ahoj světe!" ) ;
  return 0 ;
}
//\ecverb
// A zde může pokračovat dokumentace jako v předchozím přípdě
// až do konce souboru, jehož načítání \TeX em je ukončeno standartně:
// \endinput
\everb

\subsubsection{Makra pro vložení Tcl souboru}
Analogicky jako vkládání céčkovského dokumentovaného souboru
funguje i dokumentování Tcl souborů. Pouze místo C++ komentáře
se použije Tcl způsob \uv{\tclsrc{\#}} a soubory se vkládají
pomocí příkazů
\texmac{\\tclsrcdocinput} a
\texmac{\\tclsrctldocinput}.

\subsection{Poznámka}
Makro \texmac{\\poznamka} funguje tak, že jeho parametrem je poznámka,
která se uvede ihned na místě vložení makra. Vypsána je kurzívou,
odsazena 1 cm od levého okraje a od okolního textu oddělena linkami šíře
50 mm. Parametr může obsahovat i \texmac{\\par}, tedy odstavcový zlom,
který se projeví i v poznámce jako klasický odstavec, ovšem se zmíněnými
úpravami vzhledu oproti okolnímu textu.

\subsection{Obsah}
\seclabel{DocObsah}
Dokumentační systém umožňuje použití několika typů obsahu podle
tisknutého rozsahu a hloubky členění.
{\zactab Možnosti tisku obsahu
\vrule\quad\hfil\texmac{#}\quad&\vrule\quad #\hfil\quad\vrule
 \linka
  {\bf makro}\hfil    & \hfil{\bf Popis makra}
 \dlinka
  \\celyobsah    & Kompletní obsah celé dokumentace
 \linka
  \\seznamknih   & Obsah jako seznam knih v kompletní dokumentaci
 \linka
  \\obsahknihy   & Obsah konkrétní knihy
 \linka
\kontab}

První dva uvedené způsoby se mohou používat, pouze pokud generujeme kompletní
dokumentaci. První z nich udělá kompletní obsah ze všech knih a s
nadpisy všech úrovní. \texmac{\\seznamknih} funguje jako
\texmac{\\celyobsah} s tím rozdílem, že kapitoly jsou vynechány a jde
tedy jen o výpis knih, z nichž dokumentace sestává.

Poslední je \texmac{\\obsahknihy}, který vytvoří lokální obsah pouze
aktuálně kompilované knihy. Použije se vždy aktuální kniha, v níž je
obsah použit,
přičemž jsou zahrnuty všechny kapitoly první až páté úrovně příslušné
knihy. Pokud je zpracovávána pouze jedna kniha (ne celá dokumentace),
jde vlastně o celý obsah té knihy.

\subsection{Odkazy na literaturu}
Odkazovat se na literaturu lze podobně jako u ostatních objektů makrem
\texmac{\\litref\l značka\p}. V místě vložení bude číslo literatury
označené značkou \texmac{značka} v hranatých závorkách.
Číslování literatury se děje lokálně v rámci každé knihy.

Pro samotný seznam literatury je nejlépe napsat všechny jeho položky
na jednom místě.
Každá položka literatury se vkládá makrem
\texmac{\\literatura\l název\p\l autor\p\l vydání\p\l značka\p}.
Přímo v místě vložení tohoto makra bude položka seznamu literatury a lze
se na ni odkazovat výše zmíněným makrem \texmac{\\litref}.

\subsection{Ostatní příkazy}\seclabel{DocOstPrik}
Dokumentační systém obsahuje ještě několik dalších příkazů pro označení
určitých typů textu. Tyto příkazy se při tisku dokumentu nemusí vůbec
projevit, nebo jen způsobí např. tisk jiným fontem než je okolní text.
Budou ale účelně využity třeba při tvorbě pdf nebo xml verze dokumentace
(např. hypertextové odkazy) nebo ke generování seznamů příslušných
objektů.

{\def\lp{\l\p } \catcode37=14
\zactab Seznam \uv{drobných} příkazů dokumentačního systému
\vrule\quad\hfil\texmac{#}\quad&\vrule\quad #\hfil\quad\vrule
 \linka
  {\bf Příkaz}\hfil       & \hfil{\bf Popis příkazu}
 \dlinka
  \\soubor\lp        & parametr je jméno souboru
  \\texmac\lp        & parametr je \TeX ovské makro, není jako verbatim!
  \\csrc\lp          & parametr je příkaz v jazyce C či C++
  \\tclsrc\lp        & parametr je příkaz v jazyce Tcl
  \\tclargs\lp       & parametr jsou argumenty příkazu v jazyce Tcl
  \\data\lp          & parametr jsou data vstupně--výstupních souborů
  \\httpodkaz\lp\lp  & 1. parametr udává http adresu, %
                       2. je text, který bude sloužit jako odkaz
  \\ftpodkaz\lp\lp   & 1. parametr udává ftp adresu, %
                       2. je text, který bude sloužit jako odkaz
  \\mailodkaz\lp\lp  & 1. parametr je e-mailová adresa, %
                       2. je text, který bude sloužit jako odkaz
  \\newline          & \uv{tvrdé} odřádkování
  \\newpage          & \uv{tvrdý} zlom stránky
  \\\\               & makro pro tisk zpětného lomítka
  \\l                & tiskne levou složenou závorku
  \\r                & tiskne pravou složenou závorku
  \\softinput \#1    & vloží do dokumentu soubor jen pokud existuje
  \\autodoc          & vloží do dokumentace popis balíku \MDef{} (jako knihu)
  \\autodocman       & jako \texmac{\\autodoc}, ale vloží pouze uživatelskou %
                       část (použití příkazů)
  \\autodocman       & jako \texmac{\\autodoc}, ale vloží pouze část %
                       s popisem algoritmů maker \MDef
  \\eqcr             & v prostředí \texmac{\\eqalignno} místo \texmac{\\cr}, %
                       čísluje řádek jako rovnici (možné odkazy)
 \linka
\kontab}

Dále musím zmínit změnu \texmac{\\catcode} znaku \uv{_}, které je nastaveno
na 12 (tzn. obyčejný znak) z důvodu častého výskytu ve zdrojových
kódech programů psaných v jazyce C++. Pro matematická prostředí
se význam tohoto znaku nemění.
\expandafter\ifx\csname skipsrc\endcsname \relax
\section{Literatura}
 \literatura{\TeX Book naruby}
            {Petr Olšák}
            {Konvoj, Brno 2000, 80-85615-64-9}
            {TeXBook}
 \literatura{Typografický systém \TeX}
            {Petr Olšák}
            {Konvoj, Brno 2000, ISBN 80-85615-91-6}
            {TypoSysTeX}
 \literatura{Jemný úvod do \TeX u}
            {Michael Doob, překlad a úprava Josef Daneš, Jiří Veselý}
            {CsTUG, Praha 1993, 3. upravené vydání českého překladu}
            {Jemny}
 \literatura{XML pro každého}
            {Jiří Kosek}
            {Grada, Praha 2000, ISBN 80-7169-860-1}
            {xml}
 \literatura{Zpravodaj československého sdružení uživatelů \TeX u}
            {různé články}
            {CsTUG, Brno, ISSN 1211-6661}
            {zpravodaj}
 \literatura{\TeX Live 5d CD-ROM}
            {pdf\TeX{} examples aj.}
            {sdružení uživatelů \TeX u, VII. 2000}
            {TeXLivepdf}
\fi
\fi
% \fi
% \if 0\autodocsource \expandafter\endinput\else
%   \if 0\autodocmanual
%     \kniha{Popis dokumentačního systému \MDef}{}{Martin Manďák} \obsahknihy
%   \else
%     \newpage
%   \fi
% \fi
%
% \section{Popis algoritmů} \seclabel{DocDefinice}
%   V následující části popisuji detailně makra, kterými je systém \MDef
%   naprogramován. V současné verzi jsou pomocí něj psané dokumenty
%   zpracovatelné csplain\TeX em pro dvi nebo ps výstup. Problémy nečiní ani
%   kompilace pdfcsplain\TeX em pro výstup ve formátu pdf, ale zatím nejsou
%   využity všechny možnosti pro zpracování tímto programem.
%
% \subsection{Test načtení souboru}
%     Nejprve si program otestuje, zda byl již soubor maker načten. V případě
%     dokumentace, kde je více knih (viz. kapitolu \secref{DocKnihy}), se
%     nebudou makra načítat několikrát, ale především inicializace
%     některých proměnných (např. číslování stránek) několikrát během
%     zpracování dokumentu by vedla k nesmyslným výstupům.
% \par
%     Jako test pro zjištění načtení souboru jsem si vybral řídicí sekvenci
%     \texmac{DefiniceNacteny}, která je definována po prvním průchodu
%     souborem maker a při její existenci v dalších průchodech je načítání
%     souboru ihned ukončeno. Připojen je i výpis o těchto činnostech
%     na terminál.
% \defverb
\expandafter\ifx\csname DefiniceNacteny\endcsname \relax
    \expandafter\def \csname DefiniceNacteny\endcsname {1}
    \message{Načítám soubor mdef.tex...}
  \else
    \message{- přeskočen}
    \expandafter\endinput \fi
\edefverb
%   \subsection{Inicializace proměnných (kniha)}
%     Číslo aktuálně zpracovávané knihy je uchováváno v proměnné
%       \texmac{\\bookno}. Protože se ale používá římského číslování knih,
%       je definováno i makro \texmac{\\thebook}, které je implicitně
%       prázdné --- při zpracování jedné knihy je toto číslo vynecháváno.
%       V tom
%       případě také makro \texmac{\\konecknihy} bude ukončovat celou
%       dokumentaci a je tedy implicitně definováno jako \texmac{\\end}.
% \defverb
\def\thebook{}          % číslo knihy římsky, používá se bez mezer kolem
\def\bookname{}         % jméno aktuálně zpracovávané knihy
\def\konecknihy{\end}   % implicitní konec knihy
\newcount \bookno       % aktuální číslo knihy
\edefverb
%   \subsection{Inicializace proměnných (kapitoly)}
%     Zde stojí za zmínku především makro \texmac{\\fpkapno}, v němž je
%       uloženo číslo aktuální kapitoly včetně čísel všech úrovní
%       podkapitol. Další makra slouží k uchování názvů kapitol pro
%       potřeby především záhlaví stránek. Konkrétní význam maker je
%       zřejmý z komentářů:
% \defverb
\def\fpkapno{}          % místo čísla aktualní kapitoly bude řetězec
\newcount \kapno        % aktuální kapitola 1. úrovně
\newcount \subkapno     % aktuální kapitola 2. úrovně
\newcount \subsubkapno  % aktuální kapitola 3. úrovně
\newcount \parkapno     % aktuální kapitola 4. úrovně
\newcount \pparkapno    % aktuální kapitola 5. úrovně
  % následující definice se používají pro hlavičku stránky:
\def\fpkapname{}        % název první kapitoly aktuální stránky
\def\lpagelkap{}        % název poslední kapitoly na poslední stránce
\def\lpagefkap{}        % název první kapitoly na poslední stránce
\newcount \lastpagekap  % poslední stránka začátku kapitoly
  % a tyto definice používá pdf\TeX:
\expandafter\ifx\csname pdfoutput\endcsname \relax
\else
 \pdflinkmargin=0pt
 \pdfmovechars=2
 \pdfpkresolution=300
 \pdfuniqueresname=0
 \pdfcompresslevel=4
\fi
  % následující definice se používají pro hlavičku stránky:
\def\fpkapname{}        % název první kapitoly aktuální stránky
\def\lpagelkap{}        % název poslední kapitoly na poslední stránce
\def\lpagefkap{}        % název první kapitoly na poslední stránce
\newcount \lastpagekap  % poslední stránka začátku kapitoly


\edefverb
%   \subsection{Definice makra pro knihu}
%     Nejdříve jsou vynulována všechna počitadla pro kapitoly,
%     k tomu můžeme doplnit nulování očíslování rovnic, tabulek\dots{}
%     Dále jsou definovány údaje pro titulní stránku knihy
%     (\texmac{\\nazev}, \texmac{\\podnazev} a \texmac{\\autor}).
% \par
%     Další část definice je větvená podle toho, zda je zpracovávána
%     jen jedna kniha nebo kompletní dokument:
%     \begitem
%     \item při samostatné knize se definuje makro \texmac{\\thebook}
%           pro číslování knih jako prázdné, poté je vynulováno počitadlo
%           stránek a vygenerována titulní strana.
%     \item Je-li dokument složen z více knih, je po přechodu na novou stránku
%           zvýšeno číslo knihy o 1, v makru \texmac{\\bookname} definujeme
%           jméno knihy a makrem \texmac{\\thebook} definujeme římské
%           očíslování knihy.
%           Nakonec je proveden zápis do souboru pro generování obsahu a
%           makrem \texmac{\\titulknihy} je vysázena titulní stránka knihy.
%     \enditem
% \defverb
\def\kniha #1#2#3{
  \litnum = 0   \kapno = 0
  \cisrov = 0   \cistab = 0      \cisobr = 0
  \subkapno = 0 \subsubkapno = 0 \parkapno = 0 \pparkapno = 0
  \def\nazev{\thebook{} #1}
  \def\podnazev{#2}
  \def\autor{#3}
  \expandafter\ifx\csname maindoccs\endcsname \relax
      \def\thebook{} \pageno = 0 \titulknihy
  \else
      \newpage
      \global\advance\bookno by1 \def\bookname{#1}
      \def\thebook{\uppercase\expandafter{\romannumeral\bookno}. }
      \titulknihy
      \maketoclinebook{\thebook #1}
      \expandafter\ifx\csname pdfoutput\endcsname \relax \else {
        \pdfdest name{book\thebook} fith
        \pdfoutline goto name{book\thebook} count 0 {\bookname}} \fi
  \fi}
\edefverb
%     \subsection{Kapitoly}
%     Podobně jako kniha jsou definována i makra pro definici kapitol různých
%     úrovní. Nejdříve se tedy nulují počitadla všech hierarchicky nižších
%     objektů a počitadlo aktuálního objektu se zvýší o jedničku.
%     Dále je definováno makro \texmac{\\fpkapno}, které
%     se používá k označování čísla aktuální kapitoly, ve \texmac{\\vbox}u
%     je vypsán název kapitoly s jejím číslem (\texmac{\\vbox} je použit
%     z důvodu zalomení případného dlouhého nadpisu).
%     Záporná penalta před názvem kapitoly slouží k vynucení
%     zalomení stránky v případech, kdy by byl její nadpis \uv{příliš nízko}
%     na stránce.
%     Nakonec je použit příkaz \texmac{\\maketocline}{\it x} příslušné
%     úrovně {\it x} pro zápis nadpisu do souboru obsahu.
% \par
%     U hlavní kapitoly \texmac{\\section} je navíc vyhodnocení
%     podmínky pro přiřazení názvu nadpisu do hlavičky stránky.
% \defverb
%\newcount\secc
%%%%
%\expandafter\def\csname secc1. \endcsname{3}
\newcount\secoutlinea
\newcount\secoutlineb
\newcount\secoutlinec
\newcount\secoutlined
\gdef\seccounter#1#2{\expandafter\gdef\csname #1\endcsname{#2}}
%%%%
\def\section #1{\subkapno = 0 \subsubkapno = 0 \parkapno = 0 \pparkapno = 0
  \def\fpkapno{\thebook\the\kapno . }
%  \newpage  % neni-li newpage, je \vskip 24pt:
  \def\fpkapname{#1} \vskip 24 pt
  \global\advance\kapno by1
  \penalty -2000
%%%%
  \expandafter\ifx\csname pdfoutput\endcsname \relax \else
    \expandafter\ifx\csname secc\fpkapno\endcsname \relax % neex.-li pocitadlo, je 0
      \expandafter\def\csname secc\fpkapno\endcsname{0}
    \fi
    \secoutlinea=0
    \pdfdest name {section\fpkapno} fith
    \pdfoutline goto name {section\fpkapno} count 
    \expandafter\csname secc\fpkapno\endcsname {\the\kapno. \fpkapname}
  \fi
%%%%
  \leftline{\bigggg\vbox{\fpkapno #1}}
  \ifnum \lastpagekap = \pageno
  \else  \global\lastpagekap=\pageno
         \edef\lpagefkap{\the\kapno . #1} \fi
  \edef\lpagelkap{\fpkapno #1}
  \vskip 0pt %-\parskip
  \maketoclinea{\fpkapno #1 }}
\edefverb
%     Další makra pro nižší úrovně kapitol nejsou již popisována, fungují
%     analogicky jako \texmac{\\section}. Jsou to:
%     \begitem
%       \item \texmac{\\subsection}
%       \item \texmac{\\subsubsection}
%       \item \texmac{\\partsection}
%       \item \texmac{\\ppartsection}
%     \enditem
% \defverb
\def\subsection #1{\global\advance\subkapno by1
  \subsubkapno = 0 \parkapno = 0 \pparkapno = 0
  \def\fpkapno{\thebook\the\kapno . \the\subkapno . }
  \def\fpkapname{#1} \vskip 20 pt \penalty -1500
  \expandafter\ifx\csname pdfoutput\endcsname \relax \else
    \expandafter\ifx\csname secc\fpkapno\endcsname \relax % neex.-li pocitadlo, je 0
      \expandafter\def\csname secc\fpkapno\endcsname{0}
    \fi
    \secoutlineb=0
    \advance\secoutlinea by1
    \maketoclinecc{secc\the\kapno . }{\the\secoutlinea}
    \pdfdest name{section\fpkapno} fith
    \pdfoutline goto name{section\fpkapno} count 
    \expandafter\csname secc\fpkapno\endcsname {\the\kapno . \the\subkapno . \fpkapname}
  \fi
  \leftline{\biggg\vbox{\fpkapno #1}}
  \vskip 0pt %-\parskip
  \maketoclineb{\fpkapno #1} }

\def\subsubsection #1{\global\advance\subsubkapno by1
  \parkapno = 0 \pparkapno = 0
  \def\fpkapno{\thebook\the\kapno . \the\subkapno .
      \the\subsubkapno . }
  \def\fpkapname{#1} \vskip 18 pt \penalty -1000
  \expandafter\ifx\csname pdfoutput\endcsname \relax \else
    \expandafter\ifx\csname secc\fpkapno\endcsname \relax % neex.-li pocitadlo, je 0
      \expandafter\def\csname secc\fpkapno\endcsname{0}
    \fi
    \secoutlinec=0
    \advance\secoutlineb by1
    \maketoclinecc{secc\the\kapno . \the\subkapno . }{\the\secoutlineb}
    \pdfdest name{section\fpkapno} fith
    \pdfoutline goto name{section\fpkapno} count 
    \expandafter\csname secc\fpkapno\endcsname 
    {\the\kapno . \the\subkapno . \the\subsubkapno . \fpkapname}
  \fi
  \leftline{\bigg\vbox{\fpkapno #1}}
  \vskip 0pt %-\parskip
  \maketoclinec{\fpkapno #1} }

\def\partsection #1{\global\advance\parkapno by1
  \pparkapno = 0
  \def\fpkapno{\thebook\the\kapno . \the\subkapno .
      \the\subsubkapno . \the\parkapno . }
  \def\fpkapname{#1} \vskip 14 pt \penalty -1000
  \expandafter\ifx\csname pdfoutput\endcsname \relax \else
    \expandafter\ifx\csname secc\fpkapno\endcsname \relax % neex.-li pocitadlo, je 0
      \expandafter\def\csname secc\fpkapno\endcsname{0}
    \fi
    \secoutlined=0
    \advance\secoutlinec by1
    \maketoclinecc{secc\the\kapno . \the\subkapno . \the\subsubkapno . }{\the\secoutlinec}
    \pdfdest name{section\fpkapno} fith
    \pdfoutline goto name{section\fpkapno} count 
    \expandafter\csname secc\fpkapno\endcsname 
    {\the\kapno . \the\subkapno . \the\subsubkapno . \the\parkapno . \fpkapname}
  \fi
  \leftline{\bigbf\vbox{\fpkapno #1}}
  \vskip 0pt %-\parskip
  \maketoclined{\fpkapno #1} }

\def\ppartsection #1{\global\advance\pparkapno by1
  \def\fpkapno{\thebook\the\kapno . \the\subkapno .
      \the\subsubkapno . \the\parkapno . \the\pparkapno . }
  \def\fpkapname{#1} \vskip 12 pt \penalty -1000
  \expandafter\ifx\csname pdfoutput\endcsname \relax \else
    \advance\secoutlined by1
    \maketoclinecc{secc\the\kapno . \the\subkapno . \the\subsubkapno . 
     \the\parkapno . }{\the\secoutlined}
    \pdfdest name{section\fpkapno} fith
    \pdfoutline goto name{section\fpkapno} count 0 
    {\the\kapno . \the\subkapno . \the\subsubkapno . 
     \the\parkapno . \the\pparkapno . \fpkapname}
  \fi
  \leftline{\big\vbox{\fpkapno #1}}
  \vskip 0pt %-\parskip
  \maketoclinee{\fpkapno #1} }
\edefverb
%  Nakonec ještě definujeme makro \texmac{\\nosection}, jehož výstup
%  vypadá jako u makra \texmac{\\section} s tím rozdílem, že takováto
%  kapitola není očíslována. Toto makro je vhodné např. pro úvod
%  kapitoly či dokumentace. Z důvodu nápisu v hlavičce stránky
%  přepisuje význam maker \texmac{\\thebook} a \texmac{\\bookname},
%  protože se jeho použití předpokládá \uv{mimo knihu}.
% \defverb
\def\nosection #1{\def\fpkapno{}
  % \newpage  % neni-li newpage, je \vskip 24pt:
  \vskip 24 pt \penalty -2000
  \expandafter\ifx\csname pdfoutput\endcsname \relax \else {\pdfdest name{section\fpkapno} fith
    \pdfoutline goto name{section\fpkapno} count 0 {\fpkapname}} \fi
  \leftline{\bigggg\vbox{\fpkapno #1}}
  \ifnum \lastpagekap = \pageno %\message{NIC.}%
  \else \global\lastpagekap=\pageno %\message{NECO.}%
        \edef\lpagefkap{#1}\fi
  \edef\lpagelkap{#1}
  \vskip 0pt %-\parskip
  \def\thebook{} \def\bookname{#1}
  \maketoclinea{\fpkapno \noexpand#1 }}
\edefverb
%     \subsection{Zpracování referencí na knihu a kapitoly}
%     Následně jsou definována makra pro odkaz a značku na kapitolu a
%     dále pomocné makro \texmac{\\secREF}, které slouží k
%     vložení odkazů ze souboru \soubor{\\jobname.ref} z předchozího
%     běhu \TeX{} procesoru (tj. zpětné reference).
%     \par
%     Makro \texmac{\\seclabel} zapisuje aktuální číslo a název
%     kapitoly do souboru referencí pomocí makra \texmac{\\zapisref},
%     kde jsou pro výstupní rutinu \uv{anulována} makra používaná
%     v názvech kapitol, aby bylo možno je opět načíst pro reference.
%     Zároveň je brána v úvahu hodnota počitadla \texmac{\\globalrefs},
%     která udává, zda se budou reference na kapitoly provádět v rámci
%     celého dokumentu (tj. i mezi knihami) nebo v rámci každé knihy zvlášť.
% \defverb
\newtoks\pisref
\newcount\globalrefs
\def\zapisref#1{{\let\_=\relax \let~=\relax \let\dots=\relax
               \let\TeX=\relax \let\MDef=\relax
               \pisref={#1}\edef\act{\write\REF{\the\pisref}}\immediate\act}}
\def\seclabel #1{%
   \if 0\the\globalrefs
       \zapisref{\string\secREF{\the\bookno#1}{\fpkapno \fpkapname}}
%       \zapisref{\string % \secREF{\the\bookno#1}{\fpkapno \fpkapname}
       \expandafter\ifx\csname pdfoutput\endcsname \relax \else
         \pdfdest name{\the\bookno#1} fitr width 210mm height 1em depth 0mm
       \fi
   \else \zapisref{\string % \secREF{#1}{\fpkapno \fpkapname}
     \expandafter\ifx\csname pdfoutput\endcsname \relax \secREF{#1}{\fpkapno \fpkapname} \else
       \pdfstartlink attr{/Border [0 0 0]}goto name{#1}
       \Blue\secREF{#1}{\fpkapno \fpkapname}\Black \pdfendlink
     \fi
   }
\fi}
\edefverb
%    \texmac{\\secref} dodá na výstup řetězec definovaný příkazem
%    \texmac{\\seclabel} pokud existuje, jinak vypíše \uv{War\-ning\dots}.
%    Opět zde bereme v úvahu hodnotu \texmac{\\globalrefs}.
% \defverb
\def\secref #1{%
   \if 0\the\globalrefs
     \expandafter\ifx\csname sec:\the\bookno#1\endcsname \relax
       \message{Warning: Undefined sec number [#1] (local)}??%
     \else
%       \csname sec:\the\bookno#1\endcsname
          \expandafter\ifx\csname pdfoutput\endcsname \relax
            \csname sec:\the\bookno#1\endcsname
          \else
            \hbox{\pdfstartlink attr{/Border [0 0 0]}
            goto name{\the\bookno#1} \Blue
            \csname sec:\the\bookno#1\endcsname
            \Black\pdfendlink}\fi\fi
   \else%
     \expandafter\ifx\csname sec:#1\endcsname \relax
     \message{Warning: Undefined sec number [#1]}??%
     \else\csname sec:#1\endcsname
       \expandafter\ifx\csname pdfoutput\endcsname \relax \else
         \pdfdest name{#1} fith
       \fi
   %\fi
     \fi
   \fi}
\edefverb
%      Makro \texmac{\\secREF} je pomocným makrem, které se používá při
%      načítání a zápisu souboru referencí:
%      \begitem
%          \item při zápisu je toto makro zapsáno, přičemž jeho parametry
%          jsou značka odkazu a text ukazující na dané místo (tj. zde
%          číslo a název kapitoly)
%          \item při načítání souboru referencí tato makra definují řídicí
%          sekvence, které definují příslulšné odkazy nebo v případě, že
%          řidicí sekvence již existuje, hlásí \uv{Error\dots}.
%      \enditem \vskip -20pt
% \defverb
\def\secREF #1#2{
     \expandafter\ifx\csname sec:#1\endcsname \relax
     \expandafter\def \csname sec:#1\endcsname {#2}
     \else \errmessage{Error: Double sec mark [#1]}\fi}
\edefverb
%     Analogickým způsobem jsou definována i makra pro tvorbu referencí na
%     všechny ostatní objekty, takže dále již nejsou podrobně popisována.
%     Zde dodefinujeme makra pro odkazy na knihu:
% \defverb
\def\knihalabel #1{
   \immediate\write\REF{\string\knihaREF{#1}{\thebook \bookname}}}
\def\kniharef #1{\expandafter\ifx\csname kniha:#1\endcsname \relax
   \message{Warning: Undefined book number [#1]}??%
   \else\csname kniha:#1\endcsname\fi}
\def\knihaREF #1#2{\expandafter\ifx\csname kniha:#1\endcsname \relax
      \expandafter\def \csname kniha:#1\endcsname {#2}
   \else \errmessage{Error: Double book mark [#1]}\fi}
\edefverb
%     \subsection{Výčty a odrážky}
%   Pro tato prostředí nejdříve definujeme počitadla pro všechny tři
%   úrovně. Prostředí podle hodnoty počitadel rozeznává aktuální stav, v
%   jakém se \TeX{} procesor vzhledem k těmto prostředím vyskytuje.
%  \par
%   Je-li hodnota počitadel nulová, nejsme v žádném prostředí výčtů či
%   odrážek. Je-li tato hodnota záporná, jsme v prostředí odrážek (bývá
%   nastavena na -1). Při kladných hodnotách počitadel se vyskytujeme v
%   prostředí výčtů a příslušné hodnoty počitadel odpovídají očíslování
%   aktuální položky výčtu.
% \defverb
\newcount\numitemnum \newcount\numiitemnum \newcount\numiiitemnum
\numitemnum = 0 \numiitemnum = 0 \numiiitemnum = 0
\let\puvitem=\item   % v \puvitem ponecháme původní význam \item
\edefverb
% Teď definujeme makra pro začátek obou prostředí. Tato makra dělají
% pouze to, že nastaví počitadla všech tří úrovní do stavu, který byl
% pro obě prostředí popsán v předchozím odstavci.
% \defverb
\def\begitem{\numitemnum = -1 \numiitemnum = -1 \numiiitemnum = -1
             \par \bgroup \parindent 0pt \parskip 0pt}
\def\begnum{\numitemnum = 1 \numiitemnum = 1 \numiiitemnum = 1
            \par \bgroup \parindent 0pt \parskip 0pt}
\edefverb
% Na konci prostředí jsou čítače uvedeny do nulového stavu a je ukončena
% skupina (kterou zahajuje poslední z položek prostředí).
% Ukončení pro obě prostředí jsou definována stejně (proto je zde
% \texmac{\\def\\endnum\l \\enditem\p}).
% \defverb
\def\enditem{\vskip 0pt \egroup
             \numitemnum = 0 \numiitemnum = 0 \numiiitemnum = 0
             \vskip 0pt}
\def\endnum{\enditem}
\edefverb
%   Následující makra \texmac{\\item, \\iitem} a \texmac{\\iiitem}
%   definují postupně všechny tři úrovně položek seznamů s číslováním nebo
%   odrážkami.
%  \par
%   Makro nejdříve zkontroluje, zda byl zahájen některý ze seznamů.
%   V případě použití mimo seznam vypíše \TeX{} chybu.
%   Poté je makro rozděleno na dvě části podle toho, jestli se vyskytujeme
%   v číslovaném seznamu nebo seznamu s odrážkami.
%   S každou položkou je zrušena skupina, která je opět zahájena, jsou v ní
%   definovány rozměry aktuální položky a je uzavřena další položkou nebo
%   na konci ukončovacím makrem prostředí.
%  \par
%   V seznamu s odrážkami je pouze nastaveno správné odsazení textu
%   položky a vytištěna její značka.
%  \par
%   V číslovaném seznamu jsou navíc nulovány všechny nižší úrovně
%   číslování. Po vysázení čísla položky a jejího textu je číslo položky
%   zvýšeno o jedničku.
% \defverb
\def\item{
  \ifnum\numitemnum = 0 \errmessage{Chybné umístění položky item.}
  \else
    \par \hangafter=0 \hangindent=10mm
    \ifnum\numitemnum = -1
       \textindent{\hbox to10mm{\hfil$\bullet$\hfil}}
    \else
       \textindent{\hbox to10mm{\hfil\the\numitemnum . }}
       \advance\numitemnum by1 \numiitemnum = 97 \numiiitemnum = 1
    \fi
  \fi
}
\edefverb
% Ostatní úrovně položek \uv{odrážkovaných} nebo číslovaných seznamů
% jsou vytvořeny analogicky k první úrovni, liší se přičítáním čítače pro
% tu kterou úroveň v seznamu a rozměry a odsazení položek seznamu dané
% úrovně.
% \defverb
\def\iitem{
  \ifnum\numiitemnum = 0 \errmessage{Chybné umístění položky iitem.}
  \else
    \par \hangafter=0 \hangindent=20mm
    \ifnum\numitemnum = -1
       \textindent{\hbox to20mm{\hfil$\circ$\quad}}
    \else
       \textindent{\hbox to20mm{\hfil\char\numiitemnum . }}
       \advance\numiitemnum by1 \numiiitemnum = 1
    \fi
  \fi
}
\def\iiitem{
  \ifnum\numiiitemnum = 0 \errmessage{Chybné umístění položky iiitem.}
  \else
    \par \hangafter=0 \hangindent=30mm
    \ifnum\numitemnum = -1
       \textindent{\hbox to30mm{\hfil$\cdot$\quad}}
    \else
       \textindent{\hbox to30mm{\hfil\the\numiiitemnum . }}
       \advance\numiiitemnum by1
    \fi
  \fi
}
\edefverb
%  \subsection{Deklarace souboru referencí a stránková reference}
%     Zde je deklarován ukazatel na soubor \texmac{\\REF}, do nějž budou
%     zapisovány všechny reference pro načítání v dalším běhu \TeX{}
%     procesoru. Dále jsou na tomto místě deklarována makra pro zápis a
%     načítání stránkové reference, tak jako u odkazů na kapitoly
%     se bere v úvahu hodnota proměnné \texmac{\\globalrefs} pro tvorbu
%     odkazů i mezi knihami.
% \defverb
\newwrite\REF
\def\strlabel #1{%
   \if 0\the\globalrefs
     \immediate\write\REF{\string\strREF{\the\bookno#1}{\the\pageno}}
   \else\immediate\write\REF{\string\strREF{#1}{\the\pageno}} \fi}
\def\strref #1{%
   \if 0\the\globalrefs
     \expandafter\ifx\csname str:\the\bookno#1\endcsname \relax
     \message{Warning: Undefined page number [#1]}??%
     \else\csname str:\the\bookno#1\endcsname\fi
   \else
     \expandafter\ifx\csname str:#1\endcsname \relax
     \message{Warning: Undefined page number [#1]}??%
     \else\csname str:#1\endcsname\fi
   \fi}
\def\strREF #1#2{\expandafter\ifx\csname str:#1\endcsname \relax
      \expandafter\def \csname str:#1\endcsname {#2}
   \else \errmessage{Error: Double page mark [#1]}\fi}
\edefverb
%  \subsection{Obsah}
%    Obsah je zde řešen \uv{způsobem dvojího načítání}, jak jsem si jej
%    pro sebe nazval. Princip je takový, že všechny položky obsahu se
%    zapisují do souboru \soubor{\\jobname.top} při kterémkoliv průchodu
%    \TeX u. Ale pokud tento soubor již existuje z minulého zpracování, je
%    nejdříve překopírován do \soubor{\\jobname.toc}, který je od té
%    chvíle pouze pro čtení a je načítán v případě volání některého
%    z maker pro obsah.
% \par
%    Nejdříve si musíme založit ukazatele na soubory pro čtení a zápis,
%    dále proměnnou pro číslo knihy, pro kterou je generován obsah.
% \defverb
\newread\TOCTMP
\newwrite\TOC
\newcount\kaptoc
\edefverb
%   Poté provedeme zápis souboru \soubor{\\jobname.top} do souboru
%   \soubor{\\jobname.toc}. To je nejjednodušší tak, že nadefinujeme
%   všechna makra, která se mohou vyskytnout v souboru
%   \soubor{\\jobname.top} tak, aby sama sebe zapsala do souboru
%   \soubor{\\jobname.toc}. Parametry zde použitých maker jsou:
%   \begnum
%      \item číslo knihy
%      \item název kapitoly včetně očíslování
%      \item strana (resp. nějaké označení místa), na které bude položka
%            ukazovat
%   \endnum \vskip -20pt
% \defverb
\newtoks\pisretezec
\def\zapis#1{{\let\_=\relax \let~=\relax \let\dots=\relax
               \let\TeX=\relax \let\MDef=\relax
\pisretezec={#1}\edef\act{\write\TOC{\the\pisretezec}}\immediate\act}}

\def\toclinebook#1#2#3{\zapis{\string\toclinebook{#1}{#2}{#3}}}
\def\toclinea#1#2#3{\zapis{\string\toclinea{#1}{#2}{#3}}}
\def\toclineb#1#2#3{\zapis{\string\toclineb{#1}{#2}{#3}}}
\def\toclinec#1#2#3{\zapis{\string\toclinec{#1}{#2}{#3}}}
\def\toclined#1#2#3{\zapis{\string\toclined{#1}{#2}{#3}}}
\def\toclinee#1#2#3{\zapis{\string\toclinee{#1}{#2}{#3}}}
 \immediate\openout\TOC=\jobname.toc
   \immediate\openin\TOCTMP=\jobname.top
% test (ne)existence souboru \TOCTMP :
   \ifeof\TOCTMP\message{Soubor \jobname.top neexistuje...}
   \else\immediate\closein\TOCTMP\input \jobname.top\fi
 \immediate\closeout\TOC
 \immediate\openout\TOC=\jobname.top
\edefverb
%   Poté definujeme jednotlivé řádky pro různé úrovně kapitol, jak budou
%   vypadat v obsahu (tj. implicitní při načtení souboru
%   \soubor{\\jobname.toc}). Vždy je vložena podmínka, zda se generuje
%   kompletní obsah celé dokumentace složené z více knihy nebo obsah pouze
%   jedné knihy ať už umístěné samostatně nebo v rámci většího celku.
% \defverb
\def\toclinebook#1#2#3{%
    \ifnum 0 = \the\kaptoc
     \vskip6pt \penalty -1500
     \line{{\bigbf #2\quad\dotfill\hbox to12mm{\hfil #3}}} \fi}%
\def\toclinea#1#2#3{%
    \ifnum 0 = \the\kaptoc
      \vskip6pt \penalty -1000
      \line{{\big #2\quad\dotfill\hbox to12mm{\hfil #3}}}%
    \else\ifnum #1 = \the\kaptoc
      \vskip6pt \penalty -1000
      \line{{\big #2\quad\dotfill\hbox to12mm{\hfil #3}}}%
    \fi\fi}
\def\toclineb#1#2#3{%
    \ifnum 0 = \the\kaptoc \line{\hskip24pt{\rm #2 \hfill #3}}%
    \else\ifnum #1 = \the\kaptoc \line{\hskip24pt{\rm #2 \hfill} #3}%
    \fi\fi}
\def\toclinec#1#2#3{%
    \ifnum 0 = \the\kaptoc \line{\hskip36pt{\rm #2 \hfill #3}}%
    \else\ifnum #1 = \the\kaptoc \line{\hskip36pt{\rm #2 \hfill} #3}%
    \fi\fi}
\def\toclined#1#2#3{%
    \ifnum 0 = \the\kaptoc \line{\hskip48pt{\rm #2 \hfill #3}}%
    \else\ifnum #1 = \the\kaptoc \line{\hskip48pt{\rm #2 \hfill} #3}%
    \fi\fi}
\def\toclinee#1#2#3{%
    \ifnum 0 = \the\kaptoc \line{\hskip60pt{\rm #2 \hfill #3}}%
    \else\ifnum #1 = \the\kaptoc \line{\hskip60pt{\rm #2 \hfill} #3}%
    \fi\fi}
\edefverb
%   Následující makro \texmac{\\xobsah} vypíše obsah kapitoly číslo
%   \texmac{\\kaptoc},
%   pokud je \texmac{\\kaptoc} větší než 0. Je-li \texmac{\\kaptoc} rovno
%   nule, je vygenerován kompletní obsah všech knih. K oběma je použito
%   formátování uvedené výše.
% \defverb
\def\xobsah{
   \ifnum \the\kaptoc = 0
         \newpage\bgroup\headline{\hfil}\leftline{{\biggg Obsah}}%
%         \maketoclinebook{Obsah}
   \else \newpage\bgroup\leftline{{\biggg Obsah \thebook\bookname}} \fi%
%         \maketoclinea{Obsah \thebook\bookname}\fi
   \immediate\openin\TOCTMP=\jobname.toc
   \ifeof\TOCTMP\message{Soubor \jobname.toc neexistuje...}%
   \else\immediate\closein\TOCTMP\input \jobname.toc \vskip 0pt
   \vfil\eject\egroup\fi
}
\edefverb
%   Makra \texmac{\\obsahknihy} a \texmac{\\celyobsah} generují částečný
%   nebo kompletní obsah výše zmíněným způsobem.
%   Makro \texmac{\\seznamknih} vygeneruje stručnější kompletní obsah, v
%   němž budou uvedeny pouze knihy. Makra vypisující do obsahu další
%   úrovně kapitol jsou definována jako prázdná.
% \if 10
%   V budoucnu do maker \texmac{\\celyobsah} a \texmac{\\seznamknih} bude
%   doplněna kontrola, zda se generuje kompletní dokumentace a ne
%   samostatná kniha. \fi
% \defverb
\def\obsahknihy{\kaptoc = \the\bookno \xobsah}
\def\celyobsah{\kaptoc = 0 \xobsah}
\def\seznamknih{{\kaptoc = 0
    \def\toclinebook##1##2##3{%
	        \vskip6pt\line{{\bigbf ##2\quad\hrulefill\hbox to12mm{\hfil ##3}}} }
    \def\toclinea##1##2##3{}  % od této úrovně se položky v seznamu knih
    \def\toclineb##1##2##3{}  % neuvádějí...
    \def\toclinec##1##2##3{}
    \def\toclined##1##2##3{}
    \def\toclinee##1##2##3{}
    \xobsah}}
\edefverb
%   Ohledně obsahu zbývá dodefinovat ještě makra pro zápis příslušné
%   obsahové reference do souboru \soubor{\\jobname.top}.
%   Makrům pro příslušné úrovně zápisu se zadává pouze jméno kapitoly či
%   knihy. Číslo knihy a stránka, na niž budeme odkazovat se doplňuje
%   automaticky. Následující makra jsou pak volána makry pro začátek knihy nebo
%   kapitol:
% \defverb
\def\maketoclinebook#1{\zapis{\string\toclinebook{\the\bookno}{#1}{\the\pageno}}}
%\def\maketoclinea#1{\zapis{\string\toclinea{\the\bookno}{#1}{
%  \expandafter\ifx\csname pdfoutput\endcsname \relax \the\pageno \else
%  \pdfstartlink attr{/Border [0 0 0]}goto name{section\fpkapno}
%  \Blue\the\pageno\Black \pdfendlink \fi}}}
\def\maketoclinea#1{\zapis{\string\toclinea{\the\bookno}{
  \expandafter\ifx\csname pdfoutput\endcsname \relax #1 \else
  \pdfstartlink attr{/Border [0 0 0]}goto name{section\fpkapno}
  \Blue #1 \Black \pdfendlink \fi} {
  \expandafter\ifx\csname pdfoutput\endcsname \relax \the\pageno \else
  \pdfstartlink attr{/Border [0 0 0]}goto name{section\fpkapno}
  \Blue\the\pageno\Black \pdfendlink \fi}}}
\def\maketoclineb#1{\zapis{\string\toclineb{\the\bookno}{#1}{
  \expandafter\ifx\csname pdfoutput\endcsname \relax \the\pageno \else
  \pdfstartlink attr{/Border [0 0 0]}goto name{section\fpkapno}
  \Blue\the\pageno\Black \pdfendlink \fi}}}
\def\maketoclinec#1{\zapis{\string\toclinec{\the\bookno}{#1}{
  \expandafter\ifx\csname pdfoutput\endcsname \relax \the\pageno \else
  \pdfstartlink attr{/Border [0 0 0]}goto name{section\fpkapno}
  \Blue\the\pageno\Black \pdfendlink \fi}}}
\def\maketoclined#1{\zapis{\string\toclined{\the\bookno}{#1}{
  \expandafter\ifx\csname pdfoutput\endcsname \relax \the\pageno \else
  \pdfstartlink attr{/Border [0 0 0]}goto name{section\fpkapno}
  \Blue\the\pageno\Black \pdfendlink \fi}}}
\def\maketoclinee#1{\zapis{\string\toclinee{\the\bookno}{#1}{
  \expandafter\ifx\csname pdfoutput\endcsname \relax \the\pageno \else
  \pdfstartlink attr{/Border [0 0 0]}goto name{section\fpkapno}
  \Blue\the\pageno\Black \pdfendlink \fi}}}
\def\maketoclinecc#1#2{\zapis{\string\seccounter{#1}{#2}}}
%\toclinee{\the\bookno}{#1}{
%  \expandafter\ifx\csname pdfoutput\endcsname \relax \the\pageno \else
%  \pdfstartlink attr{/Border [0 0 0]}goto name{section\fpkapno}
%  \Blue\the\pageno\Black \pdfendlink \fi}}}
\edefverb
% \subsection{Seznam literatury}
%  Pomocí makra \texmac{\\literatura} je vysázena  položka literatury
%  přímo v místě použití tohoto makra.
%  K tomu účelu výhodně využijeme plainové makro \texmac{\\item}
%  (v prostředí výčtů bylo předefinováno, původní význam zůstal
%  v \texmac{\\puvitem}). Zároveň volá zde definované makro
%  \texmac{\\litlabel}, které vytvoří odkaz na danou položku
%  literatury. Reference pak funkguje analogicky jako ostatní reference,
%  výstupem je číslo literatury v hranatých závorkách.
%  Číslování literatury je uloženo v registru \texmac{\\litnum}.
% \defverb
\newcount\litnum
\def\literatura#1#2#3#4{
  \global\advance\litnum by1
  {\parindent 9mm \parskip 14pt
    \par
    \hangindent 24mm \hangafter 1
    \puvitem {\hbox to 9mm{\hfil{\bf [\the\litnum]}}}
    {{\rm#2}: {\it#1} }\newline
	{\rm#3}\par}
  \litlabel{#4}}

\def\litlabel #1{%
   \if 0\the\globalrefs
     \immediate\write\REF{\string\litREF{\the\bookno#1}{[\the\litnum]}}
   \else
     \immediate\write\REF{\string\litREF{#1}{[\the\litnum]}}
   \fi}
\def\litref #1{%
   \if 0\the\globalrefs
     \expandafter\ifx\csname lit:\the\bookno#1\endcsname \relax
     \message{Warning: Undefined lit number [#1]}??%
     \else\csname lit:\the\bookno#1\endcsname\fi
   \else
     \expandafter\ifx\csname lit:#1\endcsname \relax
     \message{Warning: Undefined lit number [#1]}??%
     \else\csname lit:#1\endcsname\fi
   \fi}
\def\litREF #1#2{\expandafter\ifx\csname lit:#1\endcsname \relax
     \expandafter\def \csname lit:#1\endcsname {#2}
   \else \errmessage{Error: Double lit mark [#1]}\fi}
\edefverb
%  \subsection{Rovnice}
%   Protože samotný plain\TeX{} má vcelku dostačující možnosti pro psaní
%   rovnic, jsou dodefinována pouze makra pro možnosti číslování rovnic a
%   možnosti odkazovat se na ně.
%  \par
%   Makra \texmac{\\[} a \texmac{\\]} byla inspirována \LaTeX em a slouží
%   k sazbě číslované rovnice, na niž se lze odkazovat makrem
%   \texmac{\\eqref}.
%   Sekvence \texmac{\\eqcr} se používá v prostředí \texmac{\\eqalignno}
%   místo \texmac{\\cr} z důvodu číslování rovnic --- \texmac{\\eqcr}
%   přidá na pravé straně číslo rovnice a zvětší jej o jedničku.
% \defverb
\newcount \cisrov
\cisrov = 0
\def\[{ \global\advance\cisrov by1 $$ }
\def\]{ \eqno (\thebook\the\cisrov)\quad $$ }
\def\eqcr{ \global\advance\cisrov by1 (\thebook\the\cisrov)\quad \cr }
\def\eqlabel #1{
   \immediate\write\REF{\string\eqREF{\the\bookno#1}{\thebook\the\cisrov}}}
\def\eqref #1{\expandafter\ifx\csname eq:\the\bookno#1\endcsname \relax
   \message{Warning: Undefined eq. number [#1]}??%
   \else(\csname eq:\the\bookno#1\endcsname)\fi}
\def\eqREF #1#2{\expandafter\ifx\csname eq:#1\endcsname \relax
      \expandafter\def \csname eq:#1\endcsname {#2}
   \else \errmessage{Error: Double eq. mark [#1]}\fi}
\edefverb
% \subsection{Různé definice}
%   Zde jsou definovány drobnější definice pro různý účel, většina pouze
%   formátuje text určitým způsobem (např. jiný font), v budoucnu může být
%   přidáno interaktivní odkazování např. na soubor nebo internetový
%   odkaz, které z takto vytvořeného dokumentu udělá třeba \uv{klikací}
%   pdf dokument. Jiná možnost je použití takových maker třeba pro xml
%   dokumentaci, protože zde není pouze definován pouze vzhled výstupu, ale
%   data jsou členěna i podle významu.
% \defverb
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% RUZNE DEFINICE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\soubor#1{{\tt #1}}  % Název souboru
\def\texmac#1{{\tt #1}}  % TeXovské makro
\def\csrc#1{{\tt #1}}    % céčkovský zdroj/příkaz
\def\tclsrc#1{{\tt #1}}  % Tcl příkaz
\def\tclargs#1{{\it #1}}  % Tcl parametry příkazu
\def\data#1{{\tt #1}}    % data i/o souboru

\def\httpodkaz #1#2{{\tt  % internetový odkaz {adresa}{text}
  \expandafter\ifx\csname pdfoutput\endcsname \relax #2\else
  \pdfstartlink attr{/Border [0 0 0]} user{
         /Subtype /Link
         /A <<
            /Type /Action
            /S /URI
            /URI (http://#1)
        >>}\Blue#2\Black\pdfendlink\fi}}
\def\ftpodkaz #1#2{{\tt  % internetový odkaz {adresa}{text}
  \expandafter\ifx\csname pdfoutput\endcsname \relax #2\else
  \pdfstartlink attr{/Border [0 0 0]} user{
         /Subtype /Link
         /A <<
            /Type /Action
            /S /URI
            /URI (ftp://#1)
        >>}\Blue #2\Black\pdfendlink\fi}}
\def\mailodkaz #1#2{{\tt  % mailový odkaz {adresa}{text}
  \expandafter\ifx\csname pdfoutput\endcsname \relax #2\else
  \pdfstartlink attr{/Border [0 0 0]} user{
         /Subtype /Link
         /A <<
            /Type /Action
            /S /URI
            /URI (mailto:#1)
        >>}\Blue #2\Black\pdfendlink\fi}}
\def\newline{ \hfil\break }  % nový řádek po vzoru LaTeXu
\def\newpage{ \vfil\eject }  % nová stránka po vzoru LaTeXu
\def\\{$\backslash$}         % zpětné lomítko
\def\p{$\}$}                 % pravá složená závorka
\def\l{$\{$}                 % levá složená závorka

%  následující část je zde pouze pro zpětnou kompatibilitu
% s již existující dokumentací
\def\soub{\soubor}       % jméno souboru
\def\shell #1{{\tt #1}}  % výpis z příkazové řádky
\def\cpp{\csrc}          % zdrojový kód v jazyce C nebo C++ (není to verbatim!)
\def\guim #1{{\it #1}}   % popisek objektu grafického prostředí
\def\sip{$\rightarrow$}  % šipka vpravo (pro popisky hierarche jako menu apod.)

\chyph                       % české dělení slov

\catcode`\_=12               % podtržítko je obyčejný znak,
\everymath{\catcode`_=8 }    % ale v matematických režimech
\everydisplay{\catcode`_=8 } % zůstává jeho význam dolní index

%   Dále definujeme používaná loga \MDef{} a \LaTeX :
\def\MDef{M\kern-0.40em\hbox{D}%
           \kern-0.55em\lower-0.30ex\hbox{e}%
           \kern0.0em\lower0.125ex\hbox{f}}
\def\LaTeX{L\kern-.36em\raise0.5ex\hbox{\sevenrm A}\kern-.12em\TeX}
\edefverb
%   Definice makra \texmac{\\softinput}, které načte soubor pouze v
%   případě, že existuje a nezpůsobuje nepříjemné dotazy \TeX u
%   k uživateli:
% \defverb
\newread\test
\def\softinput#1{\immediate\openin\test=#1
   \ifeof\test\message{Soubor #1 neexistuje...}%
   \else\immediate\closein\test\input #1\fi}
\edefverb
%   Následující makro je reklamou autora tohoto balíku maker.
%   \if 10 (bez komentáře\dots ) \fi
% \defverb
\def\reklama{{~\vfil\newline\baselineskip 7 pt
 \rightline{\vbox{\halign{\strut\hfil##\cr \noalign{\hrule}
  \malit Tento dokument byl zpracován pomocí maker 
         \httpodkaz{www.mandak.net}{{\maly \MDef}} v systému 
         \httpodkaz{www.cstug.cz}{{\maly plain\TeX}}.\cr
%  \malit Copyright {\maly\copyright{}} 1999--2003 Martin Manďák
%         (\mailodkaz{magor@email.cz}{{\malit martin@mandak.net}})%
%         \cr
}}}}
 \eject}
\edefverb
%  \subsection{Poznámky}
%   Makro \texmac{\\poznamka} slouží k vložení poznámky, která bude
%   nahoře a dole oddělena čarou širokou 50 mm
%   (\texmac{\\hbox to50mm\\hfulefill}), mezi těmito čarami bude
%   nadpis \uv{Poznámka:} a samotný text poznámky odsazený zleva o 10 mm
%   (\texmac{\\hskip 10mm}) a široký 15 cm, což je o právě těch 10 mm méně
%   než je defaultní šířka odstavce. Po vložení parametru makra musí být
%   ještě \texmac{\\par}, jinak je hodnota \texmac{\\hsize} převzata z
%   globální proměnné a ne z vnitřku makra (tady se projevuje nebezpečnost
%   konstrukce \texmac{\\long\\def}).
% \defverb
\long\def\poznamka #1{\newline\hbox to50mm{\hrulefill}
\hfil\break\leftline{{\it Poznámka:}}\vskip 6pt%
\hbox{\hskip 10mm\vbox{{\hsize = 15cm
\it #1 \par}}}
\hbox to50mm{\hrulefill}\vskip 0pt}
\edefverb
%  \subsection{Tabulky}
%   Tabulky využívají prostředí \texmac{\\halign} s několika úpravami
%   oproti standartnímu plain\TeX u: především je kategorie znaku
%   tabulátor definována jako 4, tedy stejná jako má znak \texmac{\&} a
%   lze používat tabulátor jako oddělovač políček tabulky.
%
%   Další podstatnou změnou je kategorie znaku 0x0D, která je 13, tedy
%   aktivní znak a jeho význam je nadefinován jako \texmac{\\cr}. Proto se
%   jako oddělovač řádek v tabulkách nesmí používat \texmac{\\cr}, pokud
%   je mezi řádky tabulky zařádkováno i ve zdrojovém souboru.
%
%   K tomu jsou dodefinována makra \texmac{\\linka} a \texmac{\\dlinka},
%   která vytvoří jednoduchou resp. dvojitou vodorovnou linku mezi řádky
%   tabulky. K~tomuto účelu obě makra využívají obvyklé
%   \texmac{\\noalign\l\\hrule\p}.
%
%   Nejdříve definujeme pomocné makro \texmac{\\tabulex}, které navíc
%   vysází a započítá číslo a popis tabulky:
% \defverb
\newcount\cistab
\cistab = 0
{\catcode`\^^M=13 %
 \catcode`\^^I=4  %
 \gdef\tabulex #1^^M#2^^M#3\kontab{\global\advance\cistab by1
                    \hfil\vbox{
                    %\vskip 0 pt
                    \bgroup %
                    \catcode9=4 \catcode13=13 %
                    \def\linka^^M{\noalign{\hrule}}
                    \def\dlinka^^M{\noalign{\hrule\break\vskip 1pt\hrule}}
                    \def^^M{ \cr } %
                    \offinterlineskip{ %
                     \halign{\strut #2 \cr %
                      #3 \crcr} }    } \egroup
        \centerline{{\it\hskip 0mm Tabulka \thebook\the\cistab: #1}}
        \egroup \vskip 0pt}
\edefverb
%   Dalším pomocným makrem je \texmac{\\tabuley}, které vytvoří tabulku
%   bez popisku a očíslování.
% \defverb
 \gdef\tabuley^^M#1^^M#2\konmat{ %
                    \hfil\vbox{
                    %\vskip 0 pt
                    \bgroup %
                    \catcode9=4 \catcode13=13 %
                    \def\linka^^M{\noalign{\hrule}}
                    \def\dlinka^^M{\noalign{\hrule\break\vskip 1pt\hrule}}
                    \def^^M{ \cr } %
                    \offinterlineskip{ %
                     \halign{\strut #1 \cr %
                      #2 \crcr } }   } \egroup
                    \egroup \vskip 0pt}
}
\edefverb
%   Zbývá dodefinovat makra pro začátek a konec obou tabulkových
%   prostředí, která společně s předchozími makry a makrem
%   \texmac{\\begtabx} vytváří kompletní tabulkové prostředí.
% \defverb
\def\begtabx{\vskip 0pt\bgroup\catcode`\^^M=13 \catcode`\^^I=4 }
\def\zactab{\begtabx \tabulex }
\def\zacmat{\begtabx \tabuley}
\edefverb
%   Nakonec jsou samozřejmě definována makra pro reference na tabulku:
% \defverb
\def\tablabel #1{
   \immediate\write\REF{\string\tabREF{\the\bookno#1}{\thebook\the\cistab}}}
\def\tabref #1{\expandafter\ifx\csname tab:\the\bookno#1\endcsname \relax
   \message{Warning: Undefined tab number [#1]}(??)%
   \else\csname tab:\the\bookno#1\endcsname\fi}
\def\tabREF #1#2{\expandafter\ifx\csname tab:#1\endcsname \relax
      \expandafter\def \csname tab:#1\endcsname {#2}
   \else \errmessage{Error: Double tab mark [#1]}\fi}
\edefverb
%  \subsection{Obrázky}
%   Vkládání obrázků do dokumentů dvi, resp. ps se děje pomocí
%   souboru maker \soubor{epsf}, které je standardní součástí
%   instalace \TeX u.
%   Do dokumentů pdf je obrázek vkládán způsobem standartním v Han The
%   Thanhově pdf\TeX u, používá se přípona \texmac{\\obrprip} definovaná
%   při volání makra \texmac{\\obrazekprip}.
%   Obrázek je vkládán vlastně do tabulky --- v prostředí
%   \texmac{\\halign} se snadno umístí včetně jeho popisku:
% \defverb
\input epsf   % soubor epsf.tex by mel byt standartni soucasti texu
\newcount\cisobr
\cisobr=0
\def\obrazekprip #1{\gdef\obrprip{#1}}
\obrazekprip{pdf}
\newdimen\obrazekx
\newdimen\obrazeky
\obrazekx 0pt \obrazeky 0pt
\def\obrazek#1#2{\vskip 6pt \global\advance\cisobr by1
    \centerline{\vbox{\halign{\strut\hfil ##\hfil\cr
      \ifx\pdfoutput\undefined
        \epsfxsize \obrazekx \epsfysize \obrazeky
        \epsfbox{#1.eps} \epsfxsize 0pt \epsfysize 0pt \cr
      \else
	    \pdfimageresolution=96
        \ifdim \obrazekx = 0pt
          \ifdim \obrazeky = 0pt \immediate\pdfximage {#1.\obrprip}
          \else \immediate\pdfximage height \obrazeky {#1.\obrprip} \fi
        \else
          \ifdim \obrazeky = 0pt
            \immediate\pdfximage width \obrazekx {#1.\obrprip}
          \else
            \immediate\pdfximage width \obrazekx height \obrazeky {#1.\obrprip}
          \fi
        \fi
        \pdfrefximage \pdflastximage \cr
      \fi
      \if #2\relax \else
        \vbox to8pt{}
     \line{\hfil{\it Obrázek \thebook\the\cisobr. #2}\hfil}\cr\cr \fi }}}
     \vskip 0pt}
\edefverb
%   A reference na obrázky:
% \defverb
\def\obrlabel #1{
   \immediate\write\REF{\string\obrREF{\the\bookno#1}{\thebook\the\cisobr}}}
\def\obrref #1{\expandafter\ifx\csname obr:\the\bookno#1\endcsname \relax
   \message{Warning: Undefined pic number [#1]}(??)%
   \else\csname obr:\the\bookno#1\endcsname\fi}
\def\obrREF #1#2{\expandafter\ifx\csname obr:#1\endcsname \relax
      \expandafter\def \csname obr:#1\endcsname {#2}
   \else \errmessage{Error: Double pic mark [#1]}\fi}
\edefverb
%  \subsection{Verbatim}
%   Prostředí verbatim jsem v souboru maker věnoval velkou pozornost
%   vzhledem k předpokládanému využití při dokumentování zdrojových kódů
%   programů.
%   \subsubsection{Nečíslovaný verbatim}
%   Tato základní verze verbatim prostředí pouze definuje kategorii
%   speciálních znaků jako 12, tedy z nich udělá \uv{obyčejné} znaky, dále
%   definuje odstavec (\texmac{\\par}) takovým způsobem, aby se provedlo i
%   vícenásobné zařádkování a nastaví takový význam mezer, že jsou
%   interpretovány i mezery na začátku řádku.
% \defverb
{\obeyspaces \gdef\activespace{\obeyspaces\let =\ }}
{\obeyspaces \gdef\activespace{\obeyspaces\let =\ }}
\def\setverb{\def\do##1{\catcode`##1=12}\dospecials}
\def\verb{\bgroup \setverb\activespace%
          \everypar{\hskip 10pt}
          \def\par##1{\endgraf\ifx##1\par\leavevmode\fi ##1}
          \parskip=0pt\obeylines\startverb}
{\catcode`\|=0 \catcode`\\=12
          |gdef|startverb#1\everb{|tt#1|egroup}}
\edefverb
%   \subsubsection{Verbatim s číslováním řádek}
%   Pro číslování řádek ve verbatim prostředí byla zavedeno další makro
%   \texmac{\\cverb}, které navíc vkládá při každém odstavci (tj. v našem
%   případě na každém zlomu řádku) číslo řádky, které se počítá od začátku
%   dokumentu nebo od volání makra \texmac{\\begcfile}, které nuluje
%   počitadlo řádek \texmac{\\cverbline}.
%
%   Dále se vyhodnocuje definování makra \texmac{\\verblinefile}, které
%   pokud je 1, použije se skutečné číslo řádek ve vstupním souboru, jinak
%   se čísluje výše uvedeným způsobem závislým pouze na volání makra
%   \texmac{\\begcfile}
% \defverb
\def\setcverb{\def\do##1{\catcode`##1=12}\dospecials}
\def\cverb{%
           \if1\verblinefile\cverbline=\inputlineno\else\fi
           \vskip 0pt %\par
           \bgroup\setcverb\activespace%
           \everypar{\global\advance\cverbline by1%
                     \hbox to24pt{\hfil\the\cverbline}\qquad}
           \def\par##1{\endgraf\ifx##1\par\leavevmode\fi ##1}
           \parskip=0pt\catcode47=12\obeylines\startcverb}
{\catcode`\|=0 \catcode`/=12 \catcode`\\=12
          |gdef|startcverb#1\ecverb{|tt#1|egroup|vskip0pt}}
\newcount \cverbline
\def\begcfile{\cverbline = 0}
\def\verblinefile{0}
\edefverb
%   \subsubsection{Vkládání C++ a Tcl zdrojovvých souborů}
%   Pro tuto funkci je znak / resp. \#{} definován jako aktivní
%   (catcode 13) s tím,
%   že funguje jako makro (\texmac{\\ccomment}) a je-li následován
%   dalším lomítkem (v C++), tato sekvence je
%   ignorována. V opačném případě se vysází lomítko i následující znak.
%
%   Ke vložení souboru slouží 2 makra. \texmac{\\csrctldocinput} navíc
%   definuje \texmac{\\verblinefile} jako 1 a řádky jsou tedy číslovány
%   \uv{skutečně}. Makro \texmac{\\csrcdocinput} pouze vynuluje čítač
%   řádek prostředí verbatim a zdrojový kód C++ programu je číslován, jako by
%   v C++ souboru dokumentace chyběla.
% \defverb
{\catcode47=13
\gdef\ccomment#1{\ifx#1/\relax\else{\char47{}#1}\fi}
\gdef\csrctldocinput #1 {{\def\verblinefile{1}
                          \def\startcverb{\startcppverb}
                          \catcode47=13 \def/{\ccomment} \input #1 }}
\gdef\csrcdocinput #1 {{\begcfile
                          \def\startcverb{\startcppverb}
                          \catcode47=13 \def/{\ccomment} \input #1 }}}
{\catcode47=12 \catcode`\|=0 \catcode`\\=12
                  |gdef|startcppverb#1//\ecverb{|tt#1|egroup}}
\edefverb
%   Podobně fungují i makra pro vkládání zdrojových Tcl souborů,
%   ingorovány jsou naprosto všechny znaky \#{} a navíc bylo nutno
%   změnit \texmac{\\catcode} znaku $|$, který zde zastupuje
%   znak \#{} v definicích maker. Dále jsem musel předefinovat
%   definice \texmac{\\startcverb}, aby verbatim prostředí
%   obsahovalo i poslední znak \#{} před každým ukončením verbatimu.
% \defverb
{\catcode35=13 \catcode124=6
\long\gdef\tclcomment{\relax}
\gdef\tclsrctldocinput |1 {{\def\verblinefile{1}
                            \def\startcverb{\starttclverb}
                            \catcode35=13 \def#{\tclcomment} \input |1 }}
\gdef\tclsrcdocinput |1 {{\begcfile
                          \def\startcverb{\starttclverb}
                          \catcode35=13 \def#{\tclcomment} \input |1 }} }
{\catcode`\#=12 \catcode`\|=6 \catcode`/=0 \catcode`\\=12
                  /gdef/starttclverb|1#\ecverb{/tt|1/egroup}}
\edefverb
%  \subsection{Parametry \TeX tu}
%   Další definice se týkají definování používaných typů fontů, rozměrů
%   zrcadla pro sazbu, parametrů pro sazbu mezer a penalt pro zalamování
%   v různých částech dokumentu.
% \defverb
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% DEFINICE FONTŮ PRO rm10 %%%%%%%%%%%%%%%%%%%%%%%%
% je-li definováno \aFive, použijí se parametry pro formát A5
\expandafter\ifx\csname aFive\endcsname \relax
 \font\rm = csr10
 \font\bf = csbx10
 \font\it = csti10
 \font\tt = cstt10
 \font\sl = cssl10
 \font\sss = csss12
 \font\maly = csr8
 \font\malit = csti8
 \font\malytt = cstt9
 \font\big = csr10 scaled\magstep1
 \font\bigit = csti10 scaled\magstep1
 \font\bigbf = csbx10 scaled\magstep1
 \font\bigg = csr10 scaled\magstep2
 \font\biggg = csr10 scaled\magstep3
 \font\bigggg = csr10 scaled\magstep4
 \font\biggggss = csss12 scaled\magstep4
\else
 \font\rm = csr8
 \font\bf = csbx8
 \font\it = csti8
 \font\tt = cstt8
 \font\sl = cssl8
 \font\sss = csss10
 \font\maly = csr7
 \font\malit = csti7
 \font\malytt = cstt8
 \font\big = csr8 scaled\magstep1
 \font\bigit = csti8 scaled\magstep1
 \font\bigbf = csbx8 scaled\magstep1
 \font\bigg = csr8 scaled\magstep2
 \font\biggg = csr8 scaled\magstep3
 \font\bigggg = csr8 scaled\magstep4
 \font\biggggss = csss8 scaled\magstep4
\fi
\rm
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ROZMĚRY TeXTU PRO A4 %%%%%%%%%%%%%%%%%%%%%%%%%%%
\expandafter\ifx\csname aFive\endcsname \relax
 \hsize 16 cm                % šířka
 \vsize 23.5 cm              % výška
 \hoffset 0 cm               % horizontální ofset
 \voffset 0.3 cm             % vertikální ofset
 \parindent 0 pt             % odsazení začátku odstavce
 \baselineskip 12 pt         % řádkování
 \parskip 10 pt              % proklad při \par
 \raggedbottom               % vynechávat místo na stránce
 \emergencystretch=4em       % natahovatelnost mezer
 \lineskip=0pt               % proklad řádků (vzdálenost boxů)
 \bigskipamount=12pt         % deformovatelné výplňky - velký
 \medskipamount=6pt          % ...                    - střední
 \smallskipamount=3pt        % ...                    - malý
 \widowpenalty=10000         % penalta za vdovy
 \clubpenalty=10000          % penalta za sirotky
 \expandafter\ifx\csname pdfoutput\endcsname \relax \else
  \pdfhorigin=2.53cm
  \pdfvorigin=2.83cm
  \pdfpagewidth=21cm
  \pdfpageheight=29.7cm
  \pdfdestmargin=2mm
 % \pdfthreadmargin=12pt%1em
  % nasledujici bude predefinovano v pdfcolor.tex, pokud bude toto ovsem
  % dostupne... Musi byt definovano az za definice softinput!
  \def\Blue{} \def\Black{}
  \softinput{pdfcolor.tex}
 \fi
\else
 \hsize 12 cm                % šířka
 \vsize 17.0 cm              % výška
 \hoffset -1.0 cm               % horizontální ofset
 \voffset -0.8 cm             % vertikální ofset
 \parindent 0 pt             % odsazení začátku odstavce
 \baselineskip 10 pt         % řádkování
 \parskip 8 pt              % proklad při \par
 \raggedbottom               % vynechávat místo na stránce
 \emergencystretch=4em       % natahovatelnost mezer
 \lineskip=0pt               % proklad řádků (vzdálenost boxů)
 \bigskipamount=10pt         % deformovatelné výplňky - velký
 \medskipamount=5pt          % ...                    - střední
 \smallskipamount=2.5pt        % ...                    - malý
 \widowpenalty=10000         % penalta za vdovy
 \clubpenalty=10000          % penalta za sirotky
 \expandafter\ifx\csname pdfoutput\endcsname \relax \else
  \pdfhorigin=2.5cm
  \pdfvorigin=2.5cm
  \pdfpagewidth=148.5mm
  \pdfpageheight=21.0cm
  \pdfdestmargin=1.5mm
 % \pdfthreadmargin=12pt%1em
  % nasledujici bude predefinovano v pdfcolor.tex, pokud bude toto ovsem
  % dostupne... Musi byt definovano az za definice softinput!
  \def\Blue{} \def\Black{}
  \softinput{pdfcolor.tex}
 \fi
\fi
\edefverb
%  \subsection{Záhlaví a pata stránky}
%   Definice záhlaví a paty stránky je rozdělena do dvou částí:
%   \begitem
%     \item pro různé sudé a liché stránky (oboustranný tisk)
%     \item pro všechny stránky stejné
%   \enditem
%   Která varianta se použije je dáno \uv{ručním přepínačem} ---
%   podmínkou \texmac{\\if} (viz. kód níže).
%  \par
%   Definice si kontrolují, zda se kompiluje jen jedna kniha nebo větší
%   celek a podle toho dosazují do záhlaví název knihy nebo hlavní
%   kapitoly, u oboustranného režimu se střídá umístění v pravé a levé
%   části záhlaví.
%
%   Pata stránky vypadá vždy stejně: je na ní pouze číslo stránky, u
%   oboustranného režimu umístěné střídavě vpravo a vlevo.
%  \par
%   Pomocné makro \texmac{\\headkapname} kontroluje, zda nezačala nová
%   kapitola na aktuální stránce a podle toho dosadí správný řetězec
%   (při kompilaci jediné knihy by měl být v záhlaví jen název první
%   kapitoly na stránce).
% \defverb
\def\headkapname{\ifnum \lastpagekap = \pageno \lpagefkap\else\lpagelkap\fi}

\if 10                                             % ,,ruční přepínač`` režimu
\headline{\ifodd \the\pageno                              % Ruzne sude a liche
            \expandafter\ifx\csname maindoccs\endcsname \relax
              {\malit\hrulefill~\lower2.3pt\hbox{\headkapname}}
            \else {\malit\hrulefill~\lower2.3pt\hbox{\thebook\bookname}}
            \fi
          \else \expandafter\ifx\csname maindoccs\endcsname \relax
              {\malit\lower2.3pt\hbox{\headkapname}~\hrulefill}
            \else {\malit\lower2.3pt\hbox{\thebook\bookname}~\hrulefill}\fi\fi}
          \footline{\ifodd \pageno \hfill{\bf \the\pageno}
                          \else {\bf \the\pageno}\hfill \fi}
\else\headline{                                       % Vsechny stranky stejne
 \expandafter\ifx\csname maindoccs\endcsname \relax
      {\malit\hrulefill~\lower2.3pt\hbox{\headkapname}}
   \else
      {\malit\hrulefill~\lower2.3pt\hbox{\thebook\bookname}}
   \fi}
 \footline{{\bf\hfill~\the\pageno}}
\fi
\edefverb
%  \subsection{Načtení referencí}
%   V tomto místě je již možno načíst reference z předchozího běhu \TeX u,
%   protože jsou již definována všechna makra všech typů referencí. Po
%   jejich načtení je soubor jobname.ref smazán, resp. otevřen jako
%   prázdný pro další zápis referencí v aktuálním průchodu \TeX
%   procesoru.
% \defverb
\softinput{\jobname.ref}
\immediate\openout\REF=\jobname.ref
\edefverb
%  \subsection{Titulní stránka knihy}
%   Jako titulní stránku knihy vysází makro \texmac{\\titulknihy}
%   uprostřed samostatné stránky tělo maker
%   \texmac{\\nazev} a \texmac{\\podnazev}, dále vpravo dole obsah makra
%   \texmac{\\autor}.
%
%   Na titulní stránce je vypnuta hlavička i patička stránky i očíslování
%   číslem stránky. Makro \texmac{\\titulknihy} je voláno makrem
%   \texmac{\\kniha}, které definuje všechny tři potřebné údaje pro jeho
%   sazbu.
% \defverb
\def\titulknihy{{%
 \headline{\hfil} \footline{} \nopagenumbers \vbox to3cm{ } \vfil
 \centerline{{\bigg\nazev}}\vskip 6pt \centerline{{\big\podnazev}}
 \vfil \vbox to5cm{ } \rightline{\autor} \eject}}
\edefverb
%   \subsection{Titulní stránka dokumentace}
%   Titulní stránka celé dokumentace složené z více knih se sází podobně
%   jako titulní stránka knihy s tím rozdílem, že je uživatelem přímo
%   voláno makro \texmac{\\maindoc}.
%   Nejdříve v něm definuji kontrolní sekvenci \texmac{maindoccs} a v
%   případě, že byla tato již definována, ohlásí \TeX{} chybu.
%   Dále je definován \texmac{\\konecknihy} jako \texmac{\\endinput}, tedy
%   ukončení souboru s knihou (v přípdě kompilace pouze jedné knihy je
%   toto makro definováno jako \texmac{\\end}, aby se ukončil kompletně
%   běh \TeX u).
%
%   Na kontrolní sekvenci \texmac{maindoccs} pak testují různá makra, zda
%   se mají chovat jako v jediné knize nebo větším dokumentačním celku.
% \defverb
\def\maindoc #1#2#3{%
  \expandafter\ifx\csname maindoccs\endcsname \relax
    \expandafter\def \csname maindoccs\endcsname {}
    \else \errmessage{Error: Nelze mit dvakrat maindoc}\fi
  \def\konecknihy{\endinput}
\edefverb
%   Následující část makra \texmac{\\maindoc} sází titulní stránku
%   dokumentace podobným způsobem jako makro \texmac{\\titulknihy},
% \defverb
  {\headline{\hfil}\footline{}\nopagenumbers
    ~ \vfil\newline
    \centerline{\vbox{\halign{\strut\hfil##\hfil\cr
                           {\bigg #1}\cr~\cr{\big #2}\cr}}}
    \vfil\eject\pageno = 1
    \edefverb
%   ale s tím rozdílem, že místo \texmac{\\autor} se sází na samostatné
%   stránce anotace (umisťují se zde např. autoři, vydavatel,
%   copyright\dots), zde je použito prostředí \texmac{\\halign}:
% \defverb
    \bgroup
    ~\vfil\newline\baselineskip 10 pt \malit
    \leftline{\vbox{\halign{ ##\hfil\cr #3 \crcr}}}
    \egroup
    \vskip 1.5cm\eject}}
\edefverb
%   Tím popis je algoritmů dokumentačních maker ukončen. V následující
%   kapitole se ještě zmíním o možnostech samodokumentování tohoto balíku.
%
%   \section{Systém autodokumentace}
%     Sám sebe dokumentující systém mě napadl při zevrubném seznámení se s
%     balíkem docstrip. Rozhodl jsem se tedy něco podobného navrhnout při
%     dokumentování mého systému \MDef .
%    \subsection{Princip autodokumentace}
%     Dokumentace funguje podobně jako prostředí verbatim, začátek a
%     konec zdrojového kódu se označuje makry \texmac{\\defverb} a
%     \texmac{\\edefverb} a to, co není mezi těmito značkami by mělo být
%     \uv{schováno} za procentem na začátku řádku, které je při
%     \uv{dokumentačním} průchodu \TeX em ignorováno a při běžném načítání
%     souboru \soubor{mdef.tex} se považuje za běžný komentář.
%     Tím je docíleno, že při prvním průchodu souboru mdef.tex se celá
%     dokumentace ignoruje (Uživatelská část je postavena do podmínky
%     \texmac{\\if}, kde jsou dvě za sebou jdoucí definice stejného
%     makra, jedna z nich je v komentáři a tudíž se definuje pouze při
%     samodokumentování, u popisu maker je použito zmíněné procento všude).
%     Při souhlasném \texmac{\\jobname} s názvem
%     definičního souboru maker se předpokládá generování dokumentace sebe
%     sama a po dodefinování výše zmíněných souvislostí zavolá definiční
%     soubor sám sebe, což způsobí, že text, který byl původně komentářem
%     je dokumentací a označený zdrojový text definic formátů a příkazů je
%     vypsán jako číslovaný verbatim.
%   \par
%     Zahrnutí popisu tohoto dokumentačního systému do jiné dokumentace
%     jako kniha je možné pomocí makra \texmac{\\autodoc} (resp.
%     \texmac{\\autodocsrc} nebo \texmac{\\autodocman}, viz. kapitolu
%     \secref{DocOstPrik}) v případě, že
%     soubor \soubor{mdef.tex} se nachází v aktuálním adresáři (z nějž
%     je \TeX{} spuštěn).
%  \reklama \newpage \endinput
%  \newpage \endinput
%%%%%%%%%%%%%%%% Tímto skončila dokumentace mdef.tex %%%%%%%%%%%%%%%%%%%%%
%\defverb
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%% Zde je inputnutý celý soubor maker i s vestavěnou dokumentací %%%%%%%%%
%%%%%%%% pomocí \defverb a \edefverb místo standartních příkazů... %%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
{\catcode`\|=0 \catcode`\\=12
          |gdef|startdefverb#1\edefverb{|malytt#1|egroup|vskip -|parskip}}
{\catcode13=12 \gdef\commentline#1^^M{\relax\catcode13=5}}
{\obeyspaces \gdef\activespace{\obeyspaces\let =\ }}
{\catcode37=13
   \gdef\autodoc{{
   \def\setdefverb{\def\do####1{\catcode`####1=12}\dospecials}
   \def\defverb{~\par~\vskip -\parskip\vskip -\parskip\vskip 4pt
           \bgroup\setdefverb\activespace
           \everypar{\global\advance\cverbline by1
                     \hbox to20pt{\hfil\the\cverbline}\quad}
           \def\par####1{\endgraf\ifx####1\par\leavevmode\fi ####1}
           \parskip=-4pt\parindent=0pt\obeylines\startdefverb}
   \cverbline = 0 \catcode37=13
   \long\def%##1 {\ifx %##1 \catcode13=12\commentline \else ##1\fi}
   \input mdef.tex }}
\gdef\autodocsrc{{\def\autodocmanual{0}\def\autodocsource{1}\autodoc}}
\gdef\autodocman{{\def\autodocmanual{1}\def\autodocsource{0}\autodoc}}
}


\def\autodocmanual{1}
\def\autodocsource{1}

% vzhledem k podivnostem operačních systémů nejmenované firmy M$
% je potřeba testovat \jobname tímhle hrozným způsobem...
\expandafter\def\csname JobName:\jobname\endcsname{}
\expandafter\ifx\csname JobName:MDEF\endcsname \relax
 \expandafter\ifx\csname JobName:mdef\endcsname \relax
  \expandafter\ifx\csname JobName:Mdef\endcsname \relax
   \expandafter\endinput\fi\fi\fi
% ... Ale možná by to šlo lépe pomocí něčeho jako tolower uvnitř csname?

\expandafter\ifx\csname defverb\endcsname \relax \relax \else \endinput \fi
\message{Vytvářím autodokumentaci...}
\autodoc
\end