% arara: indent: {overwrite: yes}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{rpisudiss}[2014/07/06 Ryan Pavlik's ISU Thesis]

\newcommand{\@isu@classname}{rpisudiss}
\RequirePackage{setspace}

% option doublespacing: Double-space where we would have 1.5 spaced.
\newcommand\isu@spacing{\onehalfspacing}
\newcommand\isu@space{onehalfspace}
\DeclareOption{doublespacing}{%
	\renewcommand\isu@spacing{\doublespacing}
	\renewcommand\isu@space{doublespace}
}

% option capstoc: Capitalize chapters in the table of contents
% Technically required if you go by the text of the grad college site,
% but rule inconsistently applied and results painful to read.
\newif\if@isu@capstoc	\@isu@capstocfalse
\DeclareOption{capstoc}{\@isu@capstoctrue}

% option capschap: Capitalize chapters everywhere else
% Technically required if you go by the text of the grad college site,
% but rule inconsistently applied and results painful to read.
\newif\if@isu@capschap	\@isu@capschapfalse
\DeclareOption{capschap}{\@isu@capschaptrue}

% option print: Optimize for print rather than on-screen (hide links, etc.)
% Apparently doesn't work right now. Sad.
\newif\if@isu@print	\@isu@printfalse
\DeclareOption{print}{\@isu@printtrue}

% option tocnumbersections: Number sections in the ToC.
\newif\if@isu@tocnumbersections@	\@isu@tocnumbersections@false
\DeclareOption{tocnumbersections}{\@isu@tocnumbersections@true}

% option tocnumbersubsections: Number subsections in the ToC. Implies tocnumbersections.
\newif\if@isu@tocnumbersubsections@	\@isu@tocnumbersubsections@false
\DeclareOption{tocnumbersubsections}{	\@isu@tocnumbersubsections@true\@isu@tocnumbersections@true}

% option ignoremissingmainmatter: Don't error if we've seen a titlepage but no \mainmatter by the end of the document.
\newif\if@isu@errormissingmainmatter@ \@isu@errormissingmainmatter@true
\DeclareOption{ignoremissingmainmatter}{\@isu@errormissingmainmatter@false}

% option draftcls: adds "DRAFT" and a date/time stamp on the footer.
\newif\if@isu@draftcls@	\@isu@draftcls@false
\DeclareOption{draftcls}{\@isu@draftcls@true}

% option draft: draftcls plus whatever anyone else thinks about draft.
\DeclareOption{draft}{
	\@isu@draftcls@true
	\PassOptionsToClass{draft}{report}
}

% Forward everything not recognized
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{report}}

% Process options
\ProcessOptions\relax

% Based on report
\LoadClass[12pt]{report}

% had to choose to put this here for tocloft
\RequirePackage{subfig}

% Put lot, lof, and bibliography (but not the contents itself) in the ToC
\RequirePackage[nottoc]{tocbibind}

% Basic hyperref - note that backreferences are incompatible with bibtopic (for per-chapter bibliographies)
\RequirePackage[pdftex,pdfusetitle,hypertexnames=false,linktocpage=true]{hyperref}
\hypersetup{bookmarksnumbered=true,bookmarksopen=true,pdfpagemode=UseOutlines,pdfview=FitB}

\if@isu@print
% Hide links for print
% Apparently doesn't work right now. Sad.
\hypersetup{hidelinks}
\else
% Nice blue links.
\hypersetup{colorlinks=true,linkcolor=blue,anchorcolor=blue,citecolor=blue,filecolor=blue,urlcolor=blue}
\fi

% Indent first paragraph after sectioning things.
\RequirePackage{indentfirst}

% Setup page layout
\RequirePackage{geometry}
\geometry{left=1in, top=1in, headheight=0.25in, headsep=0.5in, right=1in, bottom=1in, includehead=false}

% Handle draftcls option placing timestamp in footer and watermarking first page.
\if@isu@draftcls@
	\RequirePackage[firstpage]{draftwatermark}
	\RequirePackage{datetime}
	\newcommand{\isu@draftfooter}{DRAFT --- rendered \today\ at \currenttime}
\else
	\newcommand{\isu@draftfooter}{}
\fi

% Setup headers/footers - override the plain page style.
\RequirePackage{fancyhdr}
\fancypagestyle{plain}{%
	\fancyhf{} % clear all header and footer fields
	\fancyhead[C]{\thepage} % Always put the page in the center header
	\fancyfoot[C]{\isu@draftfooter} % In draft mode, put stuff in the center footer.
	\renewcommand{\headrulewidth}{0pt}
	\renewcommand{\footrulewidth}{0pt}}

\AtBeginDocument{\pagestyle{plain}}

% Set up a bool for mainmatter or not.
\newif\if@mainmatter \@mainmatterfalse

