145 lines
3.2 KiB
TeX
145 lines
3.2 KiB
TeX
%%
|
|
%% problemset package:
|
|
%% macros for problem sets
|
|
%%
|
|
|
|
%% TeX format
|
|
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
|
|
|
|
%% package name
|
|
\ProvidesPackage{problemset}[2022/01/25]
|
|
|
|
\newif\ifproblemineq
|
|
\newif\ifquestionineq
|
|
|
|
\DeclareOption{problem_in_eq}{\problemineqtrue}
|
|
\DeclareOption{no_problem_in_eq}{\problemineqfalse}
|
|
\DeclareOption{question_in_eq}{\questionineqtrue}
|
|
\DeclareOption{no_question_in_eq}{\questionineqfalse}
|
|
|
|
\def\problemset@defaultoptions{
|
|
\ExecuteOptions{problem_in_eq, no_question_in_eq}
|
|
\ProcessOptions
|
|
}
|
|
|
|
%% the problem command handles automatic problem numbering, as well as per-problem equation numbering
|
|
|
|
% problem counter
|
|
\newcounter{problemcount}
|
|
|
|
% problem@temp is set to true when there is an optional argument
|
|
\newif\ifproblem@temp
|
|
\def\problem{%
|
|
% check whether there is an optional argument (if there is none, add on empty '[]')
|
|
\@ifnextchar [{\problem@temptrue\@problemx}{\problem@tempfalse\@problemx[]}%
|
|
}
|
|
% command with optional argument
|
|
\def\@problemx[#1]{%
|
|
% reset question counter
|
|
\setcounter{questioncount}{0}
|
|
% if optional argument, set problem num to argument
|
|
\ifproblem@temp%
|
|
\edef\problemnum{#1}%
|
|
% otherwise, count
|
|
\else%
|
|
\stepcounter{problemcount}%
|
|
\edef\problemnum{\theproblemcount}%
|
|
\fi%
|
|
% if ian class
|
|
\ifianclass%
|
|
% define tag for label
|
|
\hrefanchor%
|
|
\xdef\tag{E\problemnum}%
|
|
%
|
|
% add header to equation numbers (for ian class)
|
|
\ifproblemineq%
|
|
\def\eqprefix{E\problemnum.}%
|
|
% reset equation number
|
|
\setcounter{seqcount}{0}%
|
|
\fi%
|
|
\fi%
|
|
% header
|
|
\problemformat{E\problemnum}%
|
|
}
|
|
|
|
% problem formatting (override to customize)
|
|
\def\problemformat#1{{\bf #1}. }
|
|
|
|
|
|
%% question is to problem as subsection is to section
|
|
|
|
% question counter
|
|
\newcounter{questioncount}
|
|
|
|
% question@temp is set to true when there is an optional argument
|
|
\newif\ifquestion@temp
|
|
\def\question{%
|
|
% check whether there is an optional argument (if there is none, add on empty '[]')
|
|
\@ifnextchar [{\question@temptrue\@questionx}{\question@tempfalse\@questionx[]}%
|
|
}
|
|
% command with optional argument
|
|
\def\@questionx[#1]{%
|
|
% if optional argument, set problem num to argument
|
|
\ifquestion@temp%
|
|
\edef\questionnum{#1}%
|
|
% otherwise, count
|
|
\else%
|
|
\stepcounter{questioncount}%
|
|
\edef\questionnum{\alph{questioncount}}%
|
|
\fi%
|
|
% header
|
|
\questionformat{\questionnum}%
|
|
% if ian class
|
|
\ifianclass%
|
|
% define tag for label
|
|
\hrefanchor%
|
|
\xdef\tag{\questionnum}%
|
|
%
|
|
% add header to equation numbers (for ian class)
|
|
\ifquestionineq%
|
|
\def\eqprefix{\questionnum.}%
|
|
% reset equation number
|
|
\setcounter{seqcount}{0}%
|
|
\fi%
|
|
\fi%
|
|
}
|
|
|
|
% question formatting (override to customize)
|
|
\def\questionformat#1{{\bf(#1)} }
|
|
|
|
\def\solution#1{
|
|
\makelink{sol:#1}{\thepage}
|
|
{\bf Solution\-~\ref{ex:#1}}\par\penalty10000\smallskip\penalty10000
|
|
\def\eqprefix{S\textref{ex:#1}.}
|
|
\resetpointcounter
|
|
\setcounter{seqcount}{0}
|
|
}
|
|
|
|
%\newif\ifsolution
|
|
%% display solutions
|
|
%\long\def\solution#1{
|
|
% \ifsolution
|
|
% \bigskip
|
|
% \leftskip20pt
|
|
% \rightskip20pt
|
|
% {\bf Solution}: #1
|
|
% \par
|
|
% \leftskip0pt
|
|
% \rightskip0pt
|
|
% \bigskip
|
|
% \fi
|
|
%}
|
|
|
|
|
|
% rubric
|
|
\newif\ifrubric
|
|
\long\def\rubric#1{
|
|
\ifrubric
|
|
({\it #1})
|
|
\fi
|
|
}
|
|
|
|
%% end
|
|
\problemset@defaultoptions
|
|
\endinput
|