diff options
author | Karl Berry <karl@freefriends.org> | 2016-10-18 21:23:06 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2016-10-18 21:23:06 +0000 |
commit | 67067bf3dea16a3ad7a67d81602f2dbfbb1e1956 (patch) | |
tree | bfeb6a8224ed7b85cff36c504d8a3a0d6b43b8af /Master/texmf-dist/source/latex/bangorexam | |
parent | c6d3b6babcaaf1d629940268315792cf18576a68 (diff) |
bangorexam (18oct16)
git-svn-id: svn://tug.org/texlive/trunk@42299 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/bangorexam')
-rw-r--r-- | Master/texmf-dist/source/latex/bangorexam/bangorexam.dtx | 363 |
1 files changed, 221 insertions, 142 deletions
diff --git a/Master/texmf-dist/source/latex/bangorexam/bangorexam.dtx b/Master/texmf-dist/source/latex/bangorexam/bangorexam.dtx index 6287774a016..116e68d25d4 100644 --- a/Master/texmf-dist/source/latex/bangorexam/bangorexam.dtx +++ b/Master/texmf-dist/source/latex/bangorexam/bangorexam.dtx @@ -40,9 +40,10 @@ \end{document} %</driver> %\fi -%\CheckSum{432} +%\CheckSum{501} %\RecordChanges %\changes{v1.0}{2016/09/26}{Initial version.} +%\changes{v1.1}{2016/10/17}{Added two from four exam mode.} %\pagestyle{fancy} %\title{Bangor University Computer Science Department\\ Exam Document Class} %\author{Cameron Gray \texttt{<c.gray@bangor.ac.uk>}} @@ -247,7 +248,7 @@ % %\ \\ % -%\DescribeMacro{\choice Choice Text} Typesets a single choice according to +%\DescribeMacro{\choice\ Choice Text} Typesets a single choice according to %which environment it is placed in. % %Solutions to multiple choice questions are handled somewhat differently. @@ -256,7 +257,7 @@ % %\ \\ % -%\DescribeMacro{\correctchoice Choice Text} Typeset the correct choice based +%\DescribeMacro{\correctchoice\ Choice Text} Typeset the correct choice based %on where the macro is placed. When |answers| is in effect, the output of %this macro will either highlight the option in boldface, or replace the %checkbox with a tick. @@ -272,11 +273,11 @@ %\end{macrocode} %\fi %\begin{macrocode} -\def\version{1.0.0} +\def\version{1.1.0} \NeedsTeXFormat{LaTeX2e} -\ProvidesClass{bangorexam}[2016/10/03 \version C. Gray] +\ProvidesClass{bangorexam}[2016/10/17 \version{}C. Gray] % Based on the Exam document class by Philip S. Hirschhorn % Developed/Adapted for Bangor University by C. Gray @@ -291,7 +292,6 @@ \RequirePackage{color} \RequirePackage{etoolbox} \RequirePackage{graphicx} -\RequirePackage{ifthen} \RequirePackage{letltxmacro} \RequirePackage{newpxtext,newpxmath} \RequirePackage{totcount} @@ -300,40 +300,47 @@ \RequirePackage{courier} % ******************************************************************* +% Strings +% ******************************************************************* + +\newcommand{\engATypeText}{Answer {\bf Section A} (compulsory) and {\bf any two} questions from {\bf Section B}.}% +\newcommand{\welATypeText}{Atebwch {\bf Adran A} (gorfodol) ac {\bf unrhyw ddau} gwestiwn o {\bf Adran B}.}% +\newcommand{\engBTypeText}{Answer \textbf{two} out of four questions.}% +\newcommand{\welBTypeText}{Atebwch \textbf{ddau} o'r pedwar cwestiwn.}% +\newcommand{\sectionAHeader}{\textbf{SECTION A} --- Answer \textbf{ALL} questions (Total marks \total{sectiona})}% +\newcommand{\sectionBHeader}{\textbf{SECTION B} --- Answer any \textbf{TWO} questions (\total{sectionb} marks each)}% + +% ******************************************************************* % Class Level Options % ******************************************************************* % Enable Welsh headings, etc. Does not affect the cover sheet. % ------------------------------------------------------------------- \DeclareOption{welsh}{% -\newcommand{\welsh}{true}% + \newcommand{\welsh}{true}% + \renewcommand{\sectionAHeader}{\textbf{ADRAN A} --- Atebwch BOB cwestiwn (Cyfanswm marciau \total{sectiona})}% + \renewcommand{\sectionBHeader}{\textbf{ADRAN B} --- Atebwch unrhyw DDAU chwestiwn (\total{sectionb} marc yr un)}% }% % Exam Type % ------------------------------------------------------------------- +\newcommand{\engTypeText}{} +\newcommand{\welTypeText}{} \DeclareOption{ab}{% -\newtotcounter{sectiona}% -\newtotcounter{sectionb} -\newcommand{\examtype}{ab}% -\newcommand{\engTypeText}{Answer {\bf Section A} (compulsory) and {\bf any two} questions from {\bf Section B}.}% -\newcommand{\welTypeText}{Atebwch {\bf Adran A} (gorfodol) ac {\bf unrhyw ddau} gwestiwn o {\bf Adran B}.}% -\newcommand{\sectionAHeader}{\textbf{ADRAN A} --- Atebwch BOB cwestiwn (Cyfanswm marciau \total{sectiona})}% -\newcommand{\sectionBHeader}{\textbf{ADRAN B} --- Atebwch unrhyw DDAU chwestiwn (\total{sectionb} marc yr un)}% -\ifx\welsh\undefined% -\renewcommand{\sectionAHeader}{\textbf{SECTION A} --- Answer \textbf{ALL} questions (Total marks \total{sectiona})}% -\renewcommand{\sectionBHeader}{\textbf{SECTION B} --- Answer any \textbf{TWO} questions (\total{sectionb} marks each)}% -\fi% + \newcommand{\examtype}{ab}% + \renewcommand{\engTypeText}{\engATypeText} + \renewcommand{\welTypeText}{\welATypeText} }% \DeclareOption{twofour}{% -\newcommand{\examtype}{twofour}% -\newcommand{\engTypeText}{Answer \textbf{two} out of four questions.}% -\newcommand{\welTypeTest}{Atebwch \textbf{ddau} o'r pedwar cwestiwn.}% + \newcommand{\examtype}{twofour}% + \renewcommand{\engTypeText}{\engBTypeText} + \renewcommand{\welTypeText}{\welBTypeText} }% \DeclareOption{answers}{\PassOptionsToClass{\CurrentOption}{exam}}% \DeclareOption{draft}{\PassOptionsToClass{\CurrentOption}{exam}}% \ProcessOptions\relax% \ifx\examtype\undefined% -\ClassError{bangorexam}{An exam type option has not been defined; use ab or twofour in the class options.}% + \ClassError{bangorexam}{An exam type option has not been defined; use ab or twofour in the class options}% \fi% \LoadClass[a4paper,twoside,11pt,addpoints]{exam}% @@ -348,73 +355,77 @@ % Footer \pagestyle{headandfoot}% \coverfooter{}{}{\iflastpage{}{/ troi drosodd\\/ turn over}{}}% -\footer{}{}{\oddeven{}{\iflastpage{}{/ troi drosodd / turn over}}}% +\footer{}{}{\oddeven{}{\iflastpage{}{/ troi drosodd\\/ turn over}}}% % Cover Column Definition \newcolumntype{C}[1]{>{\centering\arraybackslash}p{#1}} \SolutionEmphasis{\color{red}} +\CorrectChoiceEmphasis{\bfseries\color{red}} % ******************************************************************* % Configuration Macros % ******************************************************************* \newcounter{tmp} \newtotcounter{all} +\newtotcounter{tf} +\newtotcounter{sectiona} +\newtotcounter{sectionb} \newcommand{\school}[2] {% -\def \engSchool {\expandafter\MakeUppercase\expandafter{#1}}% -\def \welSchool {\expandafter\MakeUppercase\expandafter{#2}}% + \def \engSchool {\expandafter\MakeUppercase\expandafter{#1}}% + \def \welSchool {\expandafter\MakeUppercase\expandafter{#2}}% }% \newcommand{\module}[2]{% -\StrSubstitute{#1}{-}{}[\mTmp]% -\def \moduleCode {\expandafter\MakeUppercase\expandafter{\mTmp}}% -\def \moduleName {#2}% + \StrSubstitute{#1}{-}{}[\mTmp]% + \def \moduleCode {\expandafter\MakeUppercase\expandafter{\mTmp}}% + \def \moduleName {#2}% }% \newcommand{\examperiod}[1]{% -\setcounter{tmp}{\the\year}% -\ifnum \the\month>8% -\stepcounter{tmp}% -\newcommand{\examYear}{\arabic{tmp}}% -\else% -\newcommand{\examYear}{\arabic{tmp}}% -\fi% -\newcommand{\welSemesterText}{Arholiadau Diwedd Semester\ \welSemester}% -\newcommand{\engSemesterText}{End of Semester \engSemester\ Examinations}% -\ifthenelse{\equal{#1}{s1}}{% -\def \welSemester {Un}% -\def \engSemester {One}% -\def \welExamMonth {IONAWR}% -\def \engExamMonth {JANUARY}% -}{}% -\ifthenelse{\equal{#1}{s2}}{% -\def \welSemester {Dau}% -\def \engSemester {Two}% -\def \welExamMonth {MAI}% -\def \engExamMonth {MAY}% -}{}% -\ifthenelse{\equal{#1}{resit}}{% -\renewcommand{\welSemesterText}{Arholiadau Atodol}% -\renewcommand{\engSemesterText}{Supplementary Examination}% -\def \welExamMonth {AWST}% -\def \engExamMonth {AUGUST}% -}{}% + \setcounter{tmp}{\the\year}% + \ifnum \the\month>8% + \stepcounter{tmp}% + \newcommand{\examYear}{\arabic{tmp}}% + \else% + \newcommand{\examYear}{\arabic{tmp}}% + \fi% + \newcommand{\welSemesterText}{Arholiadau Diwedd Semester\ \welSemester}% + \newcommand{\engSemesterText}{End of Semester \engSemester\ Examinations}% + \ifthenelse{\equal{#1}{s1}}{% + \def \welSemester {Un}% + \def \engSemester {One}% + \def \welExamMonth {IONAWR}% + \def \engExamMonth {JANUARY}% + }{}% + \ifthenelse{\equal{#1}{s2}}{% + \def \welSemester {Dau}% + \def \engSemester {Two}% + \def \welExamMonth {MAI}% + \def \engExamMonth {MAY}% + }{}% + \ifthenelse{\equal{#1}{resit}}{% + \renewcommand{\welSemesterText}{Arholiadau Atodol}% + \renewcommand{\engSemesterText}{Supplementary Examination}% + \def \welExamMonth {AWST}% + \def \engExamMonth {AUGUST}% + }{}% } \newcommand{\timeallowed}[1]{% -\def \timeAllowed {#1}% + \def \timeAllowed {#1}% } \newcommand{\guidance}[1]{% -\def \guidance@a {#1}% -\def \guidance@b {#1}% + \def \guidance@a {#1}% + \def \guidance@b {#1}% } \newcommand{\guidancea}[1]{% -\def \guidance@a {#1}% + \def \guidance@a {#1}% } \newcommand{\guidanceb}[1]{% -\def \guidance@b {#1}% + \def \guidance@b {#1}% } % ******************************************************************* @@ -422,99 +433,122 @@ % ******************************************************************* \renewcommand{\maketitle}{% -\ifx\timeAllowed\undefined% -\ClassError{bangorexam}{The time allowed for this exam has not been defined (missing \backslash timealllowed?).}% -\fi% -\ifx\engExamMonth\undefined% -\ClassError{bangorexam}{The exam period for this exam has not been set (missing \backslash examperiod?).}% -\fi% -\ifx\moduleCode\undefined% -\ClassError{bangorexam}{The module details for this exam have not been specified (missing \backslash module?).}% -\fi% -\ifx\welSchool\undefined% -\ClassError{bangorexam}{The academic school setting this exam has not been defined (missing \backslash school?).}% -\fi% - -\begin{center} -\bfseries -\huge -PRIFYSGOL\\ -\large\mbox{}\\ -\huge -BANGOR\\ -\large\mbox{}\\ -\huge -UNIVERSITY - -\vfill -\Large -\welSchool \\ -\engSchool -\end{center} -\medskip -\large -\begin{tabular}{C{0.5\textwidth}C{0.5\textwidth}} -{\bf \welSemesterText\par\welExamMonth\ \examYear}\par\vspace*{\bigskipamount} -Amser a ganiateir:~\timeAllowed~awr &% -{\bf \engSemesterText\par\engExamMonth\ \examYear}\par\vspace*{\bigskipamount} -Time allowed:~\timeAllowed~hours -\end{tabular} - -\vspace*{20mm} -\LARGE -\begin{center} -{\bf \moduleCode\\ -\mbox{}\\ -\moduleName} - -\vfill -\large -{\welTypeText} \\ -{\engTypeText} \\ -\ - -\medskip -{\bf Total marks \total{all}} -\vfill -\end{center} + \ifx\timeAllowed\undefined% + \ClassError{bangorexam}{The time allowed for this exam has not been defined (missing timealllowed?)}% + \fi% + \ifx\engExamMonth\undefined% + \ClassError{bangorexam}{The exam period for this exam has not been set (missing examperiod?)}% + \fi% + \ifx\moduleCode\undefined% + \ClassError{bangorexam}{The module details for this exam have not been specified (missing module?)}% + \fi% + \ifx\welSchool\undefined% + \ClassError{bangorexam}{The academic school setting this exam has not been defined (missing school?)}% + \fi% + + \begin{center} + \bfseries + \huge + PRIFYSGOL\\ + \large\mbox{}\\ + \huge + BANGOR\\ + \large\mbox{}\\ + \huge + UNIVERSITY + + \vfill + \Large + \welSchool \\ + \engSchool + \end{center} + \medskip + \large + \begin{tabular}{C{0.5\textwidth}C{0.5\textwidth}} + {\bf \welSemesterText\par\welExamMonth\ \examYear}\par\vspace*{\bigskipamount} + Amser a ganiateir:~\timeAllowed~awr &% + {\bf \engSemesterText\par\engExamMonth\ \examYear}\par\vspace*{\bigskipamount} + Time allowed:~\timeAllowed~hours + \end{tabular} + + \vspace*{20mm} + \LARGE + \begin{center} + {\bf \moduleCode\\ + \mbox{}\\ + \moduleName} + + \vfill + \large + {\welTypeText} \\ + {\engTypeText} \\ + \ + + \medskip + {\bf Total marks \total{all}\\ + Cyfanswm Marciau \total{all}} + \vfill + \end{center} } \AtBeginDocument{ -\begin{coverpages} -\setlength{\hoffset}{0mm} -\setlength{\marginparwidth}{0pt} -\maketitle -\end{coverpages} -\pointsinrightmargin + \begin{coverpages} + \setlength{\hoffset}{0mm} + \setlength{\marginparwidth}{0pt} + \maketitle + \end{coverpages} + \pointsinrightmargin + \ifthenelse{\equal{\examtype}{twofour}}{ + \clearpage + {% + \LARGE + \textbf{\moduleCode: \quad \moduleName} + + \vspace*{8mm} + \large + \ifcsdef{guidance@a}{\normalsize\par\guidance@a}{}% + } + \vspace*{8mm} + }{}% } % ******************************************************************* % Section Commands % ******************************************************************* -\newcommand{\hassectiona}{false}% -\newcommand{\hassectionb}{false}% +\newcounter{seca} +\newcounter{secb} \newcommand{\inDoc}{none}% \newcommand{\sectiona} {% -\ifthenelse{\equal{\examtype}{twofour}}{\ClassError{bangorexam}{\\sectiona used in a 'two from four' exam.}}{}% -\ifthenelse{\equal{\hassectiona}{true}}{\ClassError{bangorexam}{There is already a \\sectiona in this exam.}}{}% -\renewcommand{\hassectiona}{true}% -\renewcommand{\inDoc}{secA}% -\clearpage -{% -\LARGE -\textbf{\moduleCode: \quad \moduleName} - -\vspace*{8mm} -\large -\sectionAHeader -\ifcsdef{guidance@a}{\normalsize\par\guidance@a}{}% -} -\vspace*{8mm} + \ifthenelse{\equal{\examtype}{twofour}}{\ClassError{bangorexam}{Section A defined in a 'two from four' exam}\relax}{}% + \ifnumcomp{\value{seca}}{>}{0} + { + \ClassError{bangorexam}{There is already a Section A in this exam}\relax% + } + { + \stepcounter{seca}\relax% + } + \renewcommand{\inDoc}{secA}% + \clearpage + {% + \LARGE + \textbf{\moduleCode: \quad \moduleName} + + \vspace*{8mm} + \large + \sectionAHeader + \ifcsdef{guidance@a}{\normalsize\par\guidance@a}{}% + } + \vspace*{8mm} } \newcommand{\sectionb}{% -\ifthenelse{\equal{\examtype}{twofour}}{\ClassError{bangorexam}{\\sectionb used in a 'two from four' exam.}}{} -\ifthenelse{\equal{\hassectionb}{true}}{\ClassError{bangorexam}{There is already a \\sectionb in this exam.}}{} -\renewcommand{\hassectionb}{true} +\ifthenelse{\equal{\examtype}{twofour}}{\ClassError{bangorexam}{Section B defined in a 'two from four' exam}\relax}{} + \ifnumcomp{\value{secb}}{>}{0} + { + \ClassError{bangorexam}{There is already a Section B in this exam}\relax% + } + { + \stepcounter{secb}\relax% + } \renewcommand{\inDoc}{secB} \clearpage {% @@ -559,7 +593,23 @@ Time allowed:~\timeAllowed~hours \ifnumcomp{\value{sectionb}}{=}{#1}% {}% {% - \ClassError{bangorexam}{Section B question \arabic{question} does not have an equal number of points (Existing Section B question worth \arabic{sectionb})}% + \ClassError{bangorexam}{Section B question \arabic{question} does not have an equal number of points (Existing Section B question worth \arabic{sectionb})}\relax% + }% + }% + {}% + \edef\mytemp{{\examtype}}% + \expandafter\ifstrequal\mytemp{twofour}% + {% + \ifnumcomp{\value{tf}}{=}{0}% + {% + \addtocounter{tf}{#1}% + \addtocounter{all}{#1}% + \addtocounter{all}{#1}}% + {}% + \ifnumcomp{\value{tf}}{=}{#1}% + {}% + {% + \ClassError{bangorexam}{Question \arabic{question} does not have an equal number of points (Existing question(s) worth \arabic{tf})}\relax% }% }% {}% @@ -573,6 +623,35 @@ Time allowed:~\timeAllowed~hours \newcommand{\pointsdec}[1]{% \pointname{#1}\patchqnumaddpoints } + +% ******************************************************************* +% End of document validation +% ******************************************************************* + +\AtEndDocument{% + \edef\mytemp{{\examtype}}% + \expandafter\ifstrequal\mytemp{twofour}% + {% + \edef\mytmp{\numquestions}% + \expandafter\ifstrequal\mytmp{4}% + {\relax}% + {% + \ClassError{bangorexam}{There is/are only (\numquestions) question(s) defined, there should be four}\relax% + }% + }{% + \ifnumcomp{\value{seca}}{=}{0}% + {% + \ClassError{bangorexam}{There is no Section A defined in this exam}\relax% + }% + {\relax}% + \ifnumcomp{\value{secb}}{=}{0}% + {% + \ClassError{bangorexam}{There is no Section B defined in this exam}\relax% + }% + {\relax}% + }% +} + % \end{macrocode}%\iffalse % \begin{macrocode} %</bangorexam.cls> |