%%
%% This file contains the main style commands
%%
%% Some options can be set by changing the \loaddefaults command
%%

\usepackage{color}
\usepackage{marginnote}

\def\loaddefaults{
  \sectionstrue
  \subseqcountfalse
  \def\seqskip{\vskip1.5cm}
  \def\subseqskip{\vskip1cm}
  \resetpointattheofalse
  \parindent=0pt
  \def\indent{\hskip20pt}
}

% false if there are no sections
\newif\ifsections
% true if equation numbers should include the subsection number
\newif\ifsubseqcount
% true if there is a table of contents
\newif\iftoc
% true if point counting should reset at each theorem
\newif\ifresetpointattheo

% a prefix to put before the section number, e.g. A for appendices
\def\sectionprefix{}

\loaddefaults

%% style for the equation number
\def\eqnumstyle{}

%% correct vertical alignment at the end of a document
\AtEndDocument{
  \vfill
  \eject
}

%% prevent page breaks
\newcount\prevpostdisplaypenalty
\def\nopagebreakaftereq{
  \prevpostdisplaypenalty=\postdisplaypenalty
  \postdisplaypenalty=10000
}
\def\restorepagebreakaftereq{
  \postdisplaypenalty=\prevpostdisplaypenalty
}

%% hyperlinks
% hyperlinkcounter
\newcounter{lncount}
% hyperref anchor
\def\hrefanchor{%
\stepcounter{lncount}%
\hypertarget{ln.\thelncount}{}%
}

