From 5ab7dd575d738aed5a46d9bca0c450802ec4318c Mon Sep 17 00:00:00 2001
From: Ian Jauslin <ian@jauslin.org>
Date: Sun, 30 Jan 2022 17:28:30 -0500
Subject: Initial commit

---
 libs/ian.cls | 673 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 673 insertions(+)
 create mode 100644 libs/ian.cls

(limited to 'libs/ian.cls')

diff --git a/libs/ian.cls b/libs/ian.cls
new file mode 100644
index 0000000..70409b9
--- /dev/null
+++ b/libs/ian.cls
@@ -0,0 +1,673 @@
+%%
+%% 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
+
+%% options
+% no section numbering in equations
+\DeclareOption{section_in_eq}{\sectionsineqtrue}
+\DeclareOption{section_in_fig}{\sectionsinfigtrue}
+\DeclareOption{section_in_theo}{\PassOptionsToPackage{\CurrentOption}{iantheo}}
+\DeclareOption{section_in_all}{\sectionsineqtrue\sectionsinfigtrue\PassOptionsToPackage{section_in_theo}{iantheo}}
+\DeclareOption{subsection_in_eq}{\subsectionsineqtrue}
+\DeclareOption{subsection_in_fig}{\subsectionsinfigtrue}
+\DeclareOption{subsection_in_theo}{\PassOptionsToPackage{\CurrentOption}{iantheo}}
+\DeclareOption{subsection_in_all}{\subsectionsineqtrue\subsectionsinfigtrue\PassOptionsToPackage{subsection_in_theo}{iantheo}}
+\DeclareOption{no_section_in_eq}{\sectionsineqfalse}
+\DeclareOption{no_section_in_fig}{\sectionsinfigfalse}
+\DeclareOption{no_section_in_theo}{\PassOptionsToPackage{\CurrentOption}{iantheo}}
+\DeclareOption{no_section_in_all}{\sectionsineqfalse\sectionsinfigfalse\PassOptionsToPackage{no_section_in_theo}{iantheo}}
+\DeclareOption{no_subsection_in_eq}{\subsectionsineqfalse}
+\DeclareOption{no_subsection_in_fig}{\subsectionsinfigfalse}
+\DeclareOption{no_subsection_in_theo}{\PassOptionsToPackage{\CurrentOption}{iantheo}}
+\DeclareOption{no_subsection_in_all}{\subsectionsineqfalse\subsectionsinfigfalse\PassOptionsToPackage{no_subsection_in_theo}{iantheo}}
+% reset point
+\DeclareOption{point_reset_at_section}{\PassOptionsToPackage{reset_at_section}{point}}
+\DeclareOption{point_no_reset_at_section}{\PassOptionsToPackage{no_reset_at_section}{point}}
+\DeclareOption{point_reset_at_theo}{\PassOptionsToPackage{reset_at_theo}{point}}
+\DeclareOption{point_no_reset_at_theo}{\PassOptionsToPackage{no_reset_at_theo}{point}}
+
+\def\ian@defaultoptions{
+  \ExecuteOptions{section_in_all, no_subsection_in_all}
+  \ProcessOptions
+
+  %% required packages
+  \RequirePackage{iantheo}
+  \RequirePackage{point}
+  \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%
+  }
+}
+
+
+%% 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}
+% booleans (write section or subsection in equation number)
+\newif\ifsectionsineq
+\newif\ifsubsectionsineq
+\def\seqcount{
+  \stepcounter{seqcount}
+  % the output
+  \edef\seqformat{\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
+    \hfil fig \figformat: \parbox[t]{\figwidth}{\leavevmode\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
+  \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}
+}
+
+
+%% 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{
+  % 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 \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 \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
+}
+
+
+%% definitions that must be loaded at begin document
+\let\ian@olddocument\document
+\def\document{
+  \ian@olddocument
+
+  \deflabel
+  \defcaption
+}
+
+%% end
+\ian@defaultoptions
+\endinput
-- 
cgit v1.2.3-70-g09d2

