%\iffalse
% kfupm-math-exam.dtx generated using makedtx version 1.2 (c) Nicola Talbot
% Command line args:
%   -src "kfupm-math-exam\.cls=>kfupm-math-exam.cls"
%   -doc "kfupm-math-exam.tex"
%   kfupm-math-exam
% Created on 2022/7/25 6:06
%\fi
%\iffalse
%<*package>
%% \CharacterTable
%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%   Digits        \0\1\2\3\4\5\6\7\8\9
%%   Exclamation   \!     Double quote  \"     Hash (number) \#
%%   Dollar        \$     Percent       \%     Ampersand     \&
%%   Acute accent  \'     Left paren    \(     Right paren   \)
%%   Asterisk      \*     Plus          \+     Comma         \,
%%   Minus         \-     Point         \.     Solidus       \/
%%   Colon         \:     Semicolon     \;     Less than     \<
%%   Equals        \=     Greater than  \>     Question mark \?
%%   Commercial at \@     Left bracket  \[     Backslash     \\
%%   Right bracket \]     Circumflex    \^     Underscore    \_
%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%%   Right brace   \}     Tilde         \~}
%</package>
%\fi
% \iffalse
% Doc-Source file to use with LaTeX2e
% Copyright (C) 2022 Mohammed Alshahrani, all rights reserved.
% \fi
% \iffalse
%<*driver>
\documentclass{article}
\usepackage[utf8]{inputenc}

\title{KFUP MATH EXAM \\
 {\large version 0.1.0}}
\author{ Mohammed Alshahrani}
\date{July 2022}

\begin{document}
\DocInput{kfupm-math-exam.dtx}
\end{document}
%</driver>
%\fi
%
%\maketitle
%
%\section{Usage}
%\begin{verbatim}
%\documentclass[
%  % all of the below options are optional and can be left out
%  % course name
%  course = {{MATH333: Methods of Applied Mathematics I}},
%  % quartile (default: 3)
%  quartile = {{}},
%  % assignment number/name (default: 1)
%  examtitle = {{Exam 1}},%Monday, %Wednesday,
%  examdate = {{Monday March 1, 2022}},
%  topic = {{}},
%  dept= {{/MATH}},
%  numofquestions=20,
%  numofversions=4,
%  numofoptions=5,
%  firstexercise = 1,
%  term = {{Term 213}},
%  betweenquestions=4.5cm
%]{kfupm-math-exam}
%
%
%\instructions{
%\underline{\large{\bf Important Instructions:}}
%\begin{enumerate}
%    \begin{normalsize}
%        \item  Instruction 1
%        \item  Instruction 2
%        \item  Instruction 3
%        \item  Instruction 4
%        \item  Instruction 5
%
%    \end{normalsize}
%\end{enumerate}
%}
%
%\begin{document}
%
%
%
%\versioncover{1}
%
%\newpage
%
%\begin{itemize}
%    \item i
%
%\end{itemize}
%
%\newpage
%\versioncover{12}
%
%\newpage
%
%
%\end{document}
%\end{verbatim}
%
%
%\StopEventually{}
%\section{The Code}
%\iffalse
%    \begin{macrocode}
%<*kfupm-math-exam.cls>
%    \end{macrocode}
%\fi
% kfupm-math-exam.cls
%   Department of Mathematics
%   King Fahd University of Petroleum and Minerals
% A LaTeX2e document class for preparing the exams of the department of mathematics, KFUPM.

% --- METADATA -----------------------------------------------------------------
\def\fileversion{0.1.0}
\def\filedate{2022/07/25}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{kfupm-math-exam}[\filedate\space Version \fileversion\space by
  Department of Mathematics, KFUPM]
% --- OPTION PROCESSSING -------------------------------------------------------
\RequirePackage{kvoptions} \SetupKeyvalOptions{
  family = kfupmmathexam,
  prefix = kfupmmathexam@,
  setkeys = \kvsetkeys
}
\DeclareStringOption[212]%
  {term}