% Title page:
% - empty style (no numbering shown)
% - starts the preface/roman numerals
% - gets a PDF bookmark, just because we can.
\renewcommand{\titlepage}{
	\thispagestyle{empty}
	\pagenumbering{roman}
	\pdfbookmark[0]{\@title}{toc}
	% backup and set secnumdepth
	\newcounter{isu@secnumdepth}
	\setcounter{isu@secnumdepth}{\value{secnumdepth}}
	\setcounter{secnumdepth}{-1}
	\@mainmatterfalse
}
\renewcommand{\endtitlepage}{\newpage\pagestyle{plain}}

%%%
% Set up sectioning
\RequirePackage{titlesec}
% \titleformat{command}[shape]{format}{label}{sep}{before}[after]

% Chapter titles:
% - Caps (optional)
% - large
% - bold
% - center
\titleformat{\chapter}[block]
{\normalfont\large\bfseries\centering}
{\if@mainmatter%
	\if@isu@capschap\MakeUppercase{\chaptertitlename}%
	\else\chaptertitlename\fi
	\thechapter.\quad\fi}
{0pt}
{\if@isu@capschap\MakeUppercase\fi}{}

% Section:
% - bold
% - center
\titleformat{\section}[block]
{\normalfont\normalsize\bfseries\centering}
{\thesection.}{1em}{}{}

% Subsection:
% - bold
% - left-justified
\titleformat{\subsection}[block]
{\normalfont\normalsize\bfseries}
{\thesubsection.}{1em}{}{}

% Subsubsection:
% - bold
% - left-justified with indent
\titleformat{\subsubsection}[block]
{\normalfont\normalsize\bfseries}
{\quad\thesubsubsection.}{1em}{}{}

% Apply default spacing
\isu@spacing


% Needed for toc/lof/lot spacing and headfoot tweaking
\RequirePackage{xpatch}

%%%
% ToC:

% Rename the ToC
\RequirePackage[subfigure,titles]{tocloft}
\renewcommand{\contentsname}{Table of Contents}

% - Remove parskips from toc (and lof/lot)
\setlength{\cftparskip}{0pt}

% - Single space
% - Page break after
% - TODO: couldn't get pdfbookmark to point to this page instead of the
%   first page so it was removed.
\xpretocmd{\tableofcontents}{%
	\begin{singlespace}}{}{}
	\xapptocmd{\tableofcontents}{%
	\end{singlespace}%
	\pagestyle{plain}%
	\clearpage}{}{}

% - Add dot leader for chapter levels
\renewcommand\cftchapdotsep{\cftdotsep}

% - Prefix "Chapter " to chapter number
% - Adjust indentation of levels
% - Capitalize title entries, if requested
\if@isu@capstoc
\renewcommand\cftchappresnum{\MakeUppercase{\chaptertitlename} }
\cftsetindents{chapter}{0em}{8em}
\cftsetindents{section}{2em}{0em}
\cftsetindents{subsection}{3em}{0em}
\renewcommand{\cftchapfont}{\MakeUppercase}
\else
\renewcommand\cftchappresnum{\chaptertitlename\ }
\cftsetindents{chapter}{0em}{6em}
\cftsetindents{section}{1em}{0em}
\cftsetindents{subsection}{2em}{0em}
\fi

% - Remove section/subsection numbers from ToC by capturing
%   see idea at  http://tex.stackexchange.com/questions/71123/remove-section-number-toc-entries-with-tocloft
\if@isu@tocnumbersections@\else
\renewcommand{\cftsecpresnum}{\begin{lrbox}{\@tempboxa}}
\renewcommand{\cftsecaftersnum}{\end{lrbox}}
\fi

\if@isu@tocnumbersubsections@\else
\renewcommand{\cftsubsecpresnum}{\begin{lrbox}{\@tempboxa}}
\renewcommand{\cftsubsecaftersnum}{\end{lrbox}}
\fi

%%%
% List of Figures:
% - Single space
% - Page break after
\xpretocmd{\listoffigures}{%
	\begin{singlespace}}{}{}
	\xapptocmd{\listoffigures}{%
	\end{singlespace}\clearpage}{}{}

% - Prepend the word "Figure" to the number
\renewcommand\cftfigpresnum{Figure }
\cftsetindents{figure}{0em}{6em}

%%%
% List of Tables:
% - Single space
% - Page break after
\xpretocmd{\listoftables}{%
	\begin{singlespace}}{}{}
	\xapptocmd{\listoftables}{%
	\end{singlespace}\clearpage}{}{}

% - Prepend the word "Table" to the number
\renewcommand\cfttabpresnum{Table }
\cftsetindents{table}{0em}{6em}

%%%
% Document division commands

