%%
%% Ian's class file
%%

%% TeX format
\NeedsTeXFormat{LaTeX2e}[1995/12/01]

%% class name
\ProvidesClass{ian}[2017/09/29]

%% boolean to signal that this class is being used
\newif\ifianclass
\ianclasstrue

%% options
% no section numbering in equations
\DeclareOption{section_in_eq}{\sectionsineqtrue}
\DeclareOption{section_in_fig}{\sectionsinfigtrue}
\DeclareOption{section_in_all}{\sectionsineqtrue\sectionsinfigtrue}
\DeclareOption{subsection_in_eq}{\subsectionsineqtrue}
\DeclareOption{subsection_in_fig}{\subsectionsinfigtrue}
\DeclareOption{subsection_in_all}{\subsectionsineqtrue\subsectionsinfigtrue}
\DeclareOption{no_section_in_eq}{\sectionsineqfalse}
\DeclareOption{no_section_in_fig}{\sectionsinfigfalse}
\DeclareOption{no_section_in_all}{\sectionsineqfalse\sectionsinfigfalse}
\DeclareOption{no_subsection_in_eq}{\subsectionsineqfalse}
\DeclareOption{no_subsection_in_fig}{\subsectionsinfigfalse}
\DeclareOption{no_subsection_in_all}{\subsectionsineqfalse\subsectionsinfigfalse}

\def\ian@defaultoptions{
  \ExecuteOptions{section_in_all, no_subsection_in_all}
  \ProcessOptions

  %% required packages
  \RequirePackage{color}
  \RequirePackage{marginnote}
  \RequirePackage{amssymb}
  \PassOptionsToPackage{hidelinks}{hyperref}
  \RequirePackage{hyperref}

  \pagestyle{plain}
}

%% paper dimensions
\setlength\paperheight{297mm}
\setlength\paperwidth{210mm}

%% fonts
\input{size11.clo}
\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm}
\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf}
\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt}
\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf}
\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}

%% text dimensions
\hoffset=-50pt
\voffset=-72pt
\textwidth=460pt
\textheight=704pt


%% remove default indentation
\parindent=0pt
%% indent command
\def\indent{\hskip20pt}

%% something is wrong with \thepage, redefine it
\gdef\thepage{\the\c@page}

%% array lines (to use the array environment)
\setlength\arraycolsep{5\p@}
\setlength\arrayrulewidth{.4\p@}


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


%% 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}}%
}

%% can call commands even when they are not defined
\def\safe#1{%
  \ifdefined#1%
    #1%
  \else%
    {\color{red}\bf?}%
  \fi%
}

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

  \def\ref##1{%
    % check whether the label is defined (hyperlink runs into errors if this check is omitted)
    \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%
  }

  % omit link
  \def\textref##1{%
    \ifcsname label@##1@hl\endcsname%
      \safe\csname label@##1\endcsname%
    \else%
      \ifcsname label@##1\endcsname%
        \csname ##1\endcsname%
        \else%
        {\bf ??}%
      \fi%
    \fi%
  }
}


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


%% section command
% counter
\newcounter{sectioncount}
% space before section
\newlength\secskip
\setlength\secskip{40pt}
% a prefix to put before the section number, e.g. A for appendices
\def\sectionprefix{}
% define some lengths
\newlength\secnumwidth
\newlength\sectitlewidth
\def\section#1{
  % reset counters
  \stepcounter{sectioncount}
  \setcounter{subsectioncount}{0}
  \ifsectionsineq
    \setcounter{seqcount}0
  \fi
  \ifsectionsinfig
    \setcounter{figcount}0
  \fi

  % space before section (if not first)
  \ifnum\thesectioncount>1
    \vskip\secskip
    \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

  %space
  \par\penalty10000
  \bigskip\penalty10000
}

%% subsection
% counter
\newcounter{subsectioncount}
% space before subsection
\newlength\subsecskip
\setlength\subsecskip{30pt}
\def\subsection#1{
  % counters
  \stepcounter{subsectioncount}
  \setcounter{subsubsectioncount}{0}
  \ifsubsectionsineq
    \setcounter{seqcount}0
  \fi
  \ifsubsectionsinfig
    \setcounter{figcount}0
  \fi

  % space before subsection (if not first)
  \ifnum\thesubsectioncount>1
    \vskip\subsecskip
    \penalty-500
  \fi

  % 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

  % space
  \par\penalty10000
  \medskip\penalty10000
}

