% 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{}` \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{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}}