handouts/resources/ormc_handout.cls

589 lines
14 KiB
TeX
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

% Mark's math circle handout style.
% Source is at https://git.betalupi.com/Mark/ormc-handouts
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{ormc_handout}[2023/05/25 2.0.0 ORMC Handout]
% ------------------ %
% Option Definitions %
% ------------------ %
% Standard LaTeX
\newcommand\@ptsize{}
\@twocolumnfalse
\@twosidefalse
\@mparswitchfalse
% ORMC-specific
\newif{\if@solutions} % If false, solutions and instructor notes are hidden.
\newif{\if@singlenumbering} % If true, the same counter is used for all objects.
\newif{\if@nopagenumber} % If true, don't number pages.
\newif{\if@shortwarning} % If true, show a smaller solutions warning
\newif{\if@nowarning} % If true, do not show solution warning
% Standard LaTeX options
\DeclareOption{10pt}{\renewcommand\@ptsize{0}}
\DeclareOption{11pt}{\renewcommand\@ptsize{1}}
\DeclareOption{12pt}{\renewcommand\@ptsize{2}}
\DeclareOption{a4paper}{%
\setlength\paperheight{297mm}%
\setlength\paperwidth{210mm}%
}
\DeclareOption{letterpaper}{%
\setlength\paperheight{11in}%
\setlength\paperwidth{8.5in}%
}
% ORMC-specific options
\DeclareOption{solutions}{\@solutionstrue}
\DeclareOption{nosolutions}{\@solutionsfalse}
\DeclareOption{multinumbering}{\@singlenumberingfalse}
\DeclareOption{singlenumbering}{\@singlenumberingtrue}
\DeclareOption{pagenumber}{\@nopagenumberfalse}
\DeclareOption{nopagenumber}{\@nopagenumbertrue}
\DeclareOption{longwarning}{\@shortwarningfalse}
\DeclareOption{shortwarning}{\@shortwarningtrue}
\DeclareOption{showwarning}{\@nowarningfalse}
\DeclareOption{hidewarning}{\@nowarningtrue}
\DeclareOption*{\ClassWarning{ormc_handout}{\CurrentOption ignored}}
\ExecuteOptions{
letterpaper,10pt,
solutions,
multinumbering,
pagenumber,
longwarning,
yeswarning
}
\ProcessOptions
\input{size1\@ptsize.clo}
% Hack to allow script option override.
% To force a build with solutions, compile a file containing the following:
% `\def\argYesSolutions{1}\input{<target file>}`
\ifdefined\argYesSolutions\@solutionstrue\fi
\ifdefined\argNoSolutions\@solutionsfalse\fi
% ------------------------------- %
% Minimal LaTeX class %
% Based on a stripped article.cls %
% Version 2022/07/02 v1.4n %
% ------------------------------- %
% Lengths
\setlength\lineskip{1\p@}
\setlength\normallineskip{1\p@}
\renewcommand\baselinestretch{}
\setlength\parskip{0\p@ \@plus \p@}
\@lowpenalty 51
\@medpenalty 151
\@highpenalty 301
\setlength\leftmargini{2.5em}
\leftmargin\leftmargini
\setlength\leftmarginii{2.2em}
\setlength\leftmarginiii{1.87em}
\setlength\leftmarginiv{1.7em}
\setlength\leftmarginv{1em}
\setlength\leftmarginvi{1em}
\setlength\labelsep{.5em}
\setlength\labelwidth{\leftmargini}
\addtolength\labelwidth{-\labelsep}
\@beginparpenalty -\@lowpenalty
\@endparpenalty -\@lowpenalty
\@itempenalty -\@lowpenalty
\setlength\arraycolsep{5\p@}
\setlength\tabcolsep{6\p@}
\setlength\arrayrulewidth{.4\p@}
\setlength\doublerulesep{2\p@}
\setlength\tabbingsep{\labelsep}
\skip\@mpfootins = \skip\footins
\setlength\fboxsep{3\p@}
\setlength\fboxrule{.4\p@}
\newcommand\@pnumwidth{1.55em}
\newcommand\@tocrmarg{2.55em}
\newcommand\@dotsep{4.5}
\setlength\columnsep{10\p@}
\setlength\columnseprule{0\p@}
% Counters
\setcounter{topnumber}{2}
\renewcommand\topfraction{.7}
\setcounter{bottomnumber}{1}
\renewcommand\bottomfraction{.3}
\setcounter{totalnumber}{3}
\renewcommand\textfraction{.2}
\renewcommand\floatpagefraction{.5}
\setcounter{dbltopnumber}{2}
\renewcommand\dbltopfraction{.7}
\renewcommand\dblfloatpagefraction{.5}
%\setcounter{secnumdepth}{3}
% Enum labels
\renewcommand\theenumi{\@arabic\c@enumi}
\renewcommand\theenumii{\@alph\c@enumii}
\renewcommand\theenumiii{\@roman\c@enumiii}
\renewcommand\theenumiv{\@Alph\c@enumiv}
\newcommand\labelenumi{\theenumi.}
\newcommand\labelenumii{(\theenumii)}
\newcommand\labelenumiii{\theenumiii.}
\newcommand\labelenumiv{\theenumiv.}
\renewcommand\p@enumii{\theenumi}
\renewcommand\p@enumiii{\theenumi(\theenumii)}
\renewcommand\p@enumiv{\p@enumiii\theenumiii}
\newcommand\labelitemi{\labelitemfont \textbullet}
\newcommand\labelitemii{\labelitemfont \bfseries \textendash}
\newcommand\labelitemiii{\labelitemfont \textasteriskcentered}
\newcommand\labelitemiv{\labelitemfont \textperiodcentered}
\newcommand\labelitemfont{\normalfont}
% Required by enumitem, not sure why.
\newenvironment{description}{%
\list{}{\labelwidth\z@ \itemindent-\leftmargin\let\makelabel\descriptionlabel}%
}{\endlist}
\newcommand*\descriptionlabel[1]{\hspace\labelsep\normalfont\bfseries #1}
% Font switching
\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}
\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl}
\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc}
\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal}
\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal}
% Figures and tables
\newcommand\figurename{Figure}
\newcommand\tablename{Table}
\newcounter{figure}
\renewcommand \thefigure {\@arabic\c@figure}
\def\fps@figure{tbp}
\def\ftype@figure{1}
\def\ext@figure{lof}
\def\fnum@figure{\figurename\nobreakspace\thefigure}
\newenvironment{figure}{\@float{figure}}{\end@float}
\newenvironment{figure*}{\@dblfloat{figure}}{\end@dblfloat}
\newcounter{table}
\renewcommand\thetable{\@arabic\c@table}
\def\fps@table{tbp}
\def\ftype@table{2}
\def\ext@table{lot}
\def\fnum@table{\tablename\nobreakspace\thetable}
\newenvironment{table}{\@float{table}}{\end@float}
\newenvironment{table*}{\@dblfloat{table}}{\end@dblfloat}
\newlength\abovecaptionskip
\newlength\belowcaptionskip
\setlength\abovecaptionskip{10\p@}
\setlength\belowcaptionskip{0\p@}
\long\def\@makecaption#1#2{%
\vskip\abovecaptionskip
\sbox\@tempboxa{#1: #2}%
\ifdim \wd\@tempboxa >\hsize
#1: #2\par
\else
\global \@minipagefalse
\hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
\fi
\vskip\belowcaptionskip%
}
\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}}
\let\l@table\l@figure
% Miscellaneous
\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em}
\let\@openbib@code\@empty
\newcommand\@idxitem{\par\hangindent 40\p@}
\newcommand\subitem{\@idxitem \hspace*{20\p@}}
\newcommand\subsubitem{\@idxitem \hspace*{30\p@}}
\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax}
\renewcommand\footnoterule{%
\kern-3\p@
\hrule\@width.4\columnwidth
\kern2.6\p@%
}
\newcommand\@makefntext[1]{%
\parindent 1em%
\noindent
\hb@xt@1.8em{\hss\@makefnmark}#1%
}
\def\today{%
\ifcase\month\or
January\or
February\or
March\or
April\or
May\or
June\or
July\or
August\or
September\or
October\or
November\or
December
\fi%
\space\number\day, \number\year
}
\pagenumbering{arabic}
\raggedbottom
\onecolumn
% ------------ %
% Minor Tweaks %
% ------------ %
% We probably don't need enumitem for this.
% TODO: apply these edits above, in plain LaTeX.
\newcommand\sbullet[1][.5]{\mathbin{\vcenter{\hbox{\scalebox{#1}{$\bullet$}}}}}
\renewcommand{\labelitemi}{$\sbullet$}
\renewcommand{\labelitemii}{$\cdot$}
\renewcommand{\labelenumi}{\textbf{\Alph{enumi}:}}
% ------------- %
% Package Setup %
% ------------- %
% Set up page geometry.
% MUST BE DONE FIRST!
\RequirePackage{geometry}
\geometry{
paper = letterpaper,
top = 25mm,
bottom = 30mm,
left = 30mm,
right = 30mm,
headheight = 75mm,
footskip = 15mm,
headsep = 75mm,
}
\RequirePackage{enumitem} % List customization
\RequirePackage{etoolbox} % For utilities like \undef
\RequirePackage{xcolor} % For colored text
\RequirePackage{tikz} % Used by \boxlinehack
\RequirePackage{comment} % Used to hide solutions
\RequirePackage{tcolorbox} % For solution boxes
\tcbuselibrary{breakable} % Allows tcolorboxes to break across pages
\RequirePackage[ % Provides \say{} for quoted text.
left = ``,
right = '',
leftsub = `,
rightsub = '
]{dirtytalk}
% Not used by this class, but likely to be used in documents
\RequirePackage{amsmath}
\RequirePackage{amssymb}
\RequirePackage{tabto}
\TabPositions{1cm, 2cm, 3cm, 4cm, 5cm, 6cm, 7cm, 8cm}
% ----------- %
% Style Setup %
% ----------- %
\if@nopagenumber
\pagestyle{empty}
\else
\pagestyle{plain}
\fi
\renewcommand*{\thefootnote}{\arabic{footnote}}
\setlength{\parindent}{0mm}
\setlist{noitemsep, topsep=0mm}
\raggedright
\frenchspacing
% ------------- %
% Handout Title %
% ------------- %
% These are in LaTeX by default, but we don't use them here.
% Undef them to avoid confusion.
\undef\thanks
\undef\author
\undef\date
\undef\and
% Additional title parameters
\def\@subtitle{\relax}
\def\@uptitlel{\relax}
\def\@uptitler{\relax}
\newcommand{\subtitle}[1]{\gdef\@subtitle{#1}}
\newcommand{\uptitlel}[1]{\gdef\@uptitlel{#1}}
\newcommand{\uptitler}[1]{\gdef\@uptitler{#1}}
\newcommand{\@shortwarning}{
\begin{tcolorbox}[colback=white, colframe=red]
\large\centering\color{red}
\textbf{Instructor's Handout} \par
\end{tcolorbox}
}
\newcommand{\@longwarning}{
\begin{tcolorbox}[colback=white, colframe=red]
\color{red}
\begingroup
\large\centering
\textbf{Instructor's Handout} \par
\endgroup
\vspace{1ex}
This file contains solutions and notes. \par
Compile with the ``nosolutions'' flag before distributing. \par
\end{tcolorbox}
}
\newcommand{\maketitle}{
\begingroup
\centering
\begin{minipage}{0.7\textwidth}
\centering
% Left and right headers (uptitle)
\def\uptitle{%
\if\@uptitlel\relax\else\textsc{\@uptitlel}\fi \hfill~%
\if\@uptitler\relax\else\textsc{\@uptitler}\fi \par
}
\if\@uptitlel\relax % If neither header is defined,
\if\@uptitlel\relax % don't insert an upper title.
\def\@uptitle{\relax}
\fi\fi\uptitle{}
% Main title
\rule{\linewidth}{0.2mm} \par
\huge \@title \par \normalsize
\vspace{1ex} \@subtitle \par
\rule{\linewidth}{0.2mm} \par
% Solution warning
\if@nowarning\else\if@solutions%
\if@shortwarning \@shortwarning%
\else \@longwarning%
\fi\fi\fi
\end{minipage} \par
\vspace{2ex}
\endgroup
}
% ---------------- %
% Handout Sections %
% ---------------- %
% Helper command that creates a label with custom text.
% Аrgs: label name, custom text
\newcommand{\@customlabel}[2]{%
\protected@write\@auxout{}{\string\newlabel{#1}{{#2}{}}}%
}
\newcounter{section_counter}
\NewDocumentCommand{\section}{ m d<> }{
\stepcounter{section_counter}
\vspace{8mm}
{\bf\Large \hfill Part \arabic{section_counter}\IfNoValueF{#1}{: #1} \hfill}
\IfNoValueF{#2}{\@customlabel{#2}Part \arabic{section_counter}} \\*
\vspace{2mm}
}
% Generic object.
% Same format as \problem, \theorem, etc, but has no counter.
\NewDocumentCommand{\generic}{ m d<> }{
\vspace{3mm}
{\bf\normalsize #1} \\*
\IfNoValueF{#2}{\@customlabel{#2}{#1}}
}
% Make a new secion type.
% Args: command, counter, title.
\newcommand\@newobj[3]{
\NewDocumentCommand{#1}{ m d<> }{
\stepcounter{#2}
\generic{#3 \arabic{#2}:\IfNoValueF{##1}{ ##1}}
\IfNoValueF{##2}{\@customlabel{##2}{#3 \arabic{#2}}}
}
}
\if@singlenumbering
\newcounter{object_counter}
\def\@problemcounter{object_counter}
\@newobj{\definition}{object_counter}{Definition}
\@newobj{\theorem}{object_counter}{Theorem}
\@newobj{\proposition}{object_counter}{Proposition}
\@newobj{\example}{object_counter}{Example}
\else
\newcounter{problem_counter}
\newcounter{theorem_counter}
\newcounter{definition_counter}
\newcounter{example_counter}
\newcounter{proposition_counter}
\def\@problemcounter{problem_counter}
\@newobj{\definition}{definition_counter}{Definition}
\@newobj{\theorem}{theorem_counter}{Theorem}
\@newobj{\proposition}{proposition_counter}{Proposition}
\@newobj{\example}{example_counter}{Example}
\fi
% These must be defined manually, since
% problems and problemparts use two counters.
\newcounter{problempartcounter}
\NewDocumentCommand{\problem}{ m d<> }{
\setcounter{problempartcounter}{0}
\stepcounter{\@problemcounter}
\generic{Problem \arabic{\@problemcounter}:\IfNoValueF{#1}{ #1}}
\IfNoValueF{#2}{\@customlabel{#2}{Problem \arabic{\@problemcounter}}}
}
\NewDocumentCommand{\problempart}{ m d<> }{
\stepcounter{problempartcounter}
\generic{Part \arabic{problempartcounter}:\IfNoValueF{#1}{ #1}}
\IfNoValueF{#2}{\@customlabel{#2}{Problem \arabic{\@problemcounter}.\arabic{problempartcounter}}}
}
% ---------------- %
% Box environments %
% ---------------- %
% Keep track of the current background color.
% Useful for transparent tikz drawings.
\def\ORMCbgcolor{white}
% Make a box environment.
% These can safely be nested.
% Args: name, title, back color, frame color.
\newcommand{\@makeORMCbox}[4]{
\newenvironment{#1}{
% \linehack draws a line across a tcolorbox.
% tcolorbox only supports two sections, but
% this hack allows us to have more.
\def\linehack{
\begin{tikzpicture}
\path[use as bounding box]
(0, 0) --
(\linewidth, 0);
\draw[color=#4, dashed, dash phase=1mm]
(0 - \kvtcb@leftlower-\kvtcb@boxsep, 0) --
(\linewidth + \kvtcb@rightlower + \kvtcb@boxsep, 0);
\end{tikzpicture} \par
\vspace{2mm}
}
% Keep track of the current background color.
% Useful for transparent tikz drawings.
\def\ORMCbgcolor{#3}
\begin{tcolorbox}[
breakable,
colback=#3,
colframe=#4,
title={\textbf{#2}}
]
\raggedright
} {
\end{tcolorbox}
}
}
\@makeORMCbox{examplesolution}{Example Solution}{white}{grey!75!black}
\if@solutions
\@makeORMCbox{solution}{Solution}{red!5!white}{red!75!black}
\@makeORMCbox{instructornote}{Note for Instructors}{cyan!5!white}{cyan!75!black}
\else
\excludecomment{solution}
\excludecomment{instructornote}
\fi
% -------------------- %
% Misc helper commands %
% -------------------- %
\NewDocumentCommand{\note}{ d[] m }{
\IfNoValueTF{#1}
{\textcolor{gray}{#2}}
{\textcolor{gray}{\textit{#1:} #2}}
\par
}
\newcommand{\hint}[1]{\note[Hint]{#1}}