Skip to content
Snippets Groups Projects
Select Git revision
  • 34c279b17be526831b2b00ff0fe0e94ad0d32044
  • master default protected
2 results

adsmac.tex

  • adsmac.tex 26.78 KiB
    % (c) 2007--2022 Martin Mareš <mj@ucw.cz>
    % (c) 2014 Tomas Valla <tom@ucw.cz>
    
    % Inicializace luaTeXu, aby umel hledat bitmapove fonty
    \directlua{kpse.init_prog("luatex", 600, "ljfour")}
    
    \input ltluatex.tex
    \input luatex85.sty
    \input ucwmac2.tex
    \ucwmodule{paper}
    \ucwmodule{verb}
    \ucwmodule{ref}
    \input lua-ofs.tex
    \input amssym.tex
    \input pdf-trans.tex
    
    % Chceme pouzivat interni plainova makra (nebojte, jen na chvili)
    \catcode`@=11
    
    % Registry pro vsechny pripady
    \newtoks\brumtoks
    \newbox\brumboxa
    \newbox\brumboxb
    \newbox\brumboxc
    
    %%% Módy sazby %%%
    
    % \modeprint	verze pro tisk (bez barevných stránek apod.)
    % \modeafive	přeformátovat na A5
    % \modeebook	E-booková verze (includuje ebook.tex, který předefinuje
    %		některá makra)
    % \modemobi	E-book v MOBI (navíc k předchozímu módu)
    
    \newif\ifebook
    \newif\ifmobi
    \newif\ifprint
    \newif\ifcropmarks
    
    \ifx\modeprint\relax
    \printtrue
    \cropmarkstrue
    \pdfvariable objcompresslevel=0
    \else
    \printfalse
    \fi
    
    %%% Zakladni parametry %%%
    
    % B5 s okraji, sázíme na zrcadlo velikosti 136 mm x 173.567 mm
    \setpaper{b5}
    \topmargin=34mm
    \bottommargin=42.433mm
    \setinneroutermargin{25mm}{15mm}
    \setuppage
    
    \def\fullpage{
    	\setmargins{0mm}
    	\setuppage
    }
    
    \newdimen\cropmargin
    \newdimen\cropgap
    \cropmargin=20pt
    \cropgap=6pt
    
    \newdimen\stdbaselineskip
    \stdbaselineskip=12bp
    \normalbaselineskip=\stdbaselineskip
    \normallineskip=1pt
    \normallineskiplimit=0pt
    \normalbaselines
    \r@ggedbottomtrue
    \topskip=10bp plus 12bp
    
    \clubpenalty=5000
    \widowpenalty=5000
    
    \newdimen\normalparindent
    \normalparindent=0pt
    \parindent=\normalparindent
    \parskip=8bp plus 1pt minus 1pt
    \def\unparskip{\vskip-\parskip}
    \def\narrower{\advance\leftskip by 2em\advance\rightskip by 2em}
    
    \bigskipamount=12bp plus 3pt minus 2pt
    \medskipamount=8bp plus 1pt minus 1pt
    \smallskipamount=2bp plus 1pt minus 0.5pt
    
    \preitemizepenalty=0
    \postitemizepenalty=0
    \preitemizeskip=0pt
    \postitemizeskip=0pt
    \interitemskip=\medskipamount
    \itemindent=2em
    \itemnarrow=0pt
    \nesteditemindent=2em
    \nesteditemnarrow=0pt
    \prenesteditemizeskip=\smallskipamount
    \postnesteditemizeskip=\smallskipamount
    
    \let\ucwlist=\list
    \def\list{\preitemizeskip=0pt\interitemskip=\medskipamount\ucwlist}
    \def\tightlist{\preitemizeskip=\dimexpr\medskipamount-\smallskipamount\relax\interitemskip=\smallskipamount\ucwlist}
    
    \abovedisplayskip=\bigskipamount
    \abovedisplayshortskip=\abovedisplayskip
    \belowdisplayskip=\abovedisplayskip
    \belowdisplayshortskip=\belowdisplayskip
    % \predisplaypenalty=100
    
    \verbstartskip=\bigskipamount
    \verbendskip=0pt
    \verbinterlineskip=0pt
    \verbemptylineskip=\medskipamount
    \verbleftskip=0in
    \verbrightskip=0pt plus 1fil
    
    % Překládáme celou knihu, nebo jenom kapitolu?
    \newif\ifsinglechapter
    \ifx\wholebook\undefined
    	\singlechaptertrue
    \else
    	\singlechapterfalse
    \fi
    
    % Bitmapové obrázky jsou v 600 DPI
    \pdfvariable imageresolution=600
    
    %%% Deleni slov %%%
    
    \uselanguage{czech}
    \frenchspacing
    \lefthyphenmin=2
    \righthyphenmin=2
    \automatichyphenmode=2
    \hyphenation{Quick-sort Quick-sor-tu nej-men-ší-ho aby-chom}
    
    %%% Drobnosti %%%
    
    % Zvyrazneni pojmu
    \protected\def\em#1{{\it #1\/}}
    
    % Asymptoticke O-cko
    \protected\def\O{{\cal O}}
    
    % Konkatenace
    \def\concat{\mathop{\Vert}}
    
    % Číselné obory
    \def\N{{\bb N}}
    \def\R{{\bb R}}
    \def\Z{{\bb Z}}
    \def\Q{{\bb Q}}
    
    % Teorie čísel
    \def\Zp{{\bb Z}_p}
    \def\Zsp{{\bb Z}^*_p}
    \def\Zn{{\bb Z}_n}
    \def\Zsn{{\bb Z}^*_p}
    \def\divs{\mathbin\backslash}
    \def\inv{^{-1}}
    
    % Komplexni cisla
    \def\C{{\bb C}}
    \def\ii{\mkern 0.5mu{\bf i}}
    \def\im{{\bf i}}
    \def\e{{\rm e}}
    
    % Binární abeceda
    \def\B{\{0,1\}}
    
    % Kaligraficka pismenka
    \protected\def\Bb{{\cal B}}
    \protected\def\Cc{{\cal C}}
    
    % Booleovské operace
    \def\NOT{\cscop{not}}
    \def\AND{\cscop{and}}
    \def\OR{\cscop{or}}
    \def\NAND{\cscop{nand}}
    \def\NOR{\cscop{nor}}
    \def\XOR{\cscop{xor}}
    \protected\def\cscop#1{\ifmmode\mathbin{\hbox{\csc #1}}\else{\csc #1}\fi}
    
    % Pravděpodobnost
    \def\E{{\bb E}}
    \def\Pr{{\rm Pr}\mkern0.5mu}
    \def\Prsub#1{{\rm Pr}_{#1}}
    
    % Vektory
    \def\t{{\bf t}}
    \def\x{{\bf x}}
    \def\y{{\bf y}}
    \def\z{{\bf z}}
    
    % Transpozice matice
    \def\T{^{\rm T}}
    
    % Slozitostni tridy
    \protected\def\cc#1{\hbox{\setfonts[LMSans/]\rm #1}}
    \def\P{\cc{P}}
    \def\NP{\cc{NP}}
    
    % Viceznakove identifikatory (funguji jak v textovem, tak matematickem modu)
    \def\<#1>{\ifmmode\mathchoice
    	{\hbox{\it #1\/}}%
    	{\hbox{\it #1\/}}%
    	{\hbox{\it\setfonts[/7] #1\/}}%
    	{\hbox{\it\setfonts[/5] #1\/}}%
    \else\leavevmode\hbox{\it #1\/}\fi}
    
    % \noindent se casto hodi, tak na nej mame zkratku
    \let\>=\noindent
    
    % Znacka na konci dukazu
    \def\qed{{\parfillskip=0pt\allowbreak\hfill\nobreak $\square$\par}}
    
    % ... pokud je v seznamu:
    \def\qeditem{{\parfillskip=0pt\hfill\rlap{\hskip\rightskip\llap{$\square$}}\par}}
    
    % ... pokud je v seznamu druhe urovne (bylo by pekne zautomatizovat):
    \def\qeditemitem{{\parfillskip=0pt\hfill\rlap{\hskip\nesteditemnarrow\llap{$\square$}}\par}}
    
    % ... pokud je za displayed math:
    \def\qedmath{\vskip-\baselineskip\rightline{$\square$}}
    
    % Velmi vhodné místo k lomu stránky (silnější verze \filbreak)
    \def\xfilbreak{\par\vfil\penalty-1000\vfilneg}
    
    % Poznamky pod carou
    \newcount\footcnt
    \footcnt=0
    \def\foot#1{%
    	\nobreak\hskip 0pt  % Allow hyphenation of the preceding word
    	\global\advance\footcnt by 1\footmark{\the\footcnt}%
    	\insert\footins{
    		\interlinepenalty=\interfootnotelinepenalty
    		\splittopskip=\ht\strutbox
    		\splitmaxdepth=\dp\strutbox
    		\floatingpenalty=20000
    		\leftskip=0pt
    		\rightskip=0pt
    		\parskip=0pt
    		\setfonts[LMRoman/8]\setmath[//]\fixsetmath\rm
    		\baselineskip=10pt
    		\noindent\vrule height 10pt depth 2pt width 0pt\hbox to 1.5em{\footmark{\the\footcnt}\hfil}%
    		#1 \vrule height 0pt depth 2pt width 0pt
    	}%
    }
    \def\footmark#1{$^{\left<#1\right>}$}
    \def\footnoterule{\kern-1bp \hrule width 25mm height 1bp}
    
    \skip\footins=1.1\bigskipamount
    \count\footins=1000
    \dimen\footins=0.3\vsize
    
    % Alias pro rovnítko, když ho potřebujeme použít v rejstříkovém hesle
    \protected\def\equals{=}
    
    % Odrážka "(x)" pro \numlist
    \def\nparenp{(\nnorm)}
    
    % Break radku
    \def\\{\hfil\break}
    
    % Značka pro stupeň
    \def\degree{^\circ}
    
    % Stupeň vrcholu
    \def\degin{\deg^{\rm in}}
    \def\degout{\deg^{\rm out}}
    
    % Rozdělitelná pomlčka (pozor, v algoritmech se \= předefinuje na přiřadítko)
    % Taktéž pozor, že explicitní pomlčky (ať už "-" nebo "\=") potlačují implicitní dělení slov.
    \def\={\discretionary{-}{-}{-}}
    
    % Slovo sázené typewriterem: \|řetězec|
    \def\|#1|{\hbox{\tt #1}}
    % \setmath resetuje \|, tak ho musíme předefinovat zpět
    \let\backuptw=\|
    \def\fixsetmath{\let\|=\backuptw}
    
    % Znaky abecedy
    \def\0{\|0|}
    \def\1{\|1|}
    \def\2{\|2|}
    \def\3{\|3|}
    \def\9{\|9|}
    \def\sp{\hbox{\tentt\char32}}
    
    % Předefinujeme vlnovku, aby byla \protected
    \let\plaintilde=~
    \protected\def~{\plaintilde}
    
    %%% Fonty %%%
    
    \def\chapfont{\setfonts[LMSansDC/24]}
    \def\secfont{\setfonts[LMSansDC/17]}
    \def\subsecfont{\bf}
    
    \def\sepfont{\setfonts[LMRoman/30]\bf}
    \def\pagenumfont{\setfonts[LMRoman/10]\rm}
    
    \protected\def\captionfont{\setfonts[LMSans/9]\setmath[//]\fixsetmath\baselineskip=11bp}
    
    
    %%% Sazba algoritmu %%%
    
    %	\algo{jmeno algoritmu}
    %	\algin popis vstupu
    %	\:krok
    %	\:krok
    %	\::[identifikator]vnoreny krok
    %	\algout popis vystupu
    %	\endalgo
    
    \def\algoinit{
    \goodbreak
    \begingroup
    \itemnarrow=\itemindent
    \interitemskip=1pt
    \preitemizeskip=\bigskipamount
    \postitemizeskip=\dimexpr \bigskipamount - \parskip \relax
    \inititemize
    \let\:=\algoitem
    \def\={\leftarrow}
    \itemcount=0
    }
    \def\typedalgo#1#2{\algoinit {\bo #1\/} \alg{#2}}
    \def\algo#1{\typedalgo{Algoritmus}{#1}\if"#1"\else\rr{algoritmus/\alg{#1}}\fi}
    \def\proc#1{\typedalgo{Procedura}{#1}\if"#1"\else\rr{procedura/\alg{#1}}\fi}
    \def\headlessalgo{\algoinit}
    \def\endalgo{\goodbreak\endlist\endgroup}
    \let\endproc=\endalgo
    \def\algopar{\par
    \parindent=2em
    \hangindent=2.5em	% \parindent + sirka boxu na cislo kroku
    \hangafter=1
    \leavevmode
    }
    \def\algoitem{
    \ifnum\itemcount=0\par\nobreak\smallskip\fi
    \algopar\advance\itemcount by 1
    \hbox to 0.5em{\hss \the\itemcount.~~}%
    \futurelet\next\algoitemh}
    \def\algoitemh{\ifx\next:\let\next=\algohang\else\let\next=\algoitemgo\fi\next}
    \def\algohang:{\advance\hangindent by 2em \hskip 2em\futurelet\next\algoitemh}
    \optdef\algoitemgo{\addid{item}{\the\itemcount}}
    \def\algin{\par\nobreak{\it Vstup:\/} }
    \def\algout{\par\nobreak\parindent=0pt{\it Výstup:\/} }
    \def\alginbreak{\hfil\break\hphantom{\it Vstup:\/} }
    \def\algalias#1{ (#1)}
    
    % Jmeno algoritmu v textu nebo ve formuli
    \protected\def\alg#1{\leavevmode\hbox{\csc #1}}
    
    %%% Konstrukce pouzivane v algoritmech %%%
    
    % Komentar
    \def\cmt#1{\unskip~~\hfill\fullcmt{#1}\ignorespaces}
    \def\fullcmt#1{{$\triangleleft$\hskip0.5em\it #1}}
    
    %%% Kapitoly %%%
    
    \newcount\pseudochapcount
    \newcount\chapcount
    \newcount\seccount
    \newcount\figcount
    \pseudochapcount=0
    \chapcount=0
    \seccount=0
    \figcount=0
    
    \newwrite\tocfile
    \immediate\openout\tocfile=toc-new.aux
    
    % Voláme: \addtoc\tocmacro{number}{asterisks}{title}
    \long\def\addtoc#1#2#3#4{
    	\edef\brum{
    		\write\tocfile{\string#1{\noexpand\the\noexpand\count0}{#2}{#3}{#4}}
    		\ifprint\else
    			\pdfextension dest name {s#2} xyz\relax
    		\fi
    	}
    	\brum
    }
    
    \def\doubleeject{
    	\vfill\supereject
    	\ifodd\pageno\else
    		\null
    		\vfill\eject
    	\fi
    }
    
    \def\separatorpage#1{{
    	\vfill\supereject
    %%	\doubleeject
    %%	\barepage
    %%	\let\background=\separatorbackground
    %%	\vglue 0.3\vsize
    %%	\baselineskip=36bp
    %%	\rightskip=0pt plus 0.5\hsize
    %%	\sepfont
    %%	\hyphenpenalty=1000
    %%	#1
    %%	\doubleeject
    }}
    
    % Kapitola bez nadpisu
    \def\dofakechapter#1{
    	\separatorpage{#1}
    	\advance\pseudochapcount by 1
    	\seccount=1000
    	\figcount=1000
    	\ifebook\else\footcnt=0\fi
    	\addid{ch}{0\the\pseudochapcount}
    	\addtoc\tocchapter{0\the\pseudochapcount}{}{#1}
    	\def\currentchapter{???}
    	\mark{#1}
    }
    \def\fakechapter{\withoptarg\dofakechapter}
    
    % Nečíslovaná kapitola
    \optdef\pseudochapter#1{
    	\dofakechapter{#1}
    	\chapterheading{#1}
    	\bigskip
    	\unparskip
    }
    
    \optdef\chapter#1{
    	\advance\chapcount by 1
    	\def\chaptername{#1}
    	\separatorpage{\chapnumber~#1}
    	\seccount=0
    	\figcount=0
    	\ifebook\else\footcnt=0\fi
    	\addid{ch}{\chapnumber}
    	\addtoc\tocchapter{\chapnumber}{}{#1}
    	\chapterheading{\chapnumber~~#1}
    	\def\currentchapter{\chapnumber}
    	\mark{\currentchapter~#1}
    	\bigskip
    	\unparskip
    }
    
    \optdef\appendix#1{
    	\ifnum\chapcount<50 \chapcount=50\fi
    	\advance\chapcount by 1
    	\def\chaptername{#1}
    	\separatorpage{Dodatek \chapnumber\hfil\break #1}
    	\seccount=0
    	\figcount=0
    	\ifebook\else\footcnt=0\fi
    	\addid{ch}{\chapnumber}
    	\addtoc\tocchapter{\chapnumber}{}{#1}
    	\chapterheading{\chapnumber~~#1}
    	\def\currentchapter{\chapnumber}
    	\mark{\currentchapter~#1}
    	\bigskip
    	\unparskip
    }
    
    \def\chapnumber{\ifnum\chapcount < 50 \the\chapcount\else A\fi}
    
    \optdef\section#1{
    	\goodbreak\bigskip\bigskip
    	\advance\seccount by 1
    	\addid{sec}{\chapnumber.\secnumber}
    	\addtoc\tocsection{\chapnumber.\secnumber}{}{#1}
    	\sectionheading{\chapnumber.\secnumber~~#1}
    	\def\currentchapter{\chapnumber.\secnumber}
    	\mark{\currentchapter~~\chaptername~--~#1}
    	\nobreak\bigskip\unparskip\nobreak
    }
    
    \def\secnumber{\the\seccount}
    
    \optdef\sectionstar#1{
    	\goodbreak\bigskip\bigskip
    	\advance\seccount by 1
    	\addid{sec}{\chapnumber.\secnumber}
    	\addtoc\tocsection{\chapnumber.\secnumber}{*}{#1}
    	\sectionheading{\chapnumber.\secnumber\kern1pt*~~#1}
    	\def\currentchapter{\chapnumber.\secnumber}
    	\mark{\currentchapter\kern1pt*~~\chaptername~--~#1}
    	\nobreak\bigskip\unparskip\nobreak
    }
    
    \def\subsection#1{
    	\goodbreak\bigskip
    	\subsectionheading{#1}
    	\nobreak\smallskip\unparskip\nobreak
    }
    
    \def\subsectionstar#1{
    	\subsection{#1\kern1pt*}
    }
    
    \def\chapterheading#1{\leftline{\chapfont #1}}
    \def\sectionheading#1{\leftline{\secfont #1}}
    \def\subsectionheading#1{\leftline{\subsecfont #1}}
    
    \def\endchapter{
    	\let\doendchapter=\relax
    	\ifsinglechapter
    		\slet{doendchapter}{bye}  % Avoid problems with \outer
    	\fi
    	\doendchapter
    }
    
    %%% Cviceni %%%
    
    \newcount\excount
    
    \def\exercises{\subsection{Cvičení}\initexercises}
    
    \def\initexercises{
    \begingroup
    \excount=0
    \advance\leftskip by 2.2em
    \parindent=0pt
    }
    
    \def\endexercises{\endgroup}
    
    \def\exnumber{\chapnumber.\secnumber.\the\excount}
    
    \long\def\exwith#1#2{\par
    	\advance\excount by 1
    	\addid{ex}{\exnumber}
    	{
    		\exitem{#1}#2
    		\ifcsname hidx-\exnumber\endcsname
    			\unskip
    			\edef\currenthidx{\csname hidx-\exnumber\endcsname}
    			\parfillskip=0pt\allowbreak\hfill\nobreak {[\ref{hint}{\currenthidx}]}
    		\fi
    		\par
    	}
    }
    
    \def\exitem#1{\>\llap{\hbox to 2.2em{\the\excount\rlap{\kern1pt #1}.\hfil}}}
    
    % Cviceni obycejne a tezsi
    \optdef\ex{\exwith{}}
    \optdef\exx{\exwith{*}}
    \optdef\exxx{\exwith{*\kern-0.1em*}}
    
    % Napovedy a reseni k cvicenim.
    % Misto toho, abychom je primo sazeli, ukladame je ve finalni verzi knizky
    % do pomocneho souboru a z nej pak vysbirame do samostatne kapitoly.
    \newwrite\hints
    \immediate\openout\hints=hints.aux
    \long\def\hint#1{\brumtoks={#1}\immediate\write\hints{\string\posthint{\the\chapcount.\the\seccount.\the\excount}{\the\brumtoks}}}
    \long\def\solution#1{}
    
    % Pri psani se muze hodit si na chvili nechat hinty a reseni ukazat u cviceni
    \def\debughints{
    	\long\def\hint##1{\par \>\em{Hint:} ##1}
    	\long\def\solution##1{\par \>\em{Solution:} ##1}
    }
    
    \def\furtherexercises{\section{Další cvičení}\initexercises}
    
    \def\excmt#1{{\leftskip=0pt\parindent=\normalparindent #1\smallskip}}
    
    %%% Odkazy na kapitoly a jiné objekty pomocí ucw-link %%%
    
    \ifprint
    \clickablefalse
    \fi
    
    \def\relref#1#2{\reflink{#1}{#2}\relativizeref}
    
    \def\relativizeref#1{{%
    	\edef\xx{#1}%
    	\edef\xcs{\expandafter\splitab\xx.}%
    	\edef\thiscs{\chapnumber.\secnumber}%
    	\ifx\xcs\thiscs\expandafter\splitc\xx.\else\xx\fi
    }}
    
    % Deleni trojic a.b.c
    \def\splitab#1.#2.#3.{#1.#2}
    \def\splitc#1.#2.#3.{#3}
    
    % Odkazovani na objekty
    \def\chapref{\ref{ch}}
    \def\secref{\ref{sec}}
    \def\exref{\relref{ex}}
    \def\itemref{\ref{item}}
    \def\figref{\ref{fig}}
    
    % Skok na zadané číslo stránky (používá se u odkazů z obsahu a rejstříku, kde čísla stránek známe)
    \def\pagelink#1{\linkpage{#1}{#1}}
    
    %%% Obrazky %%%
    
    % Naše vlastní verze \midinsert, která se liší mezerami okolo
    \def\floatinsert#1{\par{
    	\setbox0=\vbox{\boxmaxdepth=2pt\relax #1}
    	\dimen0=\dimexpr \ht0 + \dp0 + \baselineskip + \pagetotal - \pageshrink \relax
    	\ifdim\dimen0 > \pagegoal
    		\insert\topins{
    			\penalty 100
    			\splittopskip=0pt
    			\splitmaxdepth=\maxdimen
    			\floatingpenalty=0
    			\box0
    			\nobreak\bigskip\medskip
    		}
    	\else
    		\goodbreak\bigskip
    		\box0
    		\goodbreak\bigskip
    		\unparskip
    	\fi
    }}
    
    % Obecny plovouci objekt: \float{objekt}{popisek}{optional-id}
    \def\float#1#2#3{\floatinsert{
    \medskip
    \centerline{#1}
    \medskip
    \smallskip
    {
    	\setbox0=\hbox{#2}
    	\ifdim\wd0 < 0.8\hsize
    		\centerline{\box0}
    	\else
    		\centerline{\vtop{
    			\hsize=0.8\hsize
    			\parindent=0pt
    			\leftskip=0pt plus 0.3\hsize
    			\rightskip=0pt plus 0.3\hsize
    			\parfillskip=0pt
    			\spaceskip=0.3333em
    			#2
    		}}
    	\fi
    }}}
    
    % Dva floaty vedle sebe: \float{objekt1}{popisek1}{id1}{objekt2}{popisek2}{id2}
    \def\twofloats#1#2#3#4#5#6{\floatinsert{
    \medskip
    \centerline{\vbox{\halign{\hss##\hss&\qquad\hss##\hss\cr
    #1&#4\cr
    \noalign{\medskip\smallskip}
    #2&#5\cr
    }}}
    }}
    
    % Popisek obrazku
    \def\figcaption#1{\captionfont Obrázek \chapnumber.\the\figcount: #1}
    \def\newfig{\global\advance\figcount by 1\relax\addid{fig}{\chapnumber.\the\figcount}}
    
    % Obrazek: \figure{soubor.epdf}{velikost}{popisek}
    \optdef\figure#1#2#3{\newfig\float{\rawfigure{#1}{#2}}{\figcaption{#3}}{\optargorempty}}
    \def\rawfigure#1#2{\saveimageresource #2{#1}\useimageresource\lastsavedimageresourceindex}
    
    % Obrazek sazeny TeXem: \texfigure{obrazek}{popisek}
    \optdef\texfigure#1#2{\newfig\float{#1}{\figcaption{#2}}{\optargorempty}}
    
    % Dva obrazky vedle sebe: \twofigures[id1]{soubor1.epdf}{velikost1}{popisek1}[id2]{soubor2.epdf}{velikost2}{popisek2}
    \optdef\twofigures#1#2#3{
    	\newfig\edef\brumcapa{\figcaption{#3}}
    	\setbox\brumboxa=\hbox{\rawfigure{#1}{#2}}
    	\edef\brumarga{\optargorempty}
    	\twofigurescont
    }
    \optdef\twofigurescont#1#2#3{
    	\newfig\edef\brumcapb{\figcaption{#3}}
    	\setbox\brumboxb=\hbox{\rawfigure{#1}{#2}}
    	\setbox\brumboxc=\hbox{\copy\brumboxa\copy\brumboxb}
    	\twofloats{\vbox to \ht\brumboxc{\vss\box\brumboxa\vss}}{\brumcapa}{\brumarga}{\vbox to \ht\brumboxc{\vss\box\brumboxb\vss}}{\brumcapb}{\optargorempty}
    }
    
    % Dva obrazky s jednou popiskou: \doublefigure{soubor1.epdf}{velikost1}{soubor2.epdf}{velikost2}{popisek}
    \optdef\doublefigure#1#2#3#4#5{\dotexfigure{\rawfigure{#1}{#2}\qquad\qquad\rawfigure{#3}{#4}}{#5}}
    
    % Fixovany obrazek na dane misto v textu: \displayfig{soubor.epdf}{velikost}
    \def\displayfig#1#2{\displaytexfig{\rawfigure{#1}{#2}}}
    
    % Totez pro obrazek kresleny TeXem: \displaytexfig{obrazek}
    \def\displaytexfig#1{\bigskip\centerline{#1}\bigskip\unparskip}
    
    % Totez pro dva obrazky vedle sebe: \displaydoublefig{soubor1.epdf}{velikost1}{soubor2.epdf}{velikost2}
    \def\displaydoublefig#1#2#3#4{\displaytexfig{\rawfigure{#1}{#2}\qquad\qquad\rawfigure{#3}{#4}}}
    
    %%% Vety %%%
    
    \def\s#1{\noindent{\bo #1}}
    \long\def\sbody#1{\ignorespaces #1\par}
    \def\theorem{\s{Věta:} \sbody}
    \def\theoremn#1{\s{Věta (#1):} \sbody}
    \def\lemma{\s{Lemma:} \sbody}
    \def\lemman#1{\s{Lemma (#1):} \sbody}
    \def\lemmax#1{\s{Lemma~#1:} \sbody}
    \def\lemmaxn#1#2{\s{Lemma~#1 (#2):} \sbody}
    \def\proof{\noindent\em{\kern-0.5pt Důkaz:} }
    \def\proofofthm{\noindent\em{\kern-0.5pt Důkaz věty:} }
    \def\proofoflemma{\noindent\em{\kern-0.5pt Důkaz lemmatu:} }
    \def\proofsketch{\noindent\em{Náznak důkazu:} }
    \def\proofidea{\noindent\em{Myšlenka důkazu:} }
    \def\defn{\s{Definice:} \sbody}
    \def\obs{\s{Pozorování:} \sbody}
    \def\rem{\s{Poznámka:} \sbody}
    \def\remn#1{\s{Poznámka (#1):} \sbody}
    \def\corr{\s{Důsledek:} \sbody}
    \def\nota{\s{Značení:} \sbody}
    \def\example{\s{Příklad:} \sbody}
    \def\examplen#1{\s{Příklad (#1):} \sbody}
    \def\examples{\s{Příklady:} \sbody}
    \def\claim{\s{Tvrzení:} \sbody}
    \def\claimn#1{\s{Tvrzení (#1):} \sbody}
    \def\fact{\s{Fakt:} \sbody}
    \def\factn#1{\s{Fakt (#1):} \sbody}
    \def\invariant{\s{Invariant:} \sbody}
    \def\invariantn#1{\s{Invariant (#1)} \sbody}
    \def\invariantx#1{\s{Invariant~#1:} \sbody}
    \def\invariantxn#1#2{\s{Invariant~#1 (#2):} \sbody}
    
    % Pokud \theorem apod. sazime na samostatny radek, piseme za nim \ebreak,
    % coz zabrani nevhodnemu zlomu stranky.
    \def\ebreak{\endgraf\nobreak}
    
    % Odkaz na opismenkovanou vetu
    \def\xx#1{{\bo #1}}
    
    % Pojmenovany odstavec
    \def\paran#1{\noindent \em{#1}}
    
    % Použijeme, pokud znění tvrzení končí $$
    \def\fixupdisplay{\unparskip}
    
    %%% Rejstřík %%%
    
    % Syntaxe rejstříkových záznamů:
    %	"|" odděluje více hesel v jednom záznamu ("medvěd brtník|ursus arctos")
    %	"/" určuje hierarchii hesla ("graf/neorientovaný")
    %	"a=b" zatřídit jako a, ale sázet b
    %	"a>b>...>c" vytvoří heslo c a všechna ostatní jako odkazy na něj
    %	"a>>b" vytvoří vysvětlení symbolu a s významem b, který není odkazem
    %	interpunkce [.,!?] na konci hesla se ignoruje
    %	pokud heslo začíná "!", zařadí se mezi symboly (bez "!")
    
    % Prostý záznam: píše se těsně před text, na nějž odkazuje. Nic nesází.
    \def\r#1{\rstart\rdebug{#1}\rwrite{aux:#1}\rend}
    \def\rstart{\ifvmode\leavevmode\let\rpastend=\ignorespaces\else\let\rpastend=\relax\fi}
    \def\rend{\nobreak\hskip0pt\relax\rpastend}  % aby vznikla hranice slova
    
    % Zvýrazněný záznam odpovídající definici pojmu
    \def\rr#1{\rstart\rdebug{#1 *}\rwrite{main:#1}\rend}
    
    % Definice: Vysází se kurzívou a navíc se přidá do rejstříku
    \def\df#1{\dfr{#1}{#1}}
    
    % Definice, která vysází #1, ale do rejstříku zanese #2
    \def\dfr#1#2{\rr{#2}\em{#1}}
    
    % Definice operace datové struktury
    \def\opdf#1{\rr{operace/#1=operace/\alg{#1}}\alg{#1}}
    
    % Zápis do souboru
    \newwrite\idxfile
    \immediate\openout\idxfile=index-raw.aux
    \def\rwrite#1{\write\idxfile{\the\count0:#1}}
    
    % Ladicí výpisy rejstříkových záznamů
    
    \newinsert\idxins
    \dimen\idxins=0.9\vsize
    \count\idxins=500
    \skip\idxins=4pt
    
    \def\dordebug#1{\insert\idxins{
    	\hsize=0.5\hsize
    	\splittopskip=0pt
    	\splitmaxdepth=2pt
    	\floatingpenalty=20000
    	\leftskip=0pt
    	\rightskip=0pt
    	\spaceskip=0pt
    	\xspaceskip=0pt
    	\parindent=0pt
    	\leavevmode
    	\vrule width 0pt height 6pt depth 2pt
    	\setfonts[/7]\setmath[//]\baselineskip=8pt
    	\tt #1\par
    	\allowbreak
    }}
    
    \def\doroutput{\ifvoid\idxins\else
    	\vskip 2.6pt plus 10pt
    	\hrule
    	\vskip 1pt
    	\dimen2=8pt
    	\setbox\idxins=\vbox{\vfil\unvbox\idxins}
    	\count1=\numexpr ((\ht\idxins+\dp\idxins) / \dimen2) / 2\relax
    	\splittopskip=0pt\splitmaxdepth=2pt
    	\setbox2=\vsplit\idxins to \dimexpr\count1\dimen2 - 2pt\relax
    	\line{\vtop{\unvbox2}\hss\vtop{\unvbox\idxins}}
    \fi}
    
    \def\rdebug#1{}
    \def\routput{}
    
    \def\debugindex{
    	\let\rdebug=\dordebug
    	\let\routput=\doroutput
    }
    
    %%% Output routina %%%
    
    \def\adsoutput{\onepageout{
    	\dimen0=\dp255
    	\unvbox255
    	\ifr@ggedbottom \kern-\dimen0 \vfil \fi
    }}
    \output={\adsoutput}
    
    \newdimen\textwidth
    \newdimen\textheight
    \textwidth=\hsize
    \textheight=\vsize
    
    \newdimen\headlinepos
    \newdimen\footlinepos
    \headlinepos=-4\stdbaselineskip
    \footlinepos=5\stdbaselineskip
    
    \def\onepageout#1{
    	\ifodd\pageno\else\advance\pdfvariable horigin by \evenpageshift\fi
    	\ifcropmarks
    		\advance\pdfvariable horigin by \cropmargin
    		\advance\pdfvariable vorigin by \cropmargin
    		\advance\pagewidth by 2\cropmargin
    		\advance\pageheight by 2\cropmargin
    	\fi
    	\shipout\vbox{
    		\background
    		\drawgrid
    		\ifcropmarks\drawcrops\fi
    		\offinterlineskip
    		\vbox to 0pt{\vskip\headlinepos\smash{\hbox to \textwidth{\the\headline}}\vss}
    		\vbox to \textheight {
    			\ifvoid\topins\else\unvbox\topins\fi
    			#1
    			\ifvoid\footins\else \vskip\skip\footins \footnoterule \unvbox\footins \fi
    			\boxmaxdepth=\maxdepth
    			\routput
    		}
    		\vskip -\prevdepth
    		\vbox to 0pt{\vskip \footlinepos\hbox to \textwidth{\the\footline}\vss}
    	}
    	\advancepageno
    	\ifnum\outputpenalty>-\@MM \else\dosupereject\fi
    }
    
    \def\currentversion{{%
    \setfonts[LMRoman/8]\rm
    \the\year
    -\ifnum\month<10\relax 0\fi\the\month
    -\ifnum\day<10\relax 0\fi\the\day
    }}
    
    \headline={{\setfonts[LMRoman/9]\rm---~~\firstmark\hfil}}
    
    \footline={
    	\ifodd\count0
    		\rlap{\currentversion}\midfoot\llap{\pagenumfont\folio}
    	\else
    		\rlap{\pagenumfont\folio}\midfoot\llap{\currentversion}
    	\fi
    }
    \def\midfoot{\hfil{\setfonts[LMRoman/8]\it Martin Mareš: Úvod do kryptografie}\hfil}
    
    \def\barepage{\headline={}\footline={}}
    
    \let\drawgrid=\relax
    \def\debuggrid{\def\drawgrid{{
    	\dimen0=2pt
    	% Rozměry zrcadla
    	\dimen1=\leftmargin							% bot-left x
    	\dimen2=\bottommargin							% bot-left y
    	\dimen3=\dimexpr\luatexpagewidth-\leftmargin-\rightmargin\relax		% width
    	\dimen4=\dimexpr\luatexpageheight-\topmargin-\bottommargin\relax	% height
    	\ifodd\pageno\else\advance\dimen1 by \evenpageshift\fi
    	\ifcropmarks
    		\advance\dimen1 by \cropmargin
    		\advance\dimen2 by \cropmargin
    		\advance\dimen3 by -2\cropmargin
    		\advance\dimen4 by -2\cropmargin
    	\fi
    	\pdfliteral page{q \tobp{\dimen1} \tobp{\dimen2} \tobp{\dimen3} \tobp{\dimen4} re 1 0 0 RG s Q}
    %	\loop
    %		\pdfliteral page{q \tobp{\dimen1} \tobp{\dimexpr\dimen2+\dimen0\relax} \tobp{\dimen3} 0 re 0 1 0 RG s Q}
    %		\advance\dimen0 by \baselineskip
    %	\ifdim\dimen0<\dimen4\repeat
    }}}
    
    \def\drawcrops{{
    	\dimen0=\pdfvariable horigin
    	\dimen1=\pdfvariable vorigin
    	\pdfliteral page{
    		q 0 G 0.25 w 0 J
    		% Bottom left
    		0 \tobp{\cropmargin} m \tobp{\dimexpr\cropmargin-\cropgap\relax} \tobp{\cropmargin} l S
    		\tobp{\cropmargin} 0 m \tobp{\cropmargin} \tobp{\dimexpr\cropmargin-\cropgap\relax} l S
    		% Bottom right
    		\tobp{\luatexpagewidth} \tobp{\cropmargin} m \tobp{\dimexpr\luatexpagewidth-\cropmargin+\cropgap\relax} \tobp{\cropmargin} l S
    		\tobp{\dimexpr\luatexpagewidth-\cropmargin\relax} 0 m \tobp{\dimexpr\luatexpagewidth-\cropmargin\relax} \tobp{\dimexpr\cropmargin-\cropgap\relax} l S
    		% Top left
    		0 \tobp{\dimexpr\luatexpageheight-\cropmargin\relax} m \tobp{\dimexpr\cropmargin-\cropgap\relax} \tobp{\dimexpr\luatexpageheight-\cropmargin\relax} l S
    		\tobp{\cropmargin} \tobp{\luatexpageheight} m \tobp{\cropmargin} \tobp{\dimexpr\luatexpageheight-\cropmargin+\cropgap\relax} l S
    		% Top right
    		\tobp{\luatexpagewidth} \tobp{\dimexpr\luatexpageheight-\cropmargin\relax} m \tobp{\dimexpr\luatexpagewidth-\cropmargin+\cropgap\relax} \tobp{\dimexpr\luatexpageheight-\cropmargin\relax} l S
    		\tobp{\dimexpr\luatexpagewidth-\cropmargin\relax} \tobp{\luatexpageheight} m \tobp{\dimexpr\luatexpagewidth-\cropmargin\relax} \tobp{\dimexpr\luatexpageheight-\cropmargin+\cropgap\relax} l S
    		Q
    	}
    }}
    
    \let\background=\relax
    
    \ifprint
    \def\separatorbackground{
    	\pdfliteral page{q 0 0 \tobp{\pagewidth} \tobp{\pageheight} re 0.75 g f Q}
    }
    \else
    \def\separatorbackground{
    	\pdfliteral page{q 0 0 \tobp{\pagewidth} \tobp{\pageheight} re 0.769 0.180 0.208 rg f Q}
    }
    \fi
    
    %%% Dvousloupcová sazba (inspirovaná makry z KSP) %%%
    
    \newbox\partialpage
    
    \def\begindoublecolumns{
    	\begingroup
    	\medskip
    	\output={\global\setbox\partialpage=\vbox{\unvbox255}}\eject
    	\output={\doublecolumnout}
    	\dimen0=\hsize
    	\advance\dimen0 by -10mm
    	\hsize=0.5\dimen0
    	\dimen0=\textheight
    	\advance\dimen0 by -\ht\partialpage
    	\advance\dimen0 by 10pt
    	\vsize=2\dimen0
    }
    
    \def\enddoublecolumns{
    	\output={\balancecolumns}\eject
    	\endgroup
    	\dimen0=\textheight
    	\ifvoid\footins\else
    	\advance\dimen0 by -\ht\footins
    	\advance\dimen0 by -\skip\footins
    	\fi
    	\global\pagegoal=\dimen0
    	\global\vsize=\textheight
    	\medbreak
    }
    
    \def\doublecolumnout{
    	\splittopskip=\topskip \splitmaxdepth=\maxdepth
    	\dimen0=\textheight \advance\dimen0 by-\ht\partialpage
    	\ifvoid\footins\else \advance\dimen0 by-\skip\footins \advance\dimen0 by-\ht\footins \fi
    	\setbox0=\vsplit255 to\dimen0 \setbox2=\vsplit255 to\dimen0
    	\setbox0=\vtop{\unvbox0\vfill}
    	\setbox2=\vtop{\unvbox2\vfill}
    	\onepageout{\pagesofar\vfill}
    	\unvbox255 \penalty\outputpenalty
    	\global\vsize=2\textheight
    }
    
    \def\pagesofar{
    	\unvbox\partialpage
    	\wd0=\hsize \wd2=\hsize
    	\hbox to\textwidth{\box0\hfil\box2}
    }
    
    \def\balancecolumns{
    	\ifnum\outputpenalty>-9000
    		\doublecolumnout
    	\else
    		\setbox0=\vbox{\unvcopy255}
    		\dimen0=\ht0
    		\advance\dimen0 by\topskip
    		\divide\dimen0 by2 \splittopskip=\topskip % now there is the wanted height of the two columns in \dimen0 ...
    		\dimen5=\textheight \advance\dimen5 by-\ht\partialpage
    		\ifvoid\footins\else \advance\dimen5 by-\skip\footins \advance\dimen5 by-\ht\footins \fi
    		\ifdim\dimen5<\dimen0
    			\doublecolumnout
    		\else
    			\setbox0=\vbox{\unvbox255}
    			\count9=\vbadness
    			\vbadness=10000
    			\loop
    				\global\setbox3=\copy0
    				\global\setbox1=\vsplit3 to\dimen0
    				\ifdim\ht3>\ht1
    					\advance\dimen0 by1pt
    				\repeat
    			\vbadness=\count9
    			\setbox0=\vbox to\dimen0{\unvbox1\vfill}
    			\setbox2=\vbox to\dimen0{\unvbox3\vfill}
    			\pagesofar
    		\fi
    	\fi
    }
    
    %%% Bibliografie %%%
    
    \ifsinglechapter
    	\def\cite#1{[{\bf ?}]}
    \else
    	\input btxmac.tex
    	\bibliographystyle{ads}
    \fi
    
    %%% PDF metadata %%%
    
    \directlua{
    	require('lua-pdfmeta.lua')
    	pdfmeta.set_info('Title', 'Úvod do kryptografie')
    	pdfmeta.set_info('Author', 'Martin Mareš')
    }
    
    %%% Hack pro sazbu na A5 %%%
    
    \ifx\modeafive\relax
    	\setpaper{a5}
    	\topmargin=18mm
    	\bottommargin=18.433mm
    	\setinneroutermargin{6mm}{6mm}
    	\setuppage
    	\headlinepos=-2\stdbaselineskip
    	\footlinepos=2\stdbaselineskip
    \fi
    
    %%% E-book %%%
    
    \ifx\modeebook\relax
    	\ebooktrue
    	\ifx\modemobi\relax
    		\mobitrue
    	\fi
    	\input eb.tex
    	\ebookinit{\ebookconfig}
    	\input eb-ads.tex
    \else
    	\ebookfalse
    \fi
    
    %%% Sázení samostatných kapitol %%%
    
    \def\singlechapter#1{
    	\chapcount=\numexpr #1-1\relax
    }
    
    %%% Konec %%%
    
    \catcode`@=12