% OPmac
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Petr Olsak, 2012, 2013, 2014

%% The history of versions is at the end of this file, after \endpinput

\ifx\OPmacversion\undefined \else \endinput \fi
\def\OPmacversion{May 2014d}
\immediate\write16{This is OPmac (Olsak's Plain macros), version <\OPmacversion>}

%%%%%%%%%%%%%% Basic macros, sec. 3.1 in opmac-d.pdf

\newcount\tmpnum % auxiliary count
\newdimen\tmpdim % auxiliary dimen

\def\opwarning#1{\immediate\write16{l.\the\inputlineno\space OPmac WARNING: #1.}}

\long\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}

\def\protectlist{}
\def\addprotect#1{\addto\protectlist{\doprotect#1}}
\addprotect~

\newif\ifpdftex  \pdftextrue
\ifx\pdfoutput\undefined \pdftexfalse \else \ifnum\pdfoutput=0 \pdftexfalse \fi \fi
\ifx\XeTeXversion\undefined \else \pdftextrue \fi

\def\sdef#1{\expandafter\def\csname#1\endcsname}
\def\sxdef#1{\expandafter\xdef\csname#1\endcsname}

\def\adef#1{\catcode`#1=13 \bgroup \lccode`\~=`#1\lowercase{\egroup\def~}}

\def\isdefined #1#2{\expandafter\ifx \csname#1\endcsname \relax
     \csname iffalse\expandafter\endcsname
   \else
     \csname iftrue\expandafter\endcsname
   \fi
}
\def\isinlist#1#2#3{\def\tmp##1#2##2\end{\def\tmp{##2}%
   \ifx\tmp\empty \csname iffalse\expandafter\endcsname \else
                  \csname iftrue\expandafter\endcsname \fi}% end of \def\tmp
   \expandafter\tmp#1\endlistsep#2\end
}
\def\isnextchar#1#2#3{\def\tmpa{#2}\def\tmpb{#3}%
   \let\tmp=#1\futurelet\next\isnextcharA
}
\def\isnextcharA{\ifx\tmp\next\expandafter\tmpa\else\expandafter\tmpb\fi}

\def\maybebreak{\afterassignment\maybebreakA\tmpdim=}
\def\maybebreakA{\ifvmode \vskip0pt plus\tmpdim \penalty-130 \vskip0pt plus-\tmpdim 
    \else \hskip0pt plus\tmpdim \penalty-130 \hskip0pt plus-\tmpdim \fi \relax
}
\def\uv#1{\clqq#1\crqq}
\let\\=\undefined
{\lccode`\?=`\%  \lowercase{\gdef\percent{?}}}
{\lccode`\?=`\\  \lowercase{\gdef\bslash{?}}}
\def\,{\ifmmode \mskip\thinmuskip \else \thinspace \fi}
\addprotect\percent \addprotect\bslash \addprotect\, \addprotect\exfont


%%%%%%%%%%%%%% Global parameters, sec. 3.2 in opmac-d.pdf

\widowpenalty=10000
\clubpenalty=10000
\showboxdepth=7
\showboxbreadth=30

\newdimen\iindent  \iindent=\parindent
   % indentation of items, TOC, captions, list of bib. references
\newdimen\ttindent \ttindent=\parindent
   % indentation in \begtt...\endtt and \verbinput

\def\ttskip{\medskip}       % space above and below \begtt, \verbinput
\mathchardef\ttpenalty=100  % penalty between lines in \begtt, \verbinput
\def\tthook{}               % hook in \begtt, \verbinput
\def\intthook{}             % hook in in-text verbatim

\def\iiskip{\medskip}     % space above and below \begitems...\enditems
\def\bibskip{\smallskip}  % space between bibitems

\def\tabstrut{\strut}     % strut in the \table
\def\tabiteml{\enspace}   % left material before each \table item
\def\tabitemr{\enspace}   % right material after each \table item
\def\vvkern{1pt}          % space between vertical lines
\def\hhkern{1pt}          % space between horizontal lines

\def\multiskip{\medskip}      % space above and below \begmulti...\endmulti
\newdimen\colsep \colsep=2em  % space between columns

\newdimen\mnoteindent \mnoteindent=10pt % ditance between mnote and text
\newdimen\mnotesize   \mnotesize=20mm   % the width of the mnote paragraph

\def\picdir{}      % the directory with picture files
\def\bibtexhook{}  % hook in \usebibtex and \usebbl macros
\def\chaphook{}    % hook in \chap
\def\sechook{}     % hook in \sec
\def\secchook{}    % hook in \secc
\def\cnvhook{}     % hook before conversion of outlines
\def\pghook{}      % hook in \output rutine
\def\toclinehook{} % hook in \tocline
\def\fnotehook{}   % hook in \fnote
\def\mnotehook{}   % hook in \mnote
\def\captionhook#1{} % hook in \caption (#1 is "t" or "f")

%%%%%%%%%%%%%% OPmac, CSplain and LaTeX logos, sec. 3.3 in opmac-d.pdf

\def\OPmac{\leavevmode
   \lower.2ex\hbox{\thefontscale[1400]O}\kern-.86em P{\em mac}}
\def\CS{$\cal C$\kern-.1667em\lower.5ex\hbox{$\cal S$}}
\def\csplain{\CS plain}

\def\LaTeX{\tmpdim=.42ex L\kern-.36em \kern\slantcorr % slant correction
  \raise\tmpdim\hbox{\thefontscale[710]A}%
  \kern-.15em \kern-\slantcorr \TeX}
\def\slantcorr{\expandafter\ignorept\the\fontdimen1\the\font\tmpdim}

\addprotect\TeX   \addprotect\OPmac   \addprotect\CS  \addprotect\LaTeX


%%%%%%%%%%%%%% Sizes of fonts and \baselineskip, sec. 3.4 in opmac-d.pdf

\ifx\regfont\undefined
   \ifx\uselanguage\undefined % if this is eplain, the following warning is suppressed
      \opwarning{csplain version <Nov. 2012> or later is recommended}
   \fi
   % macros from csplain, file csfontsm.tex:
   \font\tenbi=csbxti10 \def\bi{\tenbi}
   \def\letfont#1#2{\ifx#2=\expandafter\letfont\expandafter#1\else
     \expandafter\font\expandafter#1\expandafter\rfontskipat\fontname#2 \relax\space \fi}
   \def\rfontskipat#1{\ifx#1"\expandafter\rfskipatX\else\expandafter\rfskipatN\expandafter#1\fi}
   \def\rfskipatX #1" #2\relax{"\whichtfm{#1}"}  \def\rfskipatN #1 #2\relax{\whichtfm{#1}}
   \def\sizespec{}   \def\whichtfm#1{#1}
   \def\resizefont#1{\letfont#1#1\sizespec}
   \def\regfont#1{\expandafter\def\expandafter\resizeall\expandafter{\resizeall \resizefont#1}}
   \def\resizeall{}
   \regfont\tenrm \regfont\tenit \regfont\tenbf \regfont\tenbi \regfont\tentt
\fi

\newdimen\ptunit    \ptunit=1pt
\newdimen\fontdim   \fontdim=10pt

\ifx\normalmath\undefined \input ams-math \fi  % ams-math.tex is in csplain package