%% subsubsection
% counter
\newcounter{subsubsectioncount}
% space before subsubsection
\newlength\subsubsecskip
\setlength\subsubsecskip{20pt}
\def\subsubsection#1{
  % counters
  \stepcounter{subsubsectioncount}

  % space before subsubsection (if not first)
  \ifnum\thesubsubsectioncount>1
    \vskip\subsubsecskip
    \penalty-500
  \fi

  % hyperref anchor
  \hrefanchor
  % define tag (for \label)
  \xdef\tag{\sectionprefix\thesectioncount.\thesubsectioncount.\thesubsubsectioncount}

  % get widths
  \def\@secnum{{\bf\hskip1.cm\sectionprefix\thesectioncount.\thesubsectioncount.\thesubsubsectioncount.\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@subsubsec.\thesectioncount.\thesubsectioncount.\thesubsubsectioncount\endcsname{\thelncount}}
    \write\tocoutput{\noexpand\tocsubsubsection{#1}{\thepage}}
  \fi

  % space
  \par\penalty10000
  \medskip\penalty10000
}

%% itemize
\newlength\itemizeskip
% left margin for items
\setlength\itemizeskip{20pt}
\newlength\itemizeseparator
% space between the item symbol and the text
\setlength\itemizeseparator{5pt}
% penalty preceding an itemize
\newcount\itemizepenalty
\itemizepenalty=0
% counter counting the itemize level
\newcounter{itemizecount}

% item symbol
\def\itemizept#1{
  \ifnum#1=1
    \textbullet
  \else
    $\scriptstyle\blacktriangleright$
  \fi
}


\newlength\current@itemizeskip
\setlength\current@itemizeskip{0pt}
\def\itemize{%
  \par\expandafter\penalty\the\itemizepenalty\medskip\expandafter\penalty\the\itemizepenalty%
  \addtocounter{itemizecount}{1}%
  \addtolength\current@itemizeskip{\itemizeskip}%
  \leftskip\current@itemizeskip%
}
\def\enditemize{%
  \addtocounter{itemizecount}{-1}%
  \addtolength\current@itemizeskip{-\itemizeskip}%
  \par\expandafter\penalty\the\itemizepenalty\leftskip\current@itemizeskip%
  \medskip\expandafter\penalty\the\itemizepenalty%
}

% item, with optional argument to specify the item point
% @itemarg is set to true when there is an optional argument
\newif\if@itemarg
\def\item{%
  % check whether there is an optional argument (if there is none, add on empty '[]')
  \@ifnextchar [{\@itemargtrue\@itemx}{\@itemargfalse\@itemx[]}%
}
\newlength\itempt@total
\def\@itemx[#1]{
  \if@itemarg
    \settowidth\itempt@total{#1}
  \else
    \settowidth\itempt@total{\itemizept\theitemizecount}
  \fi
  \addtolength\itempt@total{\itemizeseparator}
  \par
  \medskip
  \if@itemarg
    \hskip-\itempt@total#1\hskip\itemizeseparator
  \else
    \hskip-\itempt@total\itemizept\theitemizecount\hskip\itemizeseparator
  \fi
}

%% prevent page breaks after itemize
\newcount\previtemizepenalty
\def\nopagebreakafteritemize{
  \previtemizepenalty=\itemizepenalty
  \itemizepenalty=10000
}
%% back to previous value
\def\restorepagebreakafteritemize{
  \itemizepenalty=\previtemizepenalty
}

%% 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
}


%% equation numbering
% counter
\newcounter{seqcount}
% define possible prefix to equation
\def\eqprefix{}
% booleans (write section or subsection in equation number)
\newif\ifsectionsineq
\newif\ifsubsectionsineq
\def\seqcount{
  \stepcounter{seqcount}
  % the output
  \edef\seqformat{\eqprefix\theseqcount}
  % add subsection number
  \ifsubsectionsineq
    \let\tmp\seqformat
    \edef\seqformat{\thesubsectioncount.\tmp}
  \fi
  % add section number
  \ifsectionsineq
    \let\tmp\seqformat
    \edef\seqformat{\sectionprefix\thesectioncount.\tmp}
  \fi
  % define tag (for \label)
  \xdef\tag{\seqformat}
  % write number
  \marginnote{\hfill(\seqformat)}
}
%% equation environment compatibility
\def\equation{\hrefanchor$$\seqcount}
\def\endequation{$$\@ignoretrue}


%% figures
% counter
\newcounter{figcount}
% booleans (write section or subsection in equation number)
\newif\ifsectionsinfig
\newif\ifsubsectionsinfig
% width of figures
\newlength\figwidth
\setlength\figwidth\textwidth
\addtolength\figwidth{-2.5cm}
% caption
\def\defcaption{
  \long\def\caption##1{%
    \stepcounter{figcount}%
%
    % hyperref anchor%
    \hrefanchor%
%
    % the number of the figure%
    \edef\figformat{\thefigcount}%
    % add subsection number%
    \ifsubsectionsinfig%
      \let\tmp\figformat%
      \edef\figformat{\thesubsectioncount.\tmp}%
    \fi%
    % add section number%
    \ifsectionsinfig%
      \let\tmp\figformat%
      \edef\figformat{\sectionprefix\thesectioncount.\tmp}%
    \fi%
%
    % define tag (for \label)%
    \xdef\tag{\figformat}%
%
    % write%
    \par\penalty10000\hfil fig \figformat: \parbox[t]{\figwidth}{\small##1}%%
%
    % space%
    \par\bigskip%
  }
}
%% short caption: centered
\def\captionshort#1{
  \stepcounter{figcount}%
%
  % hyperref anchor%
  \hrefanchor%
%
  % the number of the figure%
  \edef\figformat{\thefigcount}%
  % add section number%
  \ifsectionsinfig%
  \let\tmp\figformat%
  \edef\figformat{\sectionprefix\thesectioncount.\tmp}%
  \fi%
%
  % define tag (for \label)%
  \xdef\tag{\figformat}%
%
  % write%
  \par\penalty10000\hfil fig \figformat: {\small#1}%
%
  %space%
  \par\bigskip%
}

%% environment
\def\figure{
  \par
  \vfil\penalty100\vfilneg
  \bigskip
}
\def\endfigure{
  \par
  \bigskip
}


%% 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 exercises
\def\exercises{
  \vfill
  \pagebreak

  % counter
  \setcounter{sectioncount}0
  \setcounter{seqcount}0

  % prefix
  \def\sectionprefix{E}

  \hrefanchor

  % write
  {\bf \LARGE Exercises}\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@exercises\endcsname{\thelncount}}
    \write\tocoutput{\noexpand\tocexercises{\thepage}}\penalty10000
  \fi

  \def\eqprefix{E}
  \sectionsineqfalse
}


%% bibliography
% size of header
\newlength\bibheader
\def\thebibliography#1{
  \hrefanchor

  % 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

  % write
  {\bf \LARGE References}\par\penalty10000\bigskip\penalty10000
  % width of header
  \settowidth\bibheader{[#1]}
  \leftskip\bibheader
}
% end environment
\def\endthebibliography{
  \par\leftskip0pt
} 

%% bibitem command
\def\bibitem[#1]#2{%
  \hrefanchor%
  \outdef{label@cite#2}{#1}%
  \hskip-\bibheader%
  \makebox[\bibheader]{\cite{#2}\hfill}%
}

%% cite command
% @tempswa is set to true when there is an optional argument
\newif\@tempswa
\def\cite{%
  % check whether there is an optional argument (if there is none, add on empty '[]')
  \@ifnextchar [{\@tempswatrue\@citex}{\@tempswafalse\@citex[]}%
}
% command with optional argument
\def\@citex[#1]#2{\leavevmode%
  % initialize loop
  \let\@cite@separator\@empty%
  % format
  \@cite{%
    % loop over ',' separated list
    \@for\@cite@:=#2\do{%
      % text to add at each iteration of the loop (separator between citations)
      \@cite@separator\def\@cite@separator{,\ }%
      % add entry to citelist
      \@writecitation{\@cite@}%
      \ref{cite\@cite@}%
    }%
  }%
  % add optional argument text (as an argument to '\@cite')
  {#1}%
}
\def\@cite#1#2{%
  [#1\if@tempswa , #2\fi]%
}
%% add entry to citelist after checking it has not already been added
\def\@writecitation#1{%
  \ifcsname if#1cited\endcsname%
  \else%
    \expandafter\newif\csname if#1cited\endcsname%
    \immediate\write\@auxout{\string\citation{#1}}%
  \fi%
}

%% table of contents
% boolean
\newif\iftoc
\def\tableofcontents{
  {\bf \large Table of contents:}\par\penalty10000\smallskip\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
\newcounter{tocsectioncount}
\def\tocsection #1#2{
  \stepcounter{tocsectioncount}
  \setcounter{tocsubsectioncount}{0}
  \setcounter{tocsubsubsectioncount}{0}
  % write
  \smallskip\hyperlink{ln.\csname toc@sec.\thetocsectioncount\endcsname}{{\bf \tocsectionprefix\thetocsectioncount}.\hskip5pt {\color{blue}#1}\leaderfill#2}\par
}
\newcounter{tocsubsectioncount}
\def\tocsubsection #1#2{
  \stepcounter{tocsubsectioncount}
  \setcounter{tocsubsubsectioncount}{0}
  % write
  {\hskip10pt\hyperlink{ln.\csname toc@subsec.\thetocsectioncount.\thetocsubsectioncount\endcsname}{{\bf \tocsectionprefix\thetocsectioncount.\thetocsubsectioncount}.\hskip5pt {\color{blue}\small #1}\leaderfill#2}}\par
}
\newcounter{tocsubsubsectioncount}
\def\tocsubsubsection #1#2{
  \stepcounter{tocsubsubsectioncount}
  % write
  {\hskip20pt\hyperlink{ln.\csname toc@subsubsec.\thetocsectioncount.\thetocsubsectioncount.\thetocsubsubsectioncount\endcsname}{{\bf \tocsectionprefix\thetocsectioncount.\thetocsubsectioncount.\thetocsubsubsectioncount}.\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
}
\def\tocexercises#1{
  \medskip
  \setcounter{tocsectioncount}0
  {\hyperlink{ln.\csname toc@exercises\endcsname}{{\color{blue}\bf Exercises}\leaderfill#1}}\par
  \smallskip
  \def\tocsectionprefix{E}
}


%% definitions that must be loaded at begin document
\let\ian@olddocument\document
\def\document{
  \ian@olddocument

  \deflabel
  \defcaption
}

%% end
\ian@defaultoptions
\endinput