% Command to indicate when we're done
% with preface content - must be called!
% (If we're actually typesetting a full thesis...)
\newcommand{\mainmatter}{%
	\clearpage
	\pagenumbering{arabic}
	\pagestyle{plain}
	\@mainmattertrue
	\newcommand{\@isu@gotmainmatter@}{}
	\setcounter{chapter}{0}
	% restore secnumdepth
	\setcounter{secnumdepth}{\value{isu@secnumdepth}}
}

% Command to indicate we're done with main content
\newcommand{\backmatter}{
	\setcounter{isu@secnumdepth}{\value{secnumdepth}}
	\setcounter{secnumdepth}{-1}
	\@mainmatterfalse
}

\RequirePackage{etoolbox}
% Verify that we actually got some main matter
\AfterEndDocument{
	\if@isu@errormissingmainmatter@
	\ifdefined\@isu@gottitle
	\ClassInfo{\@isu@classname}{Full dissertation mode}
	\unless\ifdefined\@isu@gotmainmatter@
	\ClassError{\@isu@classname}{Missing \protect\mainmatter\space before your first real chapter!}{Missing mainmatter}
	%             \ClassError{\@isu@classname}{%
	%                 \protect\mainmatter\space not called in your document expected before your first real chapter}{%
	%                 You need to put \protect\mainmatter\space before your first real numbered chapter, typically your introduction.}
	\fi
	\fi
	\fi
}

%%%
% Title Page

% Temporary: hardcode these values in.
\newcommand\isu@degree{Doctor of Philosophy}
\newcommand\isu@gradyear{2014}
\newcommand\isu@submissiontype{dissertation}
\newcommand\isu@majorline{Co-majors: Human-Computer Interaction; Computer Science}
\newcommand\isu@committee{%
	Judy M. Vance, Co-major Professor\\%
	Leslie Miller, Co-major Professor\\%
	Debra Satterfield \\ Jonathan Kelly \\ David Weiss \\ Horea Ilies}
\newcommand\isu@copyrightnotice{\\       % Unclear what the spacing between notice and the text above should be.
	Copyright \copyright\ \@author, \isu@gradyear.
All rights reserved.}

% Spacing tools
% - used for what the thesis office calls "two blank lines"
\newcommand{\@isu@twoblanklines}{20pt}
\newcommand{\@isu@maketwoblanklines}{\vspace{\@isu@twoblanklines}}

% The actual title page layout.
% Note that portions that appear double-spaced in the sample/annotated PDF
% are given the same spacing as the body of the document (1.5 or 2)
\renewcommand{\maketitle}{
	\newcommand{\@isu@gottitle}{} % Assume that \maketitle implies typesetting a full thesis, not just a chapter.
	\ClassInfo{\@isu@classname}{Generating title page -- assuming we are typesetting a full dissertation.}

	\begin{titlepage}
		\setlength{\parindent}{0pt} % Don't you dare try to indent!
		\vbox to \textheight{ % Full-page box to contain everything and stretch everything.
			\begin{center}                      % Center this whole page
				\vspace*{12pt}                      % Designated blank line at the top of the page.

				\begin{singlespace}                 % Single-space this section, we manually add spacing.
					\textbf{\@title}\\                  % Title in bold
					\@isu@maketwoblanklines             % "two blank lines"
					by\\                                % the word 'by', not in bold
					\@isu@maketwoblanklines             % "two blank lines"
					\textbf{\@author}                   % Author in bold
				\end{singlespace}

				\vfill{}                            % let LaTeX decide what "4-6 blank lines" should be.

				\begin{\isu@space}                  % Normal document spacing here.
					A \isu@submissiontype\ submitted to the graduate faculty\\
					in partial fulfillment of the requirements of the degree of\\
					\MakeUppercase{\isu@degree}         % Doctor of Philosophy, etc. We enforce caps so they don't have to.
				\end{\isu@space}

				\@isu@maketwoblanklines             % "two blank lines"

				\begin{singlespace}                 % Committee is single-spaced, looks like really long majors would be too.
					\isu@majorline\\                    % "Major: MAJ (CONC)" or "Co-majors: MAJ; MAJ;
					\medskip                            % Unspecified space here, looks like just "one blank line" on sample
					Program of Study Committee:\\
					\isu@committee                      % Committee, user-delimited with \\ and user-annoted with ", Major Professor" or "Co-major Professor"
				\end{singlespace}

				\vfill{}                            % let LaTeX decide what "7-8 blank lines" should be.
				\@isu@maketwoblanklines             % Suggest it's a little longer than the other vfill.

				\begin{\isu@space}                  % Normal document spacing here
					Iowa State University\\
					Ames, Iowa\\
					\isu@gradyear                       % Newline after here, if needed, is in the copyright notice macro.
					\isu@copyrightnotice                % Copyright line optional if copyright not formally filed.
				\end{\isu@space}

			\end{center}
		}
	\end{titlepage}
}

\endinput