\DeclareStringOption[Exam]%
  {topic}
\DeclareStringOption[King Fahd University of Petroleum \& Minerals]%
  {university}
\DeclareStringOption[Department of Mathematics]%
  {dept}
\DeclareStringOption[MATH101 CALCULUS I]%
  {course}
\DeclareStringOption[3]%
  {quartile}
\DeclareStringOption[1]%
  {examtitle}
\DeclareStringOption[March 9, 2022]%
  {examdate}
\DeclareStringOption[4]%
  {numofversions}
\DeclareStringOption[15]%
  {numofquestions}
\DeclareStringOption[5]%
  {numofoptions}
\DeclareStringOption[0123456]%
  {studentnumber}
\DeclareStringOption[snumver@kfupm.edu.sa]%
  {email}
\DeclareStringOption[1]%
  {firstexercise}
\DeclareStringOption[3.5cm]{betweenquestions}
\DeclareStringOption[0.762cm]{spaceafterbody}
\DeclareStringOption[0.5cm]{betweenoptions}
% pass unrecognized options to `article` class
\DeclareDefaultOption{%
  \PassOptionsToClass{\CurrentOption}{article}%
}
% process all options
\ProcessKeyvalOptions{kfupmmathexam}
% load parent class with some default options
\LoadClass[a4paper, 12pt]{article}
% --- PACKAGES AND SETUP -------------------------------------------------------
\RequirePackage[
    paperheight=33cm,
    paperwidth=21.5cm,
    headheight = 20pt,
    margin = 2cm,
    tmargin = \dimexpr 2cm - 10pt \relax,
  ]{geometry} % set up nicer margins
  \addtolength{\footskip}{20pt}
\RequirePackage{fancyhdr} % for headers and footers
\RequirePackage{graphicx} % for including figures
\RequirePackage{amsmath} % use AMS math package
\RequirePackage{amssymb} % use AMS symbols
\RequirePackage{amsthm} % for writing proofs
\RequirePackage{array} % for setting up arguments to columns
\RequirePackage{booktabs} % for professional tables
\RequirePackage%
  [tworuled, linesnumbered, noend, noline]%
  {algorithm2e} % for typesetting pseudo-code
\RequirePackage{xcolor} % for colored text (comments in algorithms)
\RequirePackage{trimspaces, xstring} % for multiple author parsing
\RequirePackage[shortlabels]{enumitem} \labelsep=.75cm
\RequirePackage{mathrsfs}
\RequirePackage{xparse}
\RequirePackage{environ}
\RequirePackage{pgfplots}
\pgfplotsset{compat=newest}
\RequirePackage{tcolorbox}