{\lccode`\?=`\p \lccode`\!=`\t  \lowercase{\gdef\ignorept#1?!{#1}}}

\def\typosize[#1/#2]{\fontsizex[#1]\setbaselineskip[#2]\ignorespaces}
\def\typoscale[#1/#2]{\fontscalex[#1]\scalebaselineskip[#2]\ignorespaces}

\def\fontsizex[#1]{\if$#1$\else
  \textfontsize[#1]%
  \tmpdim=0.7\fontdim \edef\tmpa{\expandafter\ignorept\the\tmpdim}%
  \tmpdim=0.5\fontdim \edef\tmpb{\expandafter\ignorept\the\tmpdim}%
  \edef\tmp{\noexpand\setmathsizes[\expandafter\ignorept\the\fontdim/\tmpa/\tmpb]}%
  \tmp \normalmath
  \fi
}
\def\textfontsize[#1]{\if$#1$\else
  \fontdim=#1\ptunit \ifx\fontdimB\undefined \edef\fontdimB{\the\fontdim}\fi
  \let\dgsize=\fontdim
  \edef\sizespec{at\the\fontdim}%
  \resizeall \rm \let\dgsize=\undefined
  \fi
}
\def\setbaselineskip[#1]{\if$#1$\else
  \tmpdim=#1\ptunit
  \baselineskip=\tmpdim \relax 
  \ifx\baselineskipB\undefined \edef\baselineskipB{\the\baselineskip}\fi
  \bigskipamount=\tmpdim plus.33333\tmpdim minus.33333\tmpdim
  \medskipamount=.5\tmpdim plus.16666\tmpdim minus.16666\tmpdim
  \smallskipamount=.25\tmpdim plus.08333\tmpdim minus.08333\tmpdim
  \normalbaselineskip=\tmpdim
  \jot=.25\tmpdim
  \maxdepth=.33333\tmpdim
  \setbox\strutbox=\hbox{\vrule height.709\tmpdim depth.291\tmpdim width0pt}%
  \fi
}
\def\withoutunit#1#2{\expandafter#1\expandafter[\expandafter\ignorept\the#2]}

\def\fontscalex[#1]{\if$#1$\else \ifnum#1=1000 \else
  \tmpdim=3277sp \tmpdim=#1\tmpdim \divide\tmpdim by50
  \tmpdim=\expandafter\ignorept\the\tmpdim \fontdim
  \withoutunit\fontsizex\tmpdim
  \fi\fi
}
\def\textfontscale[#1]{\if$#1$\else
  \tmpdim=#1pt \divide\tmpdim by1000
  \tmpdim=\expandafter\ignorept\the\tmpdim \fontdim
  \withoutunit\textfontsize\tmpdim
  \fi
}
\def\scalebaselineskip[#1]{\if$#1$\else \ifnum#1=1000 \else
  \tmpdim=3277sp \tmpdim=#1\tmpdim \divide\tmpdim by50
  \tmpdim=\expandafter\ignorept\the\tmpdim \baselineskip
  \withoutunit\setbaselineskip\tmpdim
  \fi\fi
}
\def\thefontsize[#1]{%
  \expandafter\let \expandafter\thefont \the\font
  \def\sizespec{at#1\ptunit}\def\dgsize{#1\ptunit}\resizefont\thefont
  \thefont \let\dgsize=\undefined \ignorespaces
}
\def\thefontscale[#1]{%
  \tmpdim=#1pt \divide\tmpdim by1000
  \tmpdim=\expandafter\ignorept\the\tmpdim \fontdim
  \withoutunit\thefontsize\tmpdim
}
\def\magstep#1{\ifcase#1 1000\or1200\or1440\or1728\or2074\or2488\fi\space}

\def\typobase{\ifx\baselineskipB\undefined \def\baselineskipB{12pt}\fi
   \ifx\fontdimB\undefined \def\fontdimB{10pt}\fi
   \baselineskip=\baselineskipB\relax \fontdim=\fontdimB\relax
}
\def\em {\expandafter\ifx \the\font \tenit \additcorr \rm  \else
         \expandafter\ifx \the\font \tenbf \bi\aftergroup\afteritcorr\else
         \expandafter\ifx \the\font \tenbi \additcorr \bf  \else
         \it \aftergroup\afteritcorr\fi\fi\fi}
\def\additcorr{\ifdim\lastskip>0pt \skip0=\lastskip \unskip\/\hskip\skip0 \else\/\fi}
\def\afteritcorr{\def\tmp{\ifx\next..\else\ifx\next,,\else\/%
                          \expandafter\expandafter\expandafter\next\expandafter\fi\fi}%
   \afterassignment\tmp \let\next= }

\addprotect\thefontsize   \addprotect\thefontscale
\addprotect\typosize      \addprotect\typoscale
\addprotect\textfontsize  \addprotect\textfontscale
\addprotect\em


%%%%%%%%%%%%%% Multilingual support, sec. 3.5 in opmac-d.pdf

\def\mtext#1{\csname mt:#1:\csname lan:\the\language\endcsname\endcsname}

\sdef{mt:chap:en}{Chapter}  \sdef{mt:chap:cs}{Kapitola}  \sdef{mt:chap:sk}{Kapitola}
\sdef{mt:t:en}{Table}       \sdef{mt:t:cs}{Tabulka}      \sdef{mt:t:sk}{Tabu\v lka}
\sdef{mt:f:en}{Figure}      \sdef{mt:f:cs}{Obr\'azek}    \sdef{mt:f:sk}{Obr\'azok}

\ifx\r\undefined \csname csaccents\endcsname \fi

\sdef{lan:0}{en}  \sdef{lan:100}{en} \sdef{lan:101}{en}
\sdef{lan:5}{cs}  \sdef{lan:15}{cs}  \sdef{lan:115}{cs}
\sdef{lan:6}{sk}  \sdef{lan:16}{sk}  \sdef{lan:116}{sk}

\ifx\uselanguage\undefined \else \message{OPmac: eTeX detected}
  \bgroup
     \uselanguage{czech}  \sxdef{lan:\the\language}{cs}
     \uselanguage{slovak} \sxdef{lan:\the\language}{sk}
  \egroup
\fi

%%%%%%%%%%%%%% REF file, sec 3.6 in opmac-d.pdf

\newwrite\reffile
\newread\testin

\def\wrefrelax#1#2{}
\let\wref=\wrefrelax

\def\inputref{
  \openin\testin=\jobname.ref
  \ifeof\testin \else
    \closein\testin
    \input \jobname.ref
    \fnotenum=0 \mnotenum=0 
    \immediate\openout\reffile=\jobname.ref
    \def\wref##1##2{\write\reffile{\string##1##2}}
    \immediate\write\reffile {\percent\percent\space OPmac - REF file}
  \fi
}
\def\openref{%
  \ifx\wref\wrefrelax
     \immediate\openout\reffile=\jobname.ref
     \gdef\wref##1##2{\write\reffile{\string##1##2}}%
     \immediate\write\reffile
       {\percent\percent\space OPmac - REF file (\string\openref)}%
  \fi
  \gdef\openref{}%
}

%%%%%%%%%%%%%% \label, \ref, \pgref, sec. 3.7 in opmac-d.pdf

\def\label[#1]{\isdefined{l0:#1}%
  \iftrue \opwarning{duplicated label [#1], ignored}\else \xdef\lastlabel{#1}\fi
  \ignorespaces}

\def\wlabel#1{%
  \ifx\lastlabel\undefined \else
     \dest[ref:\lastlabel]%
     \edef\tmp{\wref\Xlabel{{\lastlabel}{#1}}}\tmp
     \sxdef{lab:\lastlabel}{#1}\sxdef{l0:\lastlabel}{}%
     \global\let\lastlabel=\undefined
  \fi
}
\def\ref[#1]{\isdefined{lab:#1}%
  \iftrue \reflink[#1]{\csname lab:#1\endcsname}%
  \else ??\opwarning{label [#1] unknown. Try to TeX me again}\openref
  \fi
}
\def\pgref[#1]{\isdefined{pgref:#1}%
  \iftrue \pglink{\csname pgref:#1\endcsname}%
  \else ??\opwarning{pg-label [#1] unknown. Try to TeX me again}\openref
  \fi
}
\def\Xlabel#1#2{\sxdef{lab:#1}{#2}\sxdef{pgref:#1}{\the\lastpage}}


%%%%%%%%%%%%%% Chapters, sections, subsections -- sec. 3.8 in opmac-d.pdf

\def\printchap#1{\vfil\break
  {\chapfont \noindent \mtext{chap} \dotocnum{\thetocnum}\par
   \nobreak\smallskip\noindent #1\nbpar}\mark{}%
  \nobreak \remskip\bigskipamount \firstnoindent
}
\def\printsec#1{\par \norempenalty-400 \bigskip
  {\secfont \noindent \dotocnum{\thetocnum\quad}#1\nbpar}\insertmark{#1}%
  \nobreak \remskip\medskipamount \firstnoindent
}
\def\printsecc#1{\par \norempenalty-200 \medskip
  {\seccfont \noindent \dotocnum{\thetocnum\quad}#1\nbpar}%
  \nobreak \remskip\medskipamount \firstnoindent
}
\def\tit#1\par{\vglue4em
  {\leftskip=0pt plus1fill \rightskip=\leftskip
   \titfont \noindent #1\unskip\par}%
   \nobreak\bigskip
}
\def\titfont{\typobase\typoscale[\magstep4/\magstep4]\bf}
\def\chapfont{\typobase\typoscale[\magstep3/\magstep3]\bfshape}
\def\secfont{\typobase\typoscale[\magstep2/\magstep2]\bfshape}
\def\seccfont{\typobase\typoscale[\magstep1/\magstep1]\bfshape}
\def\bfshape{\let\tenit=\tenbi \boldmath \bf}

\newcount\chapnum \newcount\secnum \newcount\seccnum \newcount\nonumnum
\newif\ifnotoc \notocfalse  \def\notoc{\global\notoctrue}
\newif\ifnonum \nonumfalse  \def\nonum{\global\nonumtrue}

\def\chap#1\par{\ifnonum\else \global\advance\chapnum by1 \fi
  \chaphook {\globaldefs=1 \secnum=0 \seccnum=0 \tnum=0 \fnum=0 \dnum=0}\relax
  \edef\thechapnum{\the\chapnum}\let\thetocnum=\thechapnum 
  \def\dotocnumafter{\wcontents\Xchap{#1}}%
  \printchap{#1\unskip}\resetnonumnotoc
}
\def\sec#1\par{\ifnonum\else \global\advance\secnum by1 \fi
  \sechook {\globaldefs=1 \seccnum=0 \tnum=0 \fnum=0 \dnum=0}\relax
  \edef\thesecnum{\othe\chapnum.\the\secnum}\let\thetocnum=\thesecnum 
  \def\dotocnumafter{\wcontents\Xsec{#1}}% 
  \printsec{#1\unskip}\resetnonumnotoc
}
\def\secc#1\par{\ifnonum\else \global\advance\seccnum by1 \fi
  \secchook {}\relax
  \edef\theseccnum{\othe\chapnum.\the\secnum.\the\seccnum}\let\thetocnum=\theseccnum
  \def\dotocnumafter{\wcontents\Xsecc{#1}}%
  \printsecc{#1\unskip}\resetnonumnotoc
}
\def\wcontents#1#2{% #1: sequence to REF, #2: titletext
  \ifnotoc\else
      \expandafter\wref\expandafter#1\expandafter
        {\expandafter{\thetocnum}{#2}{\the\pageno}}%
  \fi
}
\def\dotocnum#1{%
  \leavevmode 
     {\ifnonum \global\advance\nonumnum by1 \edef\thetocnum{!\the\nonumnum}\fi
      \wlabel\thetocnum \dest[toc:\thetocnum]%
      \dotocnumafter}\ifnonum\else#1\fi
  \global\let\dotocnumafter=\relax
}
\def\resetnonumnotoc{\global\notocfalse \global\nonumfalse
  \ifx\dotocnumafter\relax \else
    \opwarning{\noexpand\dotocnum unused in printchap/printsec/printsecc}\fi
}
\def\insertmark#1{\toks0={#1}\mark{{\ifnonum\else\thetocnum\fi} {\the\toks0}}}

\newskip\remskipamount
\def\remskip{\afterassignment\remskipA \global\remskipamount}
\def\remskipA{\vskip\remskipamount \penalty11333 }
\def\norempenalty{\ifnum\lastpenalty=11333 
   \vskip-\remskipamount \tmpnum=\else \removelastskip \penalty \fi}

\def\othe#1.{\ifnum#1>0 \the#1.\fi}
\def\thechapnum{} \def\thesecnum{} \def\theseccnum{}

\def\afternoindent{\global\everypar={\wipeepar\setbox7=\lastbox}}
\def\wipeepar{\global\everypar={}}
\let\firstnoindent=\afternoindent
\def\nbpar{{\interlinepenalty=10000\par}}
\def\nl{\hfil\break}


%%%%%%%%%%%%%% Captions, equations -- sec. 3.9 in opmac-d.pdf

\newcount\tnum  \newcount\fnum   \newcount\dnum

\def\thetnum{\thesecnum.\the\tnum}
\def\thefnum{\thesecnum.\the\fnum}
\def\thednum{(\the\dnum)}

\def\caption/#1 {\isdefined{#1num}%
   \iftrue \global\advance \csname #1num\endcsname by1
   \else   \opwarning{Unknown caption /#1}%
   \fi
   \bgroup
      \leftskip=\iindent plus1fil
      \rightskip=\iindent plus-1fil
      \parfillskip=0pt plus2fil
      \def\par{\endgraf\egroup}%
      \captionhook{#1}\noindent 
      \wlabel{\csname the#1num\endcsname}%
      \printcaption{\mtext{#1}}{\csname the#1num\endcsname}%
}
\def\printcaption#1#2{{\bf#1 #2}\enspace}

\expandafter\def\expandafter\endinsert\expandafter{\expandafter\par\endinsert}

\def\eqmark{\global\advance\dnum by1
  \ifinner\else\eqno \fi 
  \wlabel\thednum \thednum
}

%%%%%%%%%%%%%% Items -- sec. 3.10 in opmac-d.pdf

\newcount\itemnum  \itemnum=0

\def\begitems{\par\iiskip\bgroup
  \itemnum=0 \adef*{\startitem}
  \advance\leftskip by\iindent
  \let\printitem=\normalitem
}
\def\enditems{\par\egroup\iiskip}

\def\startitem{\par \advance\itemnum by1
   \noindent\llap{\printitem}\ignorespaces}
\def\normalitem{$\bullet$\enspace}

\def\style#1{\expandafter\let\expandafter\printitem\csname item:#1\endcsname
  \ifx\printitem\relax \let\printitem=\normalitem \fi
}
\sdef{item:o}{\raise.4ex\hbox{$\scriptscriptstyle\bullet$} }
\sdef{item:-}{- }
\sdef{item:n}{\the\itemnum. }
\sdef{item:N}{\the\itemnum) }
\sdef{item:i}{(\romannumeral\itemnum) }
\sdef{item:I}{\uppercase\expandafter{\romannumeral\itemnum}\kern.5em}
\sdef{item:a}{\athe\itemnum) }
\sdef{item:A}{\uppercase\expandafter{\athe\itemnum}) }
\sdef{item:x}{\raise.3ex\fullrectangle{.6ex} }
\sdef{item:X}{\raise.2ex\fullrectangle{1ex}\kern.5em}

\def\fullrectangle#1{\hbox{\vrule height#1 width#1}}

\def\athe#1{\ifcase#1?\or a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or k\or l\or 
   m\or n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or y\or z\else ?\fi
}

%%%%%%%%%%%%%% TOC -- sec. 3.11 in opmac-d.pdf

\def\toclist{} \newif\ifischap \ischapfalse

\def\Xchap#1#2#3{\ischaptrue\addto\toclist{\tocline{0}{\bf}{#1}{#2}{#3}}}
\def\Xsec#1#2#3{\addto\toclist{\tocline{1}{\rm}{#1}{#2}{#3}}}
\def\Xsecc#1#2#3{\addto\toclist{\tocline{2}{\rm}{#1}{#2}{#3}}}

\def\tocline#1#2#3#4#5{{\leftskip=#1\iindent \rightskip=2\iindent
   \ifischap\advance\leftskip by\iindent\fi
   \ifnum#1>1 \advance\leftskip by\iindent\fi
   \toclinehook \noindent\llap{#2\toclink{#3}\enspace}%
         {#2#4\unskip}\nobreak\tocdotfill\pglink{#5}\nobreak\hskip-2\iindent\null\par}}
\def\tocdotfill{\leaders\hbox to.8em{\hss.\hss}\hskip 1em plus1fill\relax}

\def\maketoc{\par \ifx\toclist\empty
      \opwarning{\noexpand\maketoc -- data unavailable, TeX me again}\openref
   \else \toclist \fi}

\def\toclinkA#1{\def\tmp##1!##2\end{\if^##1^\kern.8em \else##1\fi}\tmp#1!\end}

%%%%%%%%%%%%%% Index -- sec. 3.12 on opmac-d.pdf

\def\iindex#1{\openref\wref\Xindex{{#1}{\the\pageno}}}

\def\ii #1 {\leavevmode\def\tmp{#1}\iiA #1,,}

\def\iiA #1,{\if$#1$\else\def\tmpa{#1}%
   \ifx\tmpa\iiatsign \expandafter\iiB\tmp,,\else\iindex{#1}\fi
   \expandafter\iiA\fi}
\def\iiatsign{@}

\def\iiB #1,{\if$#1$\else \iiC#1/\relax \expandafter\iiB\fi}
\def\iiC #1/#2\relax{\if$#2$\else\iindex{#2#1}\fi}

\def\iid #1 {\leavevmode\iindex{#1}#1\futurelet\tmp\iiD}
\def\iiD{\ifx\tmp,\else\ifx\tmp.\else\space\fi\fi}

\def\Xindex#1#2{\bgroup \def~{ }%
   \isdefined{,#1}\iftrue
     \expandafter\firstdata \csname,#1\endcsname \XindexA
     \ifnum#2=\tmpa % \ii on the same page
     \else
        \tmpnum=#2 \advance\tmpnum by-1
        \expandafter\seconddata \csname,#1\endcsname \XindexB
        \if\tmpb+% state: the pagelist ends by a pagenumber
           \ifnum\tmpnum=\tmpa  % the consecutive page
              \sxdef{,#1}{{#2/-}{\tmp\iiendash}}
           \else                % the pages drop
              \sxdef{,#1}{{#2/+}{\tmp, #2}}
           \fi
        \else    % state: the pagelist ends by --
           \ifnum\tmpnum=\tmpa  % the consecutive page
              \sxdef{,#1}{{#2/-}{\tmp}}
           \else                % the pages drop
              \sxdef{,#1}{{#2/+}{\tmp\tmpa, #2}}
           \fi
        \fi
     \fi
   \else % first occurrence of the index item #1
     \sxdef{,#1}{{#2/+}{#2}}
     \global \expandafter\addto \expandafter\iilist \csname,#1\endcsname
   \fi
   \egroup
}
\def\iilist{} \def\iiendash{--}

\def\firstdata#1#2{\expandafter\expandafter\expandafter #2\expandafter\firstdataA#1}
\def\firstdataA#1#2{#1&}
\def\seconddata#1#2{\expandafter\expandafter\expandafter #2\expandafter\seconddataA#1}
\def\seconddataA#1#2{#2&}

\def\XindexA#1/#2&{\def\tmpa{#1}\let\tmpb=#2}
\def\XindexB#1&{\def\tmp{#1}}

\def\makeindex{\par
  \ifx\iilist\empty \opwarning{index data-buffer is empty. TeX me again}
    \else
    \bgroup
      \setprimarysorting
      \def\act##1{\ifx##1\relax \else
         \firstdata##1\XindexA \seconddata##1\XindexB
         \if\tmpb+%
            \preparesorting##1% converted item by sorting data in \tmpb
            \xdef##1{{\tmpb}{\tmp}}
          \else
            \preparesorting##1% converted item by sorting data in \tmpb
            \xdef##1{{\tmpb}{\tmp\tmpa}}
          \fi
          \expandafter\act\fi}
      \expandafter \act \iilist \relax
    \egroup
    \dosorting  % sorting is in progress
    \iiparparams
    \gdef\act##1{\ifx##1\relax \else \prepii##1%
             \seconddata##1\printiipages \expandafter\act \fi}
      \expandafter \act \iilist \relax
    \orippx \global\let\act=\undefined \global\let\orippx=\undefined
  \fi
}
\def\printiipages#1&{ #1\par}

\def\prepii #1{\isinlist \iispeclist #1\iftrue
   \expandafter\expandafter\expandafter \printii \csname\string#1\endcsname&%
   \else \expandafter\prepiiA\string #1&%
   \fi
}
\def\prepiiA #1#2#3&{\printii#3&}

\def\iis #1 #2{\bgroup \def~{ }%
    \global\expandafter\addto\expandafter\iispeclist\csname,#1\endcsname
    \global\sdef{\expandafter\string\csname,#1\endcsname}{#2}%
  \egroup \ignorespaces
}
\def\iispeclist{}

\def\printii #1&{\gdef\currii{#1}\noindent\everyii
   \hskip-\iindent \ignorespaces\printiiA#1//}
\def\printiiA #1/{\if^#1^\let\previi=\currii \else
   \expandafter\scanprevii\previi/&\def\tmpb{#1}\edef\tmpb{\meaning\tmpb}%
   \ifx\tmpa\tmpb \iiemdash \else#1 \gdef\previi{}\fi
   \expandafter\printiiA\fi
}
\def\iiemdash{\kern.1em---\space}
\def\everyii{}

\def\iiparparams{%
   \xdef\orippx{\global\rightskip=\the\rightskip
               \global\leftskip=\the\leftskip
               \global\exhyphenpenalty=\the\exhyphenpenalty}
   \global\rightskip=0pt plus1fil
   \global\exhyphenpenalty=10000
   \global\leftskip=\iindent
}

\def\scanprevii#1/#2&{\def\previi{#2}\def\tmpa{#1}\edef\tmpa{\meaning\tmpa}}
\def\previi{} % previous index item


%%%%%%%%%%%%%% Sorting -- sec. 3.13 in opmac-d.pdf

\def\sortingdata{%
  /,{ },-,&,@,%
  aA\"a\"A\'a\'A,%
  bB,%
  cC,%
  \v c\v C,%
  dD\v d\v D,%
  eE\'e\'E\v e\v E,%
  fF,%
  gG,%
  h^^HH,%
  ^^T^^U^^V,%
  iI\'i\'I,%
  jJ,%
  kK,%
  lL\'l\'L\v l\v L,%
  mM,%
  nN\v n\v N,%
  oO\"o\"O\'o\'O\^o\^O,%
  pP,%
  qQ,%
  rR\'r\'R,%
  \v r\v R,%
  sS,%
  \v s\v S,%
  tT\v t\v T,%
  uU\"u\"U\'u\'U\r u\r U,%
  vV,%
  wW,%
  xX,%
  yY,\'y\'Y,%
  zZ,%
  \v z\v Z,%
  0,1,2,3,4,5,6,7,8,9,'.%
}
\def\setprimarysorting {\csname sort:\csname lan:\the\language\endcsname \endcsname
  \def\act##1{\ifx##1.\else
     \ifx##1,\advance\tmpnum by1
     \else \lccode`##1=\tmpnum \fi
     \expandafter \act \fi}%
  \ifx\r\undefined 
     \opwarning{\noexpand\csaccents is unused, falling back to ASCII sorting}%
     \gdef\sortingdata{.}\global\let\chsorting=n%
  \else
     \xdef\sortingdata{\sortingdata}% expand sorting data now
  \fi 
  \tmpnum=133 \expandafter \act\sortingdata \setignoredchars
}
\sdef{sort:en}{\global\let\chsorting=n} % skipping ch processing in English language

\def\setsecondarysorting {\def\act##1{\ifx##1.\else
     \ifx##1,\else \advance\tmpnum by1 \lccode`##1=\tmpnum \fi
     \expandafter \act \fi}%
  \tmpnum=133 \expandafter \act\sortingdata \setignoredchars
}
\bgroup
\lccode`4=`c \lccode`5=`h \lccode`6=`C \lccode`7=`H
\lowercase{
\gdef\iiscanch #145#2\relax{#1\if$#2$\else^^T\iiscanch #2\relax\fi}
\gdef\iiscanCh #165#2\relax{#1\if$#2$\else^^U\iiscanCh #2\relax\fi}
\gdef\iiscanCH #167#2\relax{#1\if$#2$\else^^V\iiscanCH #2\relax\fi}
\gdef\preparesorting#1{\expandafter\preparesortingA\string#1&}
\gdef\preparesortingA#1#2#3&{\xdef\tmpb{#3}%
  \ifx\chsorting\undefined 
    \xdef\tmpb{\expandafter\iiscanch\tmpb 45\relax}%
    \xdef\tmpb{\expandafter\iiscanCh\tmpb 65\relax}%
    \xdef\tmpb{\expandafter\iiscanCH\tmpb 67\relax}\fi
  \lowercase\expandafter{\expandafter\gdef\expandafter\tmpb\expandafter{\tmpb}}%
  \xdef\tmpb{\expandafter\removedot\tmpb.\relax}%
}}
\egroup

\def\removedot #1.#2\relax{#1\if$#2$\else\removedot #2\relax\fi}
\def\setignoredchars{\setlccodes ,.;.?.!.:.'.".|.(.).[.].<.>.=.+.{}{}}

\newif \ifAleB

\def\isAleB #1#2{%
  \edef\tmp{\firstdata#1\empty\relax\firstdata#2\empty\relax \noexpand#1\noexpand#2}%
  \expandafter \testAleB \tmp
}
\def\testAleB #1#2\relax #3#4\relax #5#6{%
  \if #1#3\if #1&\testAleBsecondary #5#6%
          \else \testAleB #2\relax #4\relax #5#6%
          \fi
  \else \ifnum `#1<`#3 \AleBtrue \else \AleBfalse \fi
  \fi
}
\def\testAleBsecondary#1#2{%
  \bgroup
     \setsecondarysorting
     \preparesorting#1\let\tmpa=\tmpb \preparesorting#2%
     \edef\tmp{\tmpa0\relax\tmpb1\relax}%
     \expandafter\testAleBsecondaryX \tmp
  \egroup
}
\def\testAleBsecondaryX #1#2\relax #3#4\relax {%
  \if #1#3\testAleBsecondaryX #2\relax #4\relax
  \else \ifnum `#1<`#3 \global\AleBtrue \else \global \AleBfalse \fi
  \fi
}
\def\dosorting{%
   \message{Opmac: Sorting index...}
   \def\act##1{\ifx##1\relax\else \global\addto\iilist{##1,}%
             \expandafter\act\fi}
   \expandafter\removeiilist \expandafter\act \iilist\relax
   \expandafter\removeiilist \expandafter\mergesort \iilist \end,\end
}
\def\removeiilist{\gdef\iilist{}}

\def\mergesort #1#2,#3{% by Miroslav Olsak
   \ifx,#1                       % prazdna-skupina,neco,  (#2=neco #3=pokracovani)
      \addto\iilist{#2,}         % dvojice skupin vyresena
      \return{\fif\mergesort#3}%    % \mergesort pokracovani
   \fi
   \ifx,#3                       % neco,prazna-skupina,  (#1#2=neco #3=,)
      \addto\iilist{#1#2,}%      % dvojice skupin vyresena
      \return{\fif\mergesort}%      % \mergesort dalsi
   \fi
   \ifx\end#3                    % neco,konec (#1#2=neco)
      \ifx\empty\iilist                % neco=kompletni setrideny seznam
         \def\iilist{#1#2}%
         \return{\fif\fif\gobbletoend}%   % koncim
      \else                      % neco=posledni skupina nebo \end
         \return{\fif\fif \expandafter\removeiilist    % spojim \indexbuffer+necoa cele znova
                \expandafter\mergesort\iilist#1#2,#3}%
   \fi\fi                      % zatriduji: p1+neco1,p2+neco2, (#1#2=p1+neco1 #3=p2)
   \isAleB #1#3\ifAleB         % p1<p2
      \addto\iilist{#1}%       % p1 do bufferu
      \return{\fif\mergesort#2,#3}%         % \mergesort neco1,p2+neco2,
   \else                       % p1>p2
      \addto\iilist{#3}%       % p2 do bufferu
      \return{\fif\mergesort#1#2,}%         % \mergesort p1+neco1,neco2,
   \fi
   \relax % zarazka, na ktere se zastavi \return
}
\def\return#1#2\fi\relax{#1} \def\fif{\fi}
\def\gobbletoend #1\end{}


%%%%%%%%%%%%%% \begmulti ... \endmulti TBN p. 244, 245 -- sec. 3.14 in opmac-d.pdf

\def\corrsize #1{%% #1 := #1 + \splittopskip - \topskip
   \advance #1 by \splittopskip \advance #1 by-\topskip}

\def\begmulti #1 {\par\wipeepar\multiskip\penalty0 \def\Ncols{#1}
   \splittopskip=\baselineskip
   \setbox6=\vbox\bgroup\penalty0
   %% \hsize := Sirka sloupce = (\hsize+\colsep) / n - \colsep
   \advance\hsize by\colsep
   \divide\hsize by\Ncols  \advance\hsize by-\colsep
   \dimen0=0pt
   \def\par{\endgraf\advance\dimen0 by\the\prevgraf\baselineskip
            \ifdim\dimen0>.9\maxdimen \message{flushcolumns:}%
               \global\let\balancecolumns=\flushcolumns \expandafter \endmulti
            \fi}%
}
\def\endmulti{\vskip-\prevdepth\vfil\egroup \setbox1=\vsplit6 to0pt
   %% \dimen1 := the free space on the page
   \ifdim\pagegoal=\maxdimen \dimen1=\vsize \corrsize{\dimen1}
   \else \dimen1=\pagegoal \advance\dimen1 by-\pagetotal \fi
   \ifdim \dimen1<2\baselineskip
     \vfil\break \dimen1=\vsize \corrsize{\dimen1} \fi
   \dimen0=\ht6 \divide\dimen0 by\Ncols \relax
   %% split the material to more pages?
   \ifdim \dimen0>\dimen1 \splitpart
   \else \balancecolumns \fi  % only balancing
   \multiskip\relax}
\def\makecolumns{\bgroup % full page, destination height: \dimen1
   \vbadness=20000 \setbox1=\hbox{}\tmpnum=0
   \loop \ifnum\Ncols>\tmpnum
      \advance\tmpnum by1
      \setbox1=\hbox{\unhbox1 \vsplit6 to\dimen1 \hss}
   \repeat
   \hbox{}\nobreak\vskip-\splittopskip \nointerlineskip
   \line{\unhbox1\unskip}
   \egroup}
\def\splitpart{%
   \makecolumns % full page
   \vskip 0pt plus 1fil minus\baselineskip \break
   \dimen0=\ht6 \divide\dimen0 by\Ncols \relax
   \dimen1=\vsize \corrsize{\dimen1}\dimen2=\dimen1
   \advance\dimen2 by-\Ncols\baselineskip
   %% split the material to more pages?
   \ifvoid6 \else
      \ifdim \dimen0>\dimen2 \expandafter\expandafter\expandafter \splitpart
      \else \balancecolumns % last balancing
   \fi \fi
}

\def\balancecolumns{\bgroup \setbox7=\copy6 % destination height: \dimen0
   \ifdim\dimen0>\baselineskip \else \dimen0=\baselineskip \fi
   \vbadness=20000
   \def\tmp{%
      \setbox1=\hbox{}\tmpnum=0
      \loop \ifnum\Ncols>\tmpnum
         \advance\tmpnum by1
         \setbox1=\hbox{\unhbox1
              \ifvoid6 \hbox to\wd6{\hss}\else \vsplit6 to\dimen0 \fi\hss}
      \repeat
   \ifvoid6 \else
      \advance \dimen0 by.2\baselineskip
      \setbox6=\copy7
      \expandafter \tmp \fi}\tmp
   \hbox{}\nobreak\vskip-\splittopskip \nointerlineskip
   \hbox to\hsize{\unhbox1\unskip}%
   \egroup
}
\def\flushcolumns#1\relax{\fi\fi\fi
   \setbox6=\vbox\bgroup\penalty0
   \global\let\balancecolumns=\ibalancecolumns
   \dimen0=\ht6 \unvbox6 \unskip\unskip
   \advance\hsize by\colsep
   \divide\hsize by\Ncols  \advance\hsize by-\colsep
   \def\par{\endgraf\advance\dimen0 by\the\prevgraf\baselineskip
            \ifdim\dimen0>.9\maxdimen \message{flush-columns:}%
               \global\let\balancecolumns=\flushcolumns \expandafter \endmulti
            \fi}%
}
\let\ibalancecolumns=\balancecolumns

%%%%%%%%%%%%%% Colors -- sec. 3.15 in opmac-d.pdf

\newif\ifwritecolor \writecolortrue
\newcount\lastpage  \lastpage=0  % the last page of the document

\def\Blue{\setcmykcolor{1 1 0 0}}
\def\Red{\setcmykcolor{0 1 1 0}}
\def\Brown{\setcmykcolor{0 0.67 0.67 0.5}}
\def\Green{\setcmykcolor{1 0 1 0}}
\def\Yellow{\setcmykcolor{0 0 1 0}}
\def\Cyan{\setcmykcolor{1 0 0 0}}
\def\Magenta{\setcmykcolor{0 1 0 0}}
\def\White{\setcmykcolor{0 0 0 0}}
\def\Grey{\setcmykcolor{0 0 0 0.5}}
\def\LightGrey{\setcmykcolor{0 0 0 0.2}}
\def\Black{\setcmykcolor{0 0 0 1}}

\def\setcmykcolor#1{{%
   \def\tmp{#1}\expandafter \ifx\csname currcolor\pdfK\endcsname \tmp \else
      \pdfliteral{#1 \pdfK}%
      \expandafter\xdef\csname currcolor\pdfK\endcsname{#1}%
      \writecolor\pdfK
   \fi}%
}
\def\writecolor#1{\ifwritecolor
      \openref 
      \edef\act{\noexpand\wref\noexpand\Xpdfcolor{#1{\csname currcolor#1\endcsname}}}\act
   \fi
}
\def\pdfK{k}
\def\linecolor#1{{\def\pdfK{K}#1}}

\def\pdfblackcolor{0 0 0 1}
\xdef\currcolork{\pdfblackcolor} \xdef\currcolorK{\pdfblackcolor}

\xdef\savedcolors{}

\def\localcolor{\aftergroup\restorecolor \writecolorfalse 
   \xdef\savedcolors{0{\currcolork}{\currcolorK}\savedcolors}}
\def\longlocalcolor{\aftergroup\restorecolor 
   \ifwritecolor\else \opwarning{\noexpand\longlocalcolor inside
      \string\localcolor. Something wrong}\fi
   \writecolortrue
   \xdef\savedcolors{1{\currcolork}{\currcolorK}\savedcolors}}
\let\locpgcolor=\relax  % for backward compatibility

\def\restorecolor{{\def\tmp##1##2##3##4\end{\xdef\savedcolors{##4}%
   \def\tmpa{##2}\def\tmpb{##3}\writecolortrue
      \ifx\tmpa\empty\else \ifx\tmpa\currcolork\else \pdfliteral{##2 k}\xdef\currcolork{##2}%
         \ifnum##1=1 \writecolor k\fi\fi\fi
      \ifx\tmpb\empty\else \ifx\tmpb\currcolorK\else \pdfliteral{##3 K}\xdef\currcolorK{##3}%
         \ifnum##1=1 \writecolor K\fi\fi\fi}%
   \expandafter\tmp\savedcolors\end}}

\addprotect\setcmykcolor  \addprotect\localcolor  \addprotect\longlocalcolor

\def\begoutput{\writecolorfalse  \let\longlocalcolor=\localcolor
   \edef\restoreoutputcolor{%
      \xdef\noexpand\currcolork{\currcolork}\xdef\noexpand\currcolorK{\currcolorK}}%
   \xdef\currcolork{\pdfblackcolor}\xdef\currcolorK{\pdfblackcolor}%
   \immediate\wref\Xpage{{\the\pageno}}%
}
\def\endoutput{\restoreoutputcolor}

\def\Xpdfcolork#1{\def\pdflastcolork{#1}}
\def\XpdfcolorK#1{\def\pdflastcolorK{#1}}
\let\pdflastcolork=\pdfblackcolor \let\pdflastcolorK=\pdfblackcolor

\def\Xpage#1{\ifnum\lastpage=#1 \else \lastpage=#1 \fnotenumlocal=0
   \ifx\pdflastcolork\pdfblackcolor\else
      \isdefined{pgc:#1}\iftrue \else \sxdef{pgc:#1}{}\fi
      {\let\setpgcolor=\relax \sxdef{pgc:#1}%
            {\csname pgc:#1\endcsname\setpgcolor k{\pdflastcolork}}}\fi
   \ifx\pdflastcolorK\pdfblackcolor\else
      \isdefined{pgc:#1}\iftrue \else \sxdef{pgc:#1}{}\fi
      {\let\setpgcolor=\relax \sxdef{pgc:#1}%
            {\csname pgc:#1\endcsname\setpgcolor K{\pdflastcolorK}}}\fi\fi
}
\def\setpgcolor#1#2{\pdfliteral{#2 #1}}

\def\preboxcclv{\csname pgc:\the\pageno\endcsname}
\def\postboxcclv{{%
   \def\setpgcolor##1##2{\expandafter\xdef\csname currcolor##1\endcsname{##2}}%
   \ifnum\pageno<\lastpage 
         \globaldefs=-1 \advancepageno \globaldefs=0 \csname pgc:\the\pageno\endcsname
   \else \xdef\currcolork{\pdflastcolork}\xdef\currcolorK{\pdflastcolorK}\fi
   \let\longlocalcolor=\relax \let\localcolor=\relax \Black \linecolor\Black
}}

\ifpdftex\else
  \def\setcmykcolor#1{}      \def\pdfliteral#1{}
  \let\localcolor=\relax     \let\longlocalcolor=\relax
\fi

\def\draft{\edef\tmp{\headline={\noexpand\draftbox{\tenbf DRAFT}\the\headline}}\tmp}

\def\draftbox#1{\vbox to0pt{\setbox0=\hbox{\typosize[10/]#1}%
   \kern.5\vsize \kern4\wd0 \hbox to0pt{\kern.5\hsize \kern-2.5\wd0
   \pdfsave \pdfrotate{55}\pdfscale{10}{10}%
   \hbox to0pt{\localcolor\LightGrey \box0\hss}%
   \pdfrestore
\hss}\vss}\hss}

\ifpdftex\else
   \def\draft{\opwarning{\string\draft: Grey color is possible in pdfTeX only}}
\fi


%%%%%%%%%%%%%% Hyperrefs -- sec. 3.16 in opmac-d.pdf

\def\destheight{1.4em}
\def\destactive[#1:#2]{\if$#2$\else\ifvmode
      \tmpdim=\prevdepth \prevdepth=-1000pt
      \destbox[#1:#2]\prevdepth=\tmpdim
   \else \destbox[#1:#2]%
   \fi\fi
}
\def\destbox[#1]{\vbox to0pt{\kern-\destheight \pdfdest name{#1} xyz\vss}}
\def\dest[#1]{}

\def\linkactive[#1:#2]#3#4{\leavevmode\pdfstartlink height.9em depth.3em
      \pdfborder{#1} goto name{#1:#2}\relax {#3#4}\pdfendlink
}
\def\link[#1]#2#3{#3}

\def\urllink[#1:#2]#3{{\let~=\relax \let\\=\relax \let\{=\relax \let\}=\relax
   \leavevmode\pdfstartlink height.9em depth.3em
   \pdfborder{#1}user{/Subtype/Link/A <</Type/Action/S/URI/URI(#2)>>}\relax
   {\def~{\nobreak\space}\urlcolor#3}\pdfendlink}%
}
\def\toclink#1{\toclinkA{#1}}
\def\pglink#1{#1}
\def\citelink#1#2{#2}
\def\reflink[#1]#2{#2}
\def\ulink[#1]#2{{#2}}
\def\urlcolor{}

\def\hyperlinks#1#2{%
   \let\dest=\destactive \let\link=\linkactive
   \def\toclink##1{\link[toc:##1]{\localcolor#1}{\toclinkA{##1}}}%
   \def\pglink##1{\link[pg:##1]{\localcolor#1}{##1}}%
   \def\citelink##1##2{\link[cite:##1]{\localcolor#1}{##2}}%
   \def\reflink[##1]##2{\link[ref:##1]{\localcolor#1}{##2}}%
   \def\ulink[##1]##2{\urllink[url:##1]{##2}}%
   \def\urlcolor{\longlocalcolor#2}%
}

\def\pdfborder#1{\if^#1^\else \isdefined{#1border}\iftrue
   \if^\csname#1border\endcsname^\else attr{/C[\csname#1border\endcsname] /Border[0 0 .6]}%
   \fi\fi\fi
}

\ifpdftex \else
  \def\link[#1]#2#3{#3}
  \def\urllink[#1]#2{#2}
  \def\hyperlinks#1#2{}
\fi

\def\url#1{{\def\tmpb{#1}%
   \replacestrings{//}{{\urlskip\urlslashslash\urlbskip}}%
   \replacestrings{/}{{\urlskip/\urlbskip}}%
   \replacestrings{.}{{\urlskip.\urlbskip}}%
   \replacestrings{?}{{\urlskip?\urlbskip}}%
   \replacestrings{=}{{\urlskip=\urlbskip}}%
   \replacestrings{~}{{\char`\~}}%
   \replacestrings{_}{{\char`\_}}%
   \replacestrings{^}{{\char`\^}}%
   \replacestrings{\\}{\bslash}%
   \replacestrings{\{}{{\char`\{}}%
   \replacestrings{\}}{{\char`\}}}%
   \replacestrings{&}{{\urlbskip\char`\& \urlskip}}%
   \def\|{}\ulink[#1]{\urlfont\tmpb}%
}}
\def\urlfont{\tt \hyphenchar\the\font=-1 \let\|=\urlspecchar}
\def\urlspecchar{\penalty10 }
\def\urlskip{\null\nobreak\hskip0pt plus0.05em\relax}
\def\urlbskip{\penalty100 \hskip0pt plus0.05em\relax}
\def\urlslashslash{/\urlskip/}
\addprotect\url

\def\replacestrings#1#2{%
   \def\tmp##1#1##2\relax{\if$##2$\addto\tmpb{##1}\else\addto\tmpb{##1#2}\tmp##2\relax\fi}%
   \expandafter\def\expandafter\tmpb\expandafter{\expandafter}%
   \expandafter\tmp\tmpb\/#1\relax
   \def\tmp##1\/{\def\tmpb{##1}}\expandafter\tmp\tmpb
}


%%%%%%%%%%%%%% Outlines -- sec. 3.17 in opmac-d.pdf

\def\outlines#1{\pdfcatalog{/PageMode/UseOutlines}\openref\ifx\toclist\empty
     \opwarning{\noexpand\outlines -- data unavailable. TeX me again}%
   \else
     {\let\tocline=\outlinesA
      \count0=0 \count1=0 \toclist % calculate numbers o childs
      \def\outlinelevel{#1}\let\tocline=\outlinesB
      \count0=0 \count1=0 \toclist}% create outlines
   \fi
}
\def\outlinesA#1#2#3#4#5{%
   \advance\count#1 by1
   \ifcase#1\or
     \addoneol{ol:\the\count0}\or
     \addoneol{ol:\the\count0:\the\count1}\fi
}
\def\addoneol#1{\isdefined{#1}%
   \iftrue \tmpnum=\csname#1\endcsname\relax
           \advance\tmpnum by1 \sxdef{#1}{\the\tmpnum}%
   \else \sxdef{#1}{1}%
   \fi
}
\def\outlinesB#1#2#3#4#5{%
   \advance\count#1 by1
   \ifcase#1\tmpnum=\isdefined{ol:\the\count0}%
               \iftrue\csname ol:\the\count0\endcsname\else0\fi \or
            \tmpnum=\isdefined{ol:\the\count0:\the\count1}%
               \iftrue\csname ol:\the\count0:\the\count1\endcsname\else0\fi \or
            \tmpnum = 0 \fi
  \protectlist \def~{ }\setcnvcodesA 
  \expandafter \setlccodes \toasciidata{}{}%
  \cnvhook \lowercase{\gdef\tmp{#4}}%
  \pdfoutline goto name{toc:#3} count
     \ifnum#1<\outlinelevel\space\else-\fi\tmpnum {\tmp}\relax
}
\def\setcnvcodesA{\global\let\setcnvcodesA=\relax % I am working only once
  \ifx\r\undefined
     \gdef\toasciidata{}
     \opwarning{\noexpand\csaccents unused, CZ/SK outline-conversion is off}%
  \else
     \xdef\toasciidata{\toasciidata}%
  \fi
}
\def\toasciidata{%  Removes Czech+Slovak accents
       AA\'AA\"AA\'aa\"aaBBCC\v CC\v ccDD\v DD\v ddEE\'EE\v EE\'ee\v ee%
       FFGGHHII\'II\'iiJJKKLL\'LL\v LL\'ll\v llMMNN\v NN\v nnOO\'OO\"OO\^OO%
       \'oo\"oo\^ooPPQQRR\v RR\v rrSS\v SS\v ssTT\v TT\v ttUU\'UU\"UU\r UU%
       \'uu\"uu\r  uuVVWWXXYY\'YY\'yyZZ\v ZZ\v zz%
}
\def\setlccodes#1#2{\if\relax#2\relax \else \lccode`#1=`#2 \expandafter \setlccodes \fi}

\newcount\oulnum
\def\insertoutline#1{\global\advance\oulnum by1
   \pdfdest name{oul:\the\oulnum} xyz\relax
   \pdfoutline goto name{oul:\the\oulnum} count0 {#1}\relax
}

\ifpdftex \else
  \def\outlines#1{\opwarning{DVI output has no outlines}\gdef\outlines##1{}}
  \let\insertoutline=\outlines
\fi


%%%%%%%%%%%%%% Verbatim, \begtt, \endtt -- sec. 3.18 in opmac-d.pdf

\newcount\ttline    \ttline=-1
\newcount\viline
\newread\vifile

\def\setverb{\frenchspacing\def\do##1{\catcode`##1=12}\dospecials \catcode`\*=12 }
\def\begtt{\par\ttskip\bgroup \wipeepar
   \setverb \adef{ }{ }%
   \ifx\savedttchar\undefined \else \catcode\savedttchar=12 \fi
   \parindent=\ttindent
   \tthook\relax
   \ifnum\ttline<0 \else
     \tenrm \thefontscale[700]\let\sevenrm=\thefont
     \everypar={\global\advance\ttline by1
                \llap{\sevenrm\the\ttline\kern.9em}}\fi
   \def\par##1{\endgraf\ifx##1\egroup\else\penalty\ttpenalty\leavevmode\fi ##1}
   \obeylines \startverb}
{\catcode`\|=0 \catcode`\\=12
|gdef|startverb#1\endtt{|tt#1|egroup|par|ttskip|testparA}}
\def\testparA{\afterassignment\testparB\let\tmpa= }
\def\testparB{\futurelet\tmpa\testparC}
\def\testparC{\ifx\tmpa\par\else\afternoindent\fi}

\def\activettchar#1{%
   \ifx\savedttchar\undefined\else \catcode\savedttchar=\savedttcharc \fi
   \chardef\savedttchar=`#1%
   \chardef\savedttcharc=\catcode`#1%
   \bgroup\lccode`\~=`#1%
   \lowercase {\egroup\def~}{\leavevmode\hbox\bgroup\setverb\adef{ }{ }%
                      \intthook\tt\readverb}%
   \bgroup\lccode`\~=`#1\lowercase{\egroup\def\readverb ##1~}{##1\egroup}%
   \catcode`#1=13
}

\def\verbinput (#1) #2 {\par \def\tmpa{#2}%
   \ifx\vifilename\tmpa \else
      \openin\vifile=#2
      \global\viline=0 \global\let\vifilename=\tmpa
      \ifeof\vifile
         \opwarning{\noexpand\verbinput - file "#2" is unable to reading}
         \expandafter\expandafter\expandafter\skiptorelax
      \fi
   \fi
   \viscanparameter #1+\relax
}
\def\skiptorelax#1\relax{}

\def \viscanparameter #1+#2\relax{%
   \if$#2$\viscanminus(#1)\else \viscanplus(#1+#2)\fi
}
\def\viscanplus(#1+#2+){%
   \if$#1$\tmpnum=\viline
   \else \ifnum#1<0 \tmpnum=\viline \advance\tmpnum by-#1
       \else \tmpnum=#1
             \advance\tmpnum by-1
             \ifnum\tmpnum<0 \tmpnum=0 \fi % (0+13) = (1+13)
   \fi \fi
   \edef\vinolines{\the\tmpnum}%
   \if$#2$\def\vidolines{0}\else\edef\vidolines{#2}\fi
   \doverbinput
}
\def\viscanminus(#1-#2){%
   \if$#1$\tmpnum=0
      \else \tmpnum=#1 \advance\tmpnum by-1 \fi
   \ifnum\tmpnum<0 \tmpnum=0 \fi  % (0-13) = (1-13)
   \edef\vinolines{\the\tmpnum}%
   \if$#2$\tmpnum=0
      \else \tmpnum=#2 \advance\tmpnum by-\vinolines \fi
   \edef\vidolines{\the\tmpnum}%
   \doverbinput
}
\def\doverbinput{%
   \tmpnum=\vinolines
   \advance\tmpnum by-\viline
   \ifnum\tmpnum<0
      \openin\vifile=\vifilename\space
      \global\viline=0
   \else
      \edef\vinolines{\the\tmpnum}%
   \fi
   \par\ttskip\bgroup \wipeepar
   \setverb \adef{ }{ }%
   \ifx\savedttchar\undefined \else \catcode\savedttchar=12 \fi
   \parindent=\ttindent
   \tthook\relax
   \ifnum\ttline<-1 \else
      \tenrm \thefontscale[700]\let\sevenrm=\thefont \fi
   \tmpnum=0 \tt
   \loop \ifeof\vifile \tmpnum=\vinolines\space \fi
         \ifnum\tmpnum<\vinolines\space
         \vireadline \advance\tmpnum by1 \repeat      %% skip line
   \tmpnum=0 \ifnum\vidolines=0 \tmpnum=-1 \fi
   \ifeof\vifile \tmpnum=\vidolines\space \fi
   \loop \ifnum\tmpnum<\vidolines\space
            \vireadline 
            \ifeof\vifile \tmpnum=\vidolines\space \else
               \penalty\ttpenalty \viprintline \fi  %% print line
            \ifnum\vidolines=0 \else\advance\tmpnum by1 \fi 
            \repeat
   \egroup\par\ttskip\testparB
}
\def\vireadline{\read\vifile to \tmp \global\advance\viline by1 }
\def\viprintline{\indent
   \ifnum \ttline<-1 \else
      \llap{\sevenrm\ifnum\ttline<0 \the\viline \else
               \global\advance\ttline by1 \the\ttline \fi \kern.9em}%
   \fi
   \tmp\par % print the line from \tmp
}


%%%%%%%%%%%%%% \table -- sec. 3.19 in opmac-d.pdf

\newtoks\tabdata
\def\tabstrutA{\tabstrut}
\newcount\colnum  \colnum=0
\def\ddlinedata{}
\def\vvleft{}

\def\table{\vbox\bgroup \catcode`\|=12 \tableA}
\def\tableA#1#2{\offinterlineskip \def\tmpa{}\tabdata={}\scantabdata#1\relax
   \halign\expandafter{\the\tabdata\cr#2\crcr}\egroup}

\def\scantabdata#1{\let\next=\scantabdata
   \ifx\relax#1\let\next=\relax
   \else\ifx|#1\addtabvrule
      \else\expandafter\ifx\csname tabdeclare#1\endcsname \relax
            \opwarning{tab-declare letter #1 unknown, ignored}%
         \else\expandafter \addtabitem\expandafter{\csname tabdeclare#1\endcsname}%
   \fi\fi\fi \next
}
\def\tabdeclarec{\tabiteml\hfil##\unsskip\hfil\tabitemr}
\def\tabdeclarel{\tabiteml##\unsskip\hfil\tabitemr}
\def\tabdeclarer{\tabiteml\hfil##\unsskip\tabitemr}

\def\unsskip{\ifdim\lastskip>0pt \unskip\fi}
\def\addtabitem#1{\ifnum\colnum>0 \addtabdata{&}\addto\ddlinedata{&\dditem}\fi
    \advance\colnum by1 \let\tmpa=\relax \expandafter\addtabdata\expandafter{#1\tabstrutA}}
\def\addtabdata#1{\expandafter\tabdata\expandafter{\the\tabdata#1}}
\def\addtabvrule{\ifx\tmpa\vrule \addtabdata{\kern\vvkern}%
    \ifnum\colnum=0\def\vvleft{\vvitem}\else\addto\ddlinedata{\vvitem}\fi\fi
    \let\tmpa=\vrule \addtabdata{\vrule}}

\def\crl{\crcr\noalign{\hrule}}
\def\crll{\crcr\noalign{\hrule\kern\hhkern\hrule}}

\def\crli{\crcr \omit \gdef\dditem{\omit\tablinefil}\gdef\vvitem{\tabvvline}%
   \vvleft\tablinefil\ddlinedata\crcr}
\def\crlli{\crli\noalign{\kern\hhkern}\crli}
\def\tablinefil{\leaders\hrule\hfil}
\def\tabvvline{\vrule\kern\vvkern\vrule}

\def\tskip{\afterassignment\tskipA \tmpdim}
\def\tskipA{\gdef\dditem{}\gdef\vvitem{}\gdef\tabstrutA{}%
    \vrule height\tmpdim width0pt \ddlinedata\cr
    \gdef\tabstrutA{\tabstrut}}

\let\orihrule=\hrule  \let\orivrule=\vrule
\def\rulewidth{\afterassignment\rulewidthA \tmpdim}
\def\rulewidthA{\edef\hrule{\orihrule height\the\tmpdim}%
                \edef\vrule{\orivrule width\the\tmpdim}}

\long\def\frame#1{\setbox0=\hbox{{#1}}\setbox1=\vbox{\hrule}%
   \tmpdim=\dp0 \advance\tmpdim by\ht1 \advance\tmpdim by\hhkern
   \vbox{\hrule\hbox{\vrule\kern\vvkern
         \vbox{\kern\hhkern\box0\kern\hhkern}\kern\vvkern\vrule}%
         \hrule\kern-\tmpdim\hbox{\vrule depth\tmpdim width0pt}}}


%%%%%%%%%%%%%% \inspic -- sec. 3.20 in opmac-d.pdf

\newdimen\picwidth    \picwidth=0pt   \let\picw=\picwidth
\newdimen\picheight   \picheight=0pt

\ifpdftex
  \def\inspic #1 {\hbox{%
      \pdfximage \ifdim\picwidth=0pt \else width\picwidth\fi 
                 \ifdim\picheight=0pt \else height\picheight\fi {\picdir#1}%
      \pdfrefximage\pdflastximage}}
\else
  \def\inspic #1 {\opwarning
     {The \noexpand\inspic is supported for PDF output only}}
\fi

%%%%%%%%%%%%%%% transformation matrix -- sec. 3.21 in opmac-d.pdf

\def\pdfscale#1#2{\pdfsetmatrix{#1 0 0 #2}}

\def\pdfrotate#1{\tmpdim=#1pt
   \ifdim\tmpdim=0pt
   \else \ifdim\tmpdim=90pt \pdfsetmatrix{0 1 -1 0}%
         \else \edef\tmp{#1}\expandafter\pdfrotateA\tmp..\relax
   \fi   \fi
}
\def\pdfrotateA #1.#2.#3\relax{%
   \def\tmp##1.##2\relax {##1}%
   \tmpnum=\expandafter \tmp \the\tmpdim \relax % round
   \ifdim\tmpdim>0pt \def\tmpa{}\else\def\tmpa{-}\fi % save -
   \loop \ifnum\tmpnum<0 \advance\tmpnum by360 \repeat
   \loop \ifnum\tmpnum>360 \advance\tmpnum by-360 \repeat
   \loop \ifnum\tmpnum>90 \pdfrotate{90}\advance\tmpnum by-90 \repeat
   \ifnum\tmpnum=90 \pdfrotate{90}\else
      \ifnum\tmpnum>44 \pdfsetmatrix{.7071 .7071 -.7071 .7071}%
                       \advance\tmpnum by-45 \fi
      \ifnum\tmpnum>22 \pdfsetmatrix{.9272 .3746 -.3746 .9272}%
                       \advance\tmpnum by-22 \fi
      \ifnum\tmpnum>0
         \pdfsetmatrix{\smallcos \smallsin -\smallsin \smallcos}%
   \fi\fi
   \if$#2$\else % fraction part
      \tmpdim=.01745329pt % \pi/180
      \tmpdim=.#2\tmpdim  %
      \edef\tmp{\expandafter\ignorept\the\tmpdim\space}%
      \ifx\tmpa\empty \pdfsetmatrix{1 \tmp -\tmp 1}%
      \else           \pdfsetmatrix{1 -\tmp \tmp 1}%
   \fi\fi
}
\def\smallcos{.\ifcase\tmpnum \or9998\or9994\or9986\or9976\or9962\or9945\or
  9925\or9903\or9877\or9848\or9816\or9781\or9744\or9703\or9659\or9613\or
  9563\or9511\or9455\or9397\or9336\or9272\fi\space}
\def\smallsin{.\ifcase\tmpnum 0\or0175\or0359\or0523\or0698\or0872\or1045\or
  1219\or1391\or1564\or1736\or1908\or2079\or2250\or2419\or2588\or2756\or
  2924\or309\or3256\or342\or3584\or3746\fi\space}

\ifpdftex \else
  \def\pdfsetmatrix#1{} \def\pdfsave{} \def\pdfrestore{}
\fi


%%%%%%%%%%%%%% \fnote, \mnote -- sec 3.22 in opmac-d.pdf

\newcount\fnotenum \fnotenum=0
\newcount\fnotenumlocal
\newif\iflocfnum \locfnumtrue

\def\fnote#1{\global\advance \fnotenum by1
   \iflocfnum \leavevmode\openref\wref\Xfnote{}%
      \isdefined{fn:\the\fnotenum}\iftrue
      \else\opwarning{unknown \noexpand\fnote mark. TeX me again}\fi\fi
   \fnmarkx{\fnotehook\typobase\typoscale[800/800]\vfootnote\fnmarkx{#1}}%
}
\def\fnotemark#1{{\advance\fnotenum by#1\relax
   \isdefined{fn:\the\fnotenum}\iftrue\thefnote
   \else$^?$\opwarning{unknown \string\fnotemark. TeX me again}\fi}%
}
\def\fnotetext#1{\global\advance \fnotenum by1 \openref\wref\Xfnote{}%
   {\typoscale[800/800]\vfootnote\fnmarkx{#1}}%
}
\def\fnmarkx{\isdefined{fn:\the\fnotenum}\iftrue\thefnote\else$^?$\fi}
\def\thefnote{$^{\locfnum}$)}
\def\locfnum{\csname fn:\the\fnotenum\endcsname}

\def\Xfnote{\advance\fnotenumlocal by1 \advance\fnotenum by1
   \sxdef{fn:\the\fnotenum}{\the\fnotenumlocal}}

\def\runningfnotes{\locfnumfalse\def\locfnum{\the\fnotenum}\def\fnmarkx{\thefnote}}

\newcount\mnotenum    \mnotenum=0       % global counter of mnotes
\newdimen\mnoteskip   \mnoteskip=0pt

\def\mnote#1{\ifvmode \mnoteA{#1}\nobreak\vskip-\baselineskip
   \else \strut\vadjust{\kern-\dp\strutbox \mnoteA{#1}\kern\dp\strutbox}%
   \fi
}
\def\mnoteA#1{\global\advance \mnotenum by1
   \ifx\mnotesfixed\undefined
      \isdefined{mn:\the\mnotenum}\iftrue
      \else\opwarning{unknown \noexpand\mnote side. TeX me again}\fi
      \edef\tmp{\csname mn:\the\mnotenum\endcsname}%
      \openref\wref\Xmnote{}%
   \else \let\tmp=\mnotesfixed \fi
   \expandafter\ifx\tmp \left
      \hbox to0pt{\pdfsave\mnoteC\kern-\mnotesize \kern-\mnoteindent
         \vbox to0pt{\vss \setbox0=\vtop{\hsize=\mnotesize 
            \leftskip=0pt plus 1fill \rightskip=0pt {\mnotehook\noindent#1\endgraf}}%
         \dp0=0pt \box0 \kern\mnoteskip \global\mnoteskip=0pt}\hss\mnoteD\pdfrestore}%
   \else
      \hbox to0pt{\pdfsave\mnoteC\kern\hsize \kern\mnoteindent
         \vbox to0pt{\vss \setbox0=\vtop{\hsize=\mnotesize 
             \rightskip=0pt plus 1fil \leftskip=0pt {\mnotehook\noindent#1\endgraf}}%
          \dp0=0pt \box0 \kern\mnoteskip \global\mnoteskip=0pt}\hss\mnoteD\pdfrestore}%
   \fi
}
\def\mnoteC{\writecolorfalse \let\longlocalcolor=\localcolor
   \edef\mnoteD{\xdef\noexpand\currcolork{\currcolork}\xdef\noexpand\currcolorK{\currcolorK}}%
   \def\currcolork{}\def\currcolorK{}%
}
\def\Xmnote{\advance\mnotenum by1
   \sxdef{mn:\the\mnotenum}{\ifodd\lastpage \right \else \left \fi}}

\def\fixmnotes#1{\def\mnotesfixed{#1}}


%%%%%%%%%%%%%% \cite, \bib, \usebibtex, \usebbl -- sec. 3.23 in opmac-d.pdf

\newwrite\auxfile                      % AUX file for BibTeX
\newcount\bibnum                       % the bibitem counter
\newtoks\bibmark                       % the bibmark used if \nonumcitations
\newcount\lastcitenum  \lastcitenum=0  % for \shortcitations

\def\cite[#1]{{\citeA#1,,,[\printsavedcites]}}
\def\nocite[#1]{{\citeA#1,,,}}
\def\rcite[#1]{{\citeA#1,,,\printsavedcites}}
\def\savedcites{}

\def\citeA #1#2,{\if#1,\else 
   \if *#1\addcitelist{*}\expandafter \skiptorelax \fi
   \isdefined{bib:#1#2}\iftrue \else
      \addcitelist{#1#2}%
      \opwarning{The cite [#1#2] unknown. Try to TeX me again}\openref
      \addto\savedcites{?,}\def\sortcitesA{}\lastcitenum=0
      \expandafter\gdef\csname bib:#1#2\endcsname {}%
      \expandafter \skiptorelax \fi
   \expandafter \ifx \csname bib:#1#2\endcsname \empty
      \addto\savedcites{?,}\def\sortcitesA{}\lastcitenum=0
      \expandafter \skiptorelax \fi
   \def\bibnn##1{}%
   \if &\csname bib:#1#2\endcsname
      \addcitelist{#1#2}%
      \def\bibnn##1##2{##1}%
      \sxdef{bib:#1#2}{\csname bib:#1#2\endcsname}%
   \fi
   \edef\savedcites{\savedcites \csname bib:#1#2\endcsname,}%
   \relax
   \expandafter\citeA\fi
}
\def\printsavedcites{\sortcitesA 
   \chardef\tmpb=0 \expandafter\citeB\savedcites,%
   \ifnum\tmpb>0 \printdashcite{\the\tmpb}\fi
}
\def\sortcitesA{}
\def\sortcitations{%
  \def\sortcitesA{\edef\savedcites{300000,\expandafter}\expandafter\sortcitesB\savedcites,%
                  \def\tmpa####1300000,{\def\savedcites{####1}}\expandafter\tmpa\savedcites}%
}
\def\sortcitesB #1,{\if $#1$%
  \else
     \mathchardef\tmpa=#1
     \edef\savedcites{\expandafter}\expandafter\sortcitesC \savedcites\end
     \expandafter\sortcitesB 
  \fi
}
\def\sortcitesC#1,{\ifnum\tmpa<#1\edef\tmpa{\the\tmpa,#1}\expandafter\sortcitesD 
                   \else\edef\savedcites{\savedcites#1,}\expandafter\sortcitesC\fi}
\def\sortcitesD#1\end{\edef\savedcites{\savedcites\tmpa,#1}}

\def\citeB#1,{\if$#1$\else
   \if?#1\relax??%
      \else
      \ifnum\lastcitenum=0   % only comma separated list
         \printcite{#1}%
      \else
         \ifx\citesep\empty  % first cite item
            \lastcitenum=#1\relax
            \printcite{#1}%
         \else               % next cite item
            \advance\lastcitenum by1
            \ifnum\lastcitenum=#1\relax % cosecutive cite item
               \mathchardef\tmpb=\lastcitenum
            \else  % there is a gap between cite items
               \lastcitenum=#1\relax
               \ifnum\tmpb=0 % previous items were printed
                  \printcite{#1}%
               \else
                  \printdashcite{\the\tmpb}\printcite{#1}\chardef\tmpb=0
   \fi\fi\fi\fi\fi
   \expandafter\citeB\fi
}
\def\shortcitations{\lastcitenum=1 }

\def\printcite#1{\citesep\citelink{#1}{\citelinkA{#1}}\def\citesep{,\hskip.2em\relax}}
\def\printdashcite#1{\ifmmode-\else\hbox{--}\fi\citelink{#1}{\citelinkA{#1}}}
\def\citesep{}

\def\nonumcitations{\lastcitenum=0\def\sortcitesA{}\def\etalchar##1{$^{##1}$}%
   \def\citelinkA##1{\isdefined{bim:##1}\iftrue \csname bim:##1\endcsname
      \else ##1\opwarning{\noexpand\nonumcitations + empty bibmark. Maybe bad BibTeX style}\fi}
}
\def\citelinkA{}

\def\ecite[#1]{\bgroup\citeA#1,,,\expandafter\eciteB\savedcites;}
\def\eciteB#1,#2;#3{\if?#1\relax #3\else \citelink{#1}{#3}\fi\egroup}

\def\bib[#1] {\isnextchar={\bibA[#1]}{\bibmark={}\bibB[#1]}}
\def\bibA[#1]=#2{\bibmark={#2}\bibB[#1]}
\def\bibB[#1]{\par \ifnum\bibnum>0 \bibskip \fi
   \advance\bibnum by1
   \noindent \def\tmpb{#1}\wbib{#1}{\the\bibnum}{\the\bibmark}%
   \printbib \ignorespaces
}
\def\wbib#1#2#3{\dest[cite:\the\bibnum]%
   \ifx\wref\wrefrelax\else \immediate\wref\Xbib{{#1}{#2}{#3}}\fi}

\def\Xbib#1#2#3{\sdef{bib:#1}{\bibnn{#2}&}\if^#3^\else\sdef{bim:#2}{#3}\fi\def\lastbibnum{#2}}

\def\printbib{\hangindent=\iindent
   \ifx\citelinkA\empty \noindent\hskip\iindent \llap{[\the\bibnum] }%
   \else \noindent \fi
}

\def\addcitelist#1{\global\addto\citelist{\citeI[#1]}}
\def\writeaux#1{\immediate\write\auxfile{\string\citation{#1}}}
\def\writeXcite#1{\openref\immediate\wref\Xcite{{#1}}}
\def\citelist{} \def\citelistB{}

\def\usebibtex#1#2{%
   \openref \openauxfile{#1}{#2}%
   \def\citeI[##1]{\writeaux{##1}}\citelist
   \global\let\addcitelist=\writeaux
   \bgroup \readbblfile{\jobname}\egroup
}
\def\openauxfile#1#2{%
   \immediate\openout\auxfile=\jobname.aux
   \immediate\write\auxfile
      {\percent\percent\space Opmac: AUX file reserved for bibtex only}%
   \immediate\write\auxfile{\string\bibdata{#1}}%
   \immediate\write\auxfile{\string\bibstyle{#2}}%
}
\def\readbblfile #1{%
  \openin\testin=#1.bbl
  \ifeof\testin
    \opwarning{.bbl file doesn't exist. Use the ``bibtex #1'' command}%
  \else
    \closein\testin
    \bibnum=0
    \long\def\begin##1\bibitem{\bibitem}\def\end##1{}% LaTeX environment
    \def\httpAddr##1{\url{http:##1}}\def\\{\hfill\break}%
    \def\newblock{\hskip .11em plus.33em minus.07em}%
    \def\mbox{\leavevmode\hbox}\def\emph##1{{\it##1}}%
    \parindent=\iindent \bibtexhook\relax
    \input #1.bbl
    \par
  \fi
}
\def\bibitem{\isnextchar[{\bibitemB}{\bibmark={}\bibitemC}}
\def\bibitemB[#1]{\bibmark={#1}\bibitemC}
\def\bibitemC#1{\bibitemD{#1}}
\def\bibitemD#1{\par\ifnum\bibnum>0 \bibskip \fi
   \advance\bibnum by1
   \noindent \def\tmpb{#1}\wbib{#1}{\the\bibnum}{\the\bibmark}% 
   \printbib \ignorespaces
}
\def\genbbl#1#2{\openauxfile{#1}{#2}%
   \immediate\write\auxfile{\string\citation{*}}%
   \bgroup
     \iindent=4em
     \def\bibitemC##1{\par\ifnum\bibnum>0 \bibskip \fi
        \advance\bibnum by1
        \noindent \hangindent=\parindent 
        \indent \llap{[##1]\enspace}\ignorespaces
     }%
     \readbblfile{\jobname}%
   \egroup
}
\def\usebbl/#1 #2 {\isdefined{bbl:#1}%
   \iftrue \csname bbl:#1\endcsname {#2}\else
      \opwarning{\string\usebbl/#1 #2 ... the `#1' type undefined}%
   \fi
}
\sdef{bbl:a}#1{\bgroup \readbblfile{#1}\egroup}

\sdef{bbl:b}#1{\bgroup
     \let\citeI=\relax \xdef\citelist{\citelist\citelistB}%
     \def\bibitemC##1 ##2\par{%
        \isinlist\citelist{[##1]}\iftrue \bibitemD{##1}##2\par\fi}%
     \readbblfile{#1}%
     \global\let\addcitelist=\writeXcite
  \egroup
}
\sdef{bbl:c}#1{\bgroup
     \ifx\citelinkA\empty \else 
         \opwarning{\string\nonumcitations: don't use \string\usebbl/c}\fi
     \let\citeI=\relax \xdef\citelist{\citelist\citelistB}%
     \def\bibitemC##1 ##2\par{%
        \isinlist\citelist{[##1]}\iftrue
           \if^\the\bibmark^\sdef{bb:##1}{\bibitemD{##1}##2\par}%
           \else \toks0={##2\par}%
                 \edef\tmpa{\noexpand\sdef{bb:##1}{% \the\bibmark have to expand
                      \noexpand\bibitemB[\the\bibmark]{##1}\the\toks0}}\tmpa
        \fi\fi}%
     \readbblfile{#1}%
     \def\bibitemC##1{\bibitemD{##1}}%
     \def\citeI[##1]{\csname bb:##1\endcsname}\citelist
     \global\let\addcitelist=\writeXcite
  \egroup
}
\def\Xcite#1{\addto\citelistB{\citeI[#1]}}


%%%%%%%%%%%%%% output -- sec. 3.24 in opmac-d.pdf

\output={\begoutput \opmacoutput \endoutput}

\def\opmacoutput{%
  \setbox0=\vbox{\makeheadline\pagebody\makefootline}%
  \pghook \protectlist
  \shipout\box0 \advancepageno
  \ifnum\outputpenalty>-20000 \else\dosupereject\fi
}
\def\doprotect#1{\let#1=\relax}
\addto\begoutput{\def\nl{ }\def\fnote##1{}\def\fnotemark##1{}}
\def\prepage{\def\destheight{25pt}\dest[pg:\the\pageno]}

{\catcode`\@=11
\gdef\pagecontents{\prepage % dest of pageno
  \ifvoid\topins\else\unvbox\topins\fi
  \preboxcclv  % colors setting
  \dimen@=\dp\@cclv \unvbox\@cclv % open up \box255
  \postboxcclv % colors restoring
  \ifvoid\footins\else % footnote info is present
    \vskip\skip\footins
    \footnoterule
    \unvbox\footins\fi
  \ifr@ggedbottom \kern-\dimen@ \vfil \fi
}}

\footline={\hss\tenrm\thefontsize[10]\the\pageno\hss}


%%%%%%%%%%%%%% margins -- sec. 3.25 in opmac-d.pdf

\newdimen\pgwidth  \newdimen\pgheight  \pgwidth=0pt
\newdimen\shiftoffset
\newif\ifmarginshook  \marginshookfalse

\def\margins/#1 #2 (#3,#4,#5,#6)#7 {\def\tmp{#7}%
   \ifx\tmp\empty
      \opwarning{\string\margins: missing unit, mm inserted}\def\tmp{mm}\fi
   \addto\tmp{\relax}%
   \setpagedimens #2 % setting \pgwidth, \pgheight
   \ifdim\pgwidth=0pt \else
      \hoffset=-1\trueunit in \voffset=-1\trueunit in
      \if$#3$\if$#4$\tmpdim=\pgwidth \advance\tmpdim -\hsize
                    \divide\tmpdim by2 \advance\hoffset \tmpdim % left=right
             \else  \rbmargin\hoffset\hsize{#4\tmp}% only right margin
             \fi
      \else  \if$#4$\advance\hoffset #3\tmp   % only left margin
             \else  \hsize=\pgwidth           % left+right margin
                    \advance\hsize -#3\tmp \advance\hsize -#4\tmp
                    \advance\hoffset #3\tmp
      \fi\fi
      \if$#5$\if$#6$\tmpdim=\pgheight \advance\tmpdim -\vsize
                    \divide\tmpdim by2 \advance\voffset \tmpdim % top=bottom
             \else  \rbmargin\voffset\vsize{#6\tmp}% only bottom margin
             \fi
      \else  \if$#6$\advance\voffset #5\tmp   % only top margin
             \else  \vsize=\pgheight          % top+bottom margin
                    \advance\vsize -#5\tmp \advance\vsize -#6\tmp
                    \advance\voffset #5\tmp
      \fi\fi
      \if 1#1\shiftoffset=0pt \else \if 2#1% double-page layout
         \shiftoffset=\pgwidth \advance\shiftoffset -\hsize
         \advance\shiftoffset -2\hoffset \advance\shiftoffset -2in
         \ifmarginshook \else \marginshooktrue
            \addto\pghook{\ifodd\pageno \else \advance\hoffset \shiftoffset \fi}\fi
      \else \opwarning{use \string\margins/1 or \string\margins/2}%
   \fi\fi\fi
}
\def\rbmargin#1#2#3{\advance#1\pgwidth \advance#1-#2 \advance#1-#3}

\def\setpagedimens#1 {\isdefined{pgs:#1}\iftrue
   \expandafter\expandafter\expandafter \setpagedimensA \csname pgs:#1\endcsname&%
   \else \opwarning{page specification "#1" is undefined}\fi}
\def\setpagedimensA (#1,#2)#3&{\pgwidth=#1\trueunit#3 \pgheight=#2\trueunit#3\relax
    \ifx\pdfpagewidth\undefined \else
        \pdfpagewidth=\pgwidth \pdfpageheight=\pgheight \fi}

\sdef{pgs:a3}{(297,420)mm}  \sdef{pgs:a4}{(210,297)mm}  \sdef{pgs:a5}{(148,210)mm}
\sdef{pgs:a3l}{(420,297)mm} \sdef{pgs:a4l}{(297,210)mm} \sdef{pgs:a5l}{(210,148)mm}
\sdef{pgs:b5}{(176,250)mm}  \sdef{pgs:letter}{(8.5,11)in}

\def\trueunit{}
\def\magscale[#1]{\mag=#1\def\trueunit{true}%
   \ifdim\pgwidth=0pt \else \truedimen\pgwidth \truedimen\pgheight \fi
   \ifx\pdfpagewidth\undefined \else 
       \truedimen\pdfpagewidth \truedimen\pdfpageheight 
       \pdfhorigin=1truein \pdfvorigin=1truein % Origin is independent off \mag 
   \fi}
\def\truedimen#1{#1=\expandafter\ignorept\the#1truept }

%%%%%%%%%%%%%% XeTeX specific + REF file is read now -- sec 3.26 in opmac-d.pdf

\ifx\XeTeXversion\undefined \else \pdftexfalse \input opmac-xetex \fi
\inputref
\endinput

%%%%%%%%%%%%%% History of versions:

beta (a) Nov. 2012 ... first released version.
Dec. 2012  first stable version
Jan. 2013  \parfillskip in \caption corrected.
           \athetnum, \captionhook introduced.
           \nobreak in \tocline corrected, \tocdotfill corrected.
           New \url, \urlcolor implicitly defined as \empty.
           \bibitem by \hangindent, \afteritcorr in \em
           \bslash introduced
           \toclinehook \mnotehook, \mnoteskip introduced.
           \global\advance in \caption corrected.
           \thechapnum is without the dot.
Feb. 2013  \urllink: works with \\, \%, \#, \$, \{, \}.
           \localcolor, \longlocalcolor introduced
           \global\advance for chap./sec. nums corrected
           \printcaption introduced
Apr. 2013  \table in \table allowed, \catcode`\|=12 set in \table.
           \printsec(c): \ifnum\lastpenalty added.
           \urlink: ``~ removing'' corrected
           {\em text}\macro error  corrected.
May  2013  \margins (2pages laylout) can be redefined by new \margins
           \outlines use \pdfcatalog{/PageMode/UseOutlines}
Jul. 2013  \fnotetext unwanted space - corrected
           \picw=0pt prints picture in natural size, \picheight introduced
           \isinlist corrected,
           \othe\secnum in \secc removed
           \dotocnum, \remskip, \reminsert introduced
           \nonum, \notoc implemented
           \destheight introduced as macro
           \runningfnotes introduced
           \addto defined as \long
           \iiskip, \ttskip, \bibskip precedes by \par
Aug. 2013  \dgsize corrected
           \ifx\tmpa\tmpb in \printiiA is realized via \meaning
           \ignorespaces included to \iis
           \url hidden in group, in order to handle & in tables
           \destheight rewritten as a dimen register
           \rightskip, \leftskip corrected in \mnote
           space corrected in \prepii
           \input ams-math only if \normalmath is \undefined (released)
Sep. 2013  \label: the ``duplicated label'' test added
           \afternoindent: \box0 -> \box7
           \scantabdata: \if#1| -> \ifx|#1
           \fixmnotes recoded
           \, uses \thinspace and it is \addprotected
           \pdfliteral instead \special{PDF:...} used
           XeTeX specific added
           \draft, \insertoulines recoded
           \endinsert redefined (\par added)
           \addprotect\exfont (for exchars.tex cooperating)
           \ulink improved and added to opmac-u
           \postboxcclv: {\advancepageno} corrected
Oct. 2013  /Border .6
           better \adef
           \typobase introduced
           \typoscale[20000/] ``too large dimension'' ... solved 
           \activettchar reimplemented
Nov. 2013  \Xpage: \ifnum\lastpage=#1 \else inserted
           \frame is defined as \long
           multilanuage: cz -> cs changed (by ISO 639-1)
           \cr -> \crcr in \crl, \crll and \crli
           \doverbinput: \ifeof\vifile added (bug ``empty line at EOF'' corrected)
           eTeX support for multilang added.
Feb. 2014  \sortcitations introduced, internal macros of \cite rewritten
Mar. 2014  \frame: \setbox0=\hbox{{#1}} in order to \aftergroup in #1
           \mnote: \pdfsave,\pdfrestore inserted, \mnote colors rewritten
Apr. 2014  \nonumcitations, \ecite, \printbib, \lastbibnum introduced
           \wbib, \citelink rewritten (more parameters now)
           \destheight rewritten as macro, sorry
           \fnotehook introduced
Apr. 2014b \nocite[*] bug removed, \insertmark corrected
Apr. 2014c nowarn about old csplain if csplain isn't used
May  2014  \hyphenchar\urlfont=-1, \urlspecchar introduced
May  2014b \linkactive introduced (bug fixing)
May  2014c \maybebreak introduced
May  2014d \seccfont bug fixed
           \tabstrut inserted to each column in the \table


%%%%%%%%%%%%%% End of opmac.tex
