Select Git revision
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\cr
\noalign{\medskip\smallskip}
#2\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