% option post-processing
\newcommand{\kme@temp}{}
\newcommand{\kme@sub}[4]{%
  \ifnum#3 = 1\relax%
    \ifnum#4 = 1\relax%
      \renewcommand{\kme@temp}{#1}%
    \else%
      \StrBefore{#1}{#2}[\kme@temp]%
    \fi%
  \else%
    \ifnum#3 = #4\relax%
      \StrBehind[\numexpr#3 - 1\relax]{#1}{#2}[\kme@temp]%
    \else%
      \StrBetween[\numexpr#3 - 1\relax,#3]{#1}{#2}{#2}[\kme@temp]%
    \fi%
  \fi%
  \expandafter\trim@spaces\expandafter{\kme@temp}%
}
\newcommand{\kme@authorProcessed}[1]{%
  \kme@sub{\kfupmmathexam@name}{;}{#1}{\arabic{kme@numAuthors}}~%
  (\kme@sub{\kfupmmathexam@studentnumber}{;}{#1}{\arabic{kme@numAuthors}})\\%
  \texttt{\kme@sub{\kfupmmathexam@email}{;}{#1}{\arabic{kme@numAuthors}}}%
  % if there are more authors, do a recursive call for the next one
  \ifnum#1 < \arabic{kme@numAuthors}\relax\and\kme@authorProcessed{\numexpr#1 + 1\relax}\fi%
}
\newcommand{\kme@authorsProcessed}{%
  % count number of authors; one more than number of semicolons
  \StrCount{\kfupmmathexam@name}{;}[\kme@numAuthors]%
  \newcounter{kme@numAuthors}%
  \setcounter{kme@numAuthors}{\kme@numAuthors}%
  \stepcounter{kme@numAuthors}%
  % produce output
  \kme@authorProcessed{1}%
}
% look for figures in the figures directory
\graphicspath{{figures/}}
% set up headers and footers; same for all pages
\setlength{\headheight}{10pt}
\newcommand{\kfupmmathexam@setupHF}{%
  \fancyhf{}
  \fancyhead[L]{\sffamily \small KFUPM  }
  \fancyhead[C]{\sffamily Page \thepage ~of  \pageref{LastPage}}
  \fancyhead[R]{\sffamily Term \kfupmmathexam@term}
  \fancyfoot[L]{\sffamily /\kfupmmathexam@dept}
  \fancyfoot[R]{\sffamily\bfseries\thepage}
  \renewcommand{\headrulewidth}{0.5pt}
  \renewcommand{\footrulewidth}{0.5pt}
}
\fancypagestyle{plain}{\kfupmmathexam@setupHF{}} \kfupmmathexam@setupHF{}
\pagestyle{fancy}
\NewDocumentCommand{\coverpage}{O{\kfupmmathexam@course} O{\kfupmmathexam@examtitle} O{\kfupmmathexam@term} O{\kfupmmathexam@examdate}}{%
\thispagestyle{empty}
\begin{center}
    \begin{large}
        Kink Fahd University of Petroleum and Minerals\\
        Mathematics\\
        \vspace*{2cm}
        {\bf #1}  \\
        {\bf #2}  \\
        {\bf #3}  \\
        {\bf #4}  \\

        \vspace*{3cm}
        {\bf{\Huge{\fbox{EXAM COVER }}}}\\
        \vspace*{2cm}
        {\bf Number of versions: \kfupmmathexam@numofversions }  \\
        {\bf Number of questions: \kfupmmathexam@numofquestions }  \\
        {\bf Number of Answers: \kfupmmathexam@numofoptions  }  \\

        \vspace*{0.2cm}

    \end{large}

    \vfill

    \tiny{This exam was prepared using EXAM SHUFFLER}
    \tiny{For questions send an email to Dr. Mohammed Alshahrani (mshahrani@kfupm.edu.sa) }
\end{center}
\newpage
}
\newcommand{\versioncover}[1]{
\thispagestyle{empty}
\begin{center}
    \begin{large}
        Kink Fahd University of Petroleum and Minerals \\
        Mathematics \\
        \vspace*{4.5cm}
        {\bf \fbox{ \codestr{CODE}{#1} } }  \hfill {\bf \fbox{ \codestr{CODE}{#1} }} \\
        {\bf math333 }  \\
        {\bf exam 1 }  \\
        {\bf 182 }  \\
        {\bf monday march 13 }  \\
        {\bf Net Time Allowed: 120 minutes }  \\

        \vspace*{0.2cm}

    \end{large}
\end{center}
\ifthenelse{\equal{#1}{0}}{
\begin{center}
\vspace*{6cm}
{\bf {\Huge{MASTER VERSION}}}  \\
\end{center}
}{
\large{Name:  }\hrulefill

\vspace{3mm}

\large{ID: } \hrulefill \large{  Sec: } \hrulefill \large{.}

\vspace{1cm}

\large{\bf{Check that this exam has {\underline{ \thenumberofquestions }} questions.}}

\vspace{1cm}

\getInstructions
}
\newpage

\renewcommand{\thepage}{\noindent Term 182, math333, exam 1 \hfill Page {\bf \arabic{page} of \pagecount{\thenumberofpages} } \hfill {\bf \fbox{ \codestr{CODE}{#1} }}}
\setcounter{page}{1}

}
% ensure that the title is inserted in the document
\title{\coverpage}
\author{}
\date{}
\AtBeginDocument{\pagestyle{myheadings}}%\maketitle

% add some keywords
\SetKw{And}{and} \SetKw{Or}{or} \SetKw{To}{to}
% make it possible to not have line numbers on a single line
\let\oldnl\nl
\newcommand{\nonl}{\renewcommand{\nl}{\let\nl\oldnl}}
% style algorithm captions
\newcommand{\kfupmmathexam@capsty}[1]{\!}
\SetAlCapSty{kfupmmathexam@capsty} \SetAlCapNameFnt{\scshape\hspace{.69em}}
% get rid of semicolons
\DontPrintSemicolon
% comment formatting
\newcommand\agacommfont[1]{\footnotesize\ttfamily\textcolor{gray}{#1}}
\SetCommentSty{agacommfont}
% --- USEFUL MACROS ------------------------------------------------------------
\newcommand*{\R}{{\mathbb R}}
\newcommand*{\N}{{\mathbb N}}
\newcommand*{\Z}{{\mathbb Z}}
\newcommand*{\Q}{{\mathbb Q}}

% lengths and commands of the exam options
\newcount\numberofversions
\numberofversions=\kfupmmathexam@numofversions
\advance\numberofversions +1
\newcounter{numberofquestions}
\setcounter{numberofquestions}{\kfupmmathexam@numofquestions}
\newcounter{numberofpages}
\setcounter{numberofpages}{0}
% --- define new database for exam questions ----
\newcounter{examcodecounter}
\setcounter{examcodecounter}{1}


\ExplSyntaxOn
\str_new:N \l_alphabets_str
\str_set:Nn \l_alphabets_str {abcdefghigklmnopqrstuvwxuz}
\newcommand{\instructions}[1]{
  \tl_set:Nn \l_tmpa_str {#1}
}
\newcommand{\getInstructions}[1]{
  \tl_use:N \l_tmpa_str
}
\int_new:N \l_tmppages_int
\int_set:Nn \l_tmppages_int {0}
\cs_set:Npn \l_calc_pages_int:n #1 {
    \int_set:Nn \l_tmppages_int {\int_div_truncate:nn {#1}{2}}
    \int_set:Nn \l_tmppages_int {\int_compare:nNnTF {0}={\int_mod:nn {#1}{2}}{\l_tmppages_int}{\l_tmppages_int+1}}
    \int_use:N \l_tmppages_int
}
\newcommand{\pagecount}[1]{
    \l_calc_pages_int:n {15}
}


\str_new:N \l_exam_code_str
\int_new:N \l_exam_version_int
\cs_set:Npn \l_concat_codenumber_str:nn #1#2 {
    \int_set:Nn \l_exam_version_int {100+#2}
    \str_clear_new:N \l_partone_str
    \str_clear_new:N \l_parttwo_str
    \str_set:Nn \l_partone_str {#1}
    \str_set:Nx \l_parttwo_str {\int_use:N \l_exam_version_int}
    \str_set:Nx \l_parttwo_str {\str_range:Nnn \l_parttwo_str {-2}{-1}}
    \str_concat:NNN \l_exam_code_str \l_partone_str \l_parttwo_str
    \str_use:N \l_exam_code_str
}
\newcommand{\codestr}[2]{
    \int_compare:nNnTF {0}={#2}{MASTER}{
    \l_concat_codenumber_str:nn {#1}{#2}
    }
}

% working with list

\ExplSyntaxOff
%\iffalse
%    \begin{macrocode}
%</kfupm-math-exam.cls>
%    \end{macrocode}
%\fi
%\Finale
\endinput