%% define a command and write it to aux file
\def\outdef#1#2{%
% define command
\expandafter\xdef\csname #1\endcsname{#2}%
% hyperlink number
\expandafter\xdef\csname #1@hl\endcsname{\thelncount}%
% write command to aux
\immediate\write\@auxout{\noexpand\expandafter\noexpand\gdef\noexpand\csname #1\endcsname{\csname #1\endcsname}}%
\immediate\write\@auxout{\noexpand\expandafter\noexpand\gdef\noexpand\csname #1@hl\endcsname{\thelncount}}%
}


%% define a label for the latest tag
%% label defines a command containing the string stored in \tag
\AtBeginDocument{
  \def\label#1{\expandafter\outdef{label@#1}{\safe\tag}}

%% make a custom link at any given location in the document
\def\makelink#1#2{
  \hrefanchor
  \outdef{label@#1}{#2}
}

\def\ref#1{%
% check whether the label is defined (hyperlink runs into errors if this check is ommitted)
\ifcsname label@#1@hl\endcsname%
\hyperlink{ln.\csname label@#1@hl\endcsname}{{\color{blue}\safe\csname label@#1\endcsname}}%
\else%
\ifcsname label@#1\endcsname%
{\color{blue}\csname #1\endcsname}%
\else%
{\bf ??}%
\fi%
\fi%
}
}

%% counters
\newcounter{sectioncount}
\newcounter{subsectioncount}
\newcounter{pointcount}
\newcounter{subpointcount}
\newcounter{subsubpointcount}
\newcounter{seqcount}
\newcounter{figcount}
\newcounter{Theocount}
\newcounter{tocsectioncount}
\newcounter{tocsubsectioncount}

%% section command
\newlength\secnumwidth
\newlength\sectitlewidth
\def\section#1{%
% reset counters
\stepcounter{sectioncount}%
\setcounter{subsectioncount}{0}%
\setcounter{pointcount}{0}%
\setcounter{subpointcount}{0}%
\setcounter{subsubpointcount}{0}%
\setcounter{figcount}{0}%
\setcounter{Theocount}{0}%
\setcounter{seqcount}{0}%
% space before section (if not first)
\ifnum\thesectioncount>1%
\seqskip%
\penalty-1000%
\fi%
% hyperref anchor
\hrefanchor%
% define tag (for \label)
\xdef\tag{\sectionprefix\thesectioncount}%
% get widths
\def\@secnum{{\bf\Large\sectionprefix\thesectioncount.\hskip10pt}}%
\settowidth\secnumwidth{\@secnum}%
\setlength\sectitlewidth\textwidth%
\addtolength\sectitlewidth{-\secnumwidth}%
% print name
\parbox{\textwidth}{%
\@secnum%
\parbox[t]{\sectitlewidth}{\Large\bf #1}}%
% write to table of contents
\iftoc%
% save lncount in aux variable which is written to toc
\immediate\write\tocoutput{\noexpand\expandafter\noexpand\edef\noexpand\csname toc@sec.\thesectioncount\endcsname{\thelncount}}%
\write\tocoutput{\noexpand\tocsection{#1}{\thepage}}%
\fi%
\par\penalty10000%
\bigskip\penalty10000%
}

%% subsection
\def\subsection#1{
% counters
\stepcounter{subsectioncount}%
\setcounter{pointcount}{0}%
\setcounter{subpointcount}{0}%
\setcounter{subsubpointcount}{0}%
\ifsubseqcount%
\setcounter{seqcount}0%
\fi%
% space before subsection
\subseqskip%
\penalty-500%
% hyperref anchor
\hrefanchor
% define tag (for \label)
\xdef\tag{\sectionprefix\thesectioncount.\thesubsectioncount}%
% get widths
\def\@secnum{{\bf\large\hskip.5cm\sectionprefix\thesectioncount.\thesubsectioncount.\hskip5pt}}%
\settowidth\secnumwidth{\@secnum}%
\setlength\sectitlewidth\textwidth%
\addtolength\sectitlewidth{-\secnumwidth}%
% print name
\parbox{\textwidth}{%
\@secnum%
\parbox[t]{\sectitlewidth}{\large\bf #1}}%
% write to table of contents
\iftoc%
% save lncount in aux variable which is written to toc
\immediate\write\tocoutput{\noexpand\expandafter\noexpand\edef\noexpand\csname toc@subsec.\thesectioncount.\thesubsectioncount\endcsname{\thelncount}}%
\write\tocoutput{\noexpand\tocsubsection{#1}{\thepage}}%
\fi%
\par\penalty10000%
\medskip\penalty10000%
}

%% itemize
\newlength\itemizeskip
% left margin for items
\setlength\itemizeskip{20pt}
% item symbol
\def\itemizept{\textbullet}
\newlength\itemizeseparator
% space between the item symbol and the text
\setlength\itemizeseparator{5pt}
% penalty preceding an itemize
\def\itemizepenalty{0}

\newlength\current@itemizeskip
\setlength\current@itemizeskip{0pt}
\def\itemize{
  \par\penalty\itemizepenalty\medskip\penalty\itemizepenalty
  \addtolength\current@itemizeskip{\itemizeskip}
  \leftskip\current@itemizeskip
}
\def\enditemize{
  \addtolength\current@itemizeskip{-\itemizeskip}
  \par\leftskip\current@itemizeskip
  \medskip
}
\newlength\itempt@total
\def\item{
  \settowidth\itempt@total{\itemizept}
  \addtolength\itempt@total{\itemizeseparator}
  \par
  \medskip
  \hskip-\itempt@total\itemizept\hskip\itemizeseparator
}

%% enumerate
\newcounter{enumerate@count}
\def\enumerate{
  \setcounter{enumerate@count}0
  \let\olditem\item
  \let\olditemizept\itemizept
  \def\item{
    % counter
    \stepcounter{enumerate@count}
    % set header
    \def\itemizept{\theenumerate@count.}
    % hyperref anchor
    \hrefanchor
    % define tag (for \label)
    \xdef\tag{\theenumerate@count}
    \olditem
  }
  \itemize
}
\def\endenumerate{
  \enditemize
  \let\item\olditem
  \let\itemizept\olditemizept
}

%% points
\def\point{
  \stepcounter{pointcount}
  \setcounter{subpointcount}{0}
  % hyperref anchor
  \hrefanchor
  \indent{\bf \thepointcount\ - }
  % define tag (for \label)
  \xdef\tag{\thepointcount}
}
\def\subpoint{
  \stepcounter{subpointcount}
  \setcounter{subsubpointcount}0
  % hyperref anchor
  \hrefanchor
  \indent\hskip.5cm{\bf \thepointcount-\thesubpointcount\ - }
  % define tag (for \label)
  \xdef\tag{\thepointcount-\thesubpointcount}
}
\def\subsubpoint{
  \stepcounter{subsubpointcount}
  % hyperref anchor
  \hrefanchor
  \indent\hskip1cm{\bf \thepointcount-\thesubpointcount-\thesubsubpointcount\ - }
  % define tag (for \label)
  \xdef\tag{\thepointcount-\thesubpointcount-\thesubsubpointcount}
}
\def\pspoint{
  \stepcounter{pointcount}
  \stepcounter{subpointcount}
  \setcounter{subsubpointcount}0
  % hyperref anchor
  \hrefanchor
  \indent\hskip.5cm{\bf \thepointcount-\thesubpointcount\ - }
  % define tag (for \label)
  \xdef\tag{\thepointcount-\thesubpointcount}
}
  
% reset points
\def\resetpointcounter{
  \setcounter{pointcount}{0}
  \setcounter{subpointcount}{0}
  \setcounter{subsubpointcount}{0}
}

%% equation numbering
\def\seqcount{
  \stepcounter{seqcount}
  % the output
  \edef\seqformat{\theseqcount}
  % add subsection number
  \ifsubseqcount
    \let\tmp\seqformat
    \edef\seqformat{\thesubsectioncount.\tmp}
  \fi
  % add section number
  \ifsections
    \let\tmp\seqformat
    \edef\seqformat{\sectionprefix\thesectioncount.\tmp}
  \fi
  % define tag (for \label)
  \xdef\tag{\seqformat}
  % write number
  \marginnote{\eqnumstyle\hfill(\seqformat)}
}
%% equation environment compatibility
\def\equation{\hrefanchor$$\seqcount}
\def\endequation{$$\@ignoretrue}

%% figures
\newlength\figwidth
\setlength\figwidth\textwidth
\addtolength\figwidth{-2.5cm}

\def\caption#1{%
\stepcounter{figcount}%
% hyperref anchor
\hrefanchor%
% the number of the figure
\edef\figformat{\thefigcount}%
% add section number
\ifsections%
\let\tmp\figformat%
\edef\figformat{\sectionprefix\thesectioncount.\tmp}%
\fi%
% define tag (for \label)
\xdef\tag{\figformat}%
% write
\hfil fig \figformat: \parbox[t]{\figwidth}{\leavevmode\small#1}%
\par\bigskip%
}
%% short caption: centered
\def\captionshort#1{%
\stepcounter{figcount}%
% hyperref anchor
\hrefanchor%
% the number of the figure
\edef\figformat{\thefigcount}%
% add section number
\ifsections%
\let\tmp\figformat%
\edef\figformat{\sectionprefix\thesectioncount.\tmp}%
\fi%
% define tag (for \label)
\xdef\tag{\figformat}%
% write
\hfil fig \figformat: {\small#1}%
\par\bigskip%
}

%% environment
\def\figure{
  \par\penalty-500
}
\def\endfigure{
  \par\penalty-1000
}

%% delimiters
\def\delimtitle#1{\par%
\leavevmode%
\raise.3em\hbox to\hsize{%
\lower0.3em\hbox{\vrule height0.3em}%
\hrulefill%
\ \lower.3em\hbox{#1}\ %
\hrulefill%
\lower0.3em\hbox{\vrule height0.3em}%
}\par\penalty10000}

%% callable by ref
\def\delimtitleref#1{\par%
% hyperref anchor
\hrefanchor%
% define tag (for \label)
\xdef\tag{#1}%
\leavevmode%
\raise.3em\hbox to\hsize{%
\lower0.3em\hbox{\vrule height0.3em}%
\hrulefill%
\ \lower.3em\hbox{\bf #1}\ %
\hrulefill%
\lower0.3em\hbox{\vrule height0.3em}%
}\par\penalty10000}

%% no title
\def\delim{\par%
\leavevmode\raise.3em\hbox to\hsize{%
\lower0.3em\hbox{\vrule height0.3em}%
\hrulefill%
\lower0.3em\hbox{\vrule height0.3em}%
}\par\penalty10000}

%% end delim
\def\enddelim{\par\penalty10000%
\leavevmode%
\raise.3em\hbox to\hsize{%
\vrule height0.3em\hrulefill\vrule height0.3em%
}\par}

\def\delim{\par\leavevmode\raise.3em\hbox to\hsize{\vrule height0.3em\hrulefill\vrule height0.3em}\par\penalty10000}
\def\enddelim{\par\penalty10000\leavevmode\raise.3em\hbox to\hsize{\vrule height0.3em\hrulefill\vrule height0.3em}\par}

%% theorem headers
\def\theo#1{
  \stepcounter{Theocount}
  % reset points
  \ifresetpointattheo\resetpointcounter\fi
  % hyperref anchor
  \hrefanchor
  % the number
  \def\formattheo{\theTheocount}
  % add section number
  \ifsections
    \let\tmp\formattheo
    \edef\formattheo{\sectionprefix\thesectioncount.\tmp}
  \fi
  % define tag (for \label)
  \xdef\tag{\formattheo}
  % write
  \delimtitle{\bf #1 \formattheo}
}
\let\endtheo\enddelim
%% theorem headers with name
\def\theoname#1#2{
  \theo{#1}\hfil({\it #2})\par\penalty10000\medskip%
}

%% start appendices
\def\appendix{%
\vfill
\pagebreak
% counter
\setcounter{sectioncount}0%
% prefix
\def\sectionprefix{A}%
% write
{\bf \LARGE Appendices}\par\penalty10000\bigskip\penalty10000%
% add a mention in the table of contents
\iftoc%
\immediate\write\tocoutput{\noexpand\tocappendices}\penalty10000%
\fi%
%% uncomment for new page for each appendix
%\def\seqskip{\vfill\pagebreak}
}

%% start references
\def\references{%
\hrefanchor%
% write
{\bf \LARGE References}\par\penalty10000\bigskip\penalty10000%
% add a mention in the table of contents
\iftoc%
% save lncount in aux variable which is written to toc
\immediate\write\tocoutput{\noexpand\expandafter\noexpand\edef\noexpand\csname toc@references\endcsname{\thelncount}}%
\write\tocoutput{\noexpand\tocreferences{\thepage}}\penalty10000%
\fi%
}


%% table of contents
\newif\iftocopen
\def\tableofcontents{
{\bf \large Table of contents:}\par\penalty10000\bigskip\penalty10000%
% copy content from file
\IfFileExists{\jobname.toc}{\input{\jobname.toc}}{{\tt error: table of contents missing}}
% open new toc
\newwrite\tocoutput
\immediate\openout\tocoutput=\jobname.toc
\toctrue
}
%% close file
\AtEndDocument{
  % close toc
  \iftoc
    \immediate\closeout\tocoutput
  \fi
}


%% fill line with dots
\def\leaderfill{\leaders\hbox to 1em {\hss. \hss}\hfill}

%% same as sectionprefix
\def\tocsectionprefix{}

%% toc formats
\def\tocsection #1#2{
  \stepcounter{tocsectioncount}
  \setcounter{tocsubsectioncount}{0}
  % write
  \smallskip\hyperlink{ln.\csname toc@sec.\thetocsectioncount\endcsname}{{\bf \tocsectionprefix\thetocsectioncount}.\hskip5pt {\color{blue}#1}\leaderfill#2}\par
}
\def\tocsubsection #1#2{
  \stepcounter{tocsubsectioncount}
  % write
  {\hskip10pt\hyperlink{ln.\csname toc@subsec.\thetocsectioncount.\thetocsubsectioncount\endcsname}{{\bf \thetocsubsectioncount}.\hskip5pt {\color{blue}\small #1}\leaderfill#2}}\par
}
\def\tocappendices{
  \medskip
  \setcounter{tocsectioncount}0
  {\bf Appendices}\par
  \smallskip
  \def\tocsectionprefix{A}
}
\def\tocreferences#1{
  \medskip
  {\hyperlink{ln.\csname toc@references\endcsname}{{\color{blue}\bf References}\leaderfill#1}}\par
  \smallskip
}
