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