handouts/resources/ormc_handout.cls
2023-05-25 22:58:47 -07:00

378 lines
8.4 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 %
% ------------------ %
\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
\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{
solutions,
multinumbering,
pagenumber,
longwarning,
yeswarning
}
\ProcessOptions
% 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
\RequirePackage{etoolbox}
% Based on article class
\LoadClass{article}
\undef\maketitle
\undef\section
\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{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
% 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}}