From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex/contrib/exams/README | 32 + macros/latex/contrib/exams/exam.cfg | 110 ++ macros/latex/contrib/exams/exam.dtx | 2086 ++++++++++++++++++++++++++++++++ macros/latex/contrib/exams/exam.ins | 38 + macros/latex/contrib/exams/exam.readme | 1 + 5 files changed, 2267 insertions(+) create mode 100644 macros/latex/contrib/exams/README create mode 100644 macros/latex/contrib/exams/exam.cfg create mode 100644 macros/latex/contrib/exams/exam.dtx create mode 100644 macros/latex/contrib/exams/exam.ins create mode 120000 macros/latex/contrib/exams/exam.readme (limited to 'macros/latex/contrib/exams') diff --git a/macros/latex/contrib/exams/README b/macros/latex/contrib/exams/README new file mode 100644 index 0000000000..787919b00a --- /dev/null +++ b/macros/latex/contrib/exams/README @@ -0,0 +1,32 @@ +DESCRIPTION + +exam.cls is a LaTeX2e class meant for the production +of exam questions. It is built as an extension to +existing document classes like article, etc. + +With exam.cls one can: +- produce an exam +- produce an exam with answers +- produce a collection of exam questions + +Various forms of questions are possible: +- multiple choice +- short answer +- long answer + +It is possible to collect small variations of a question +into one main question and select the different possibilities +with a parameter. Also builtin is a random generator, providing +random shuffling of multiple choice alternatives, etc. + +The file exam.cfg is included as an example how to customize typesetting. + +INSTALLATION + +First produce exam.cls by running exam.ins on exam.dtx, +then typeset the documentation in exam.dtx (the examples +in the tutorial section of the documentation use exam.cls; +ignore the LaTeX warning on the requested package). + +Hans van der Meer +email address: hansm@fwi.uva.nl diff --git a/macros/latex/contrib/exams/exam.cfg b/macros/latex/contrib/exams/exam.cfg new file mode 100644 index 0000000000..73c0c06738 --- /dev/null +++ b/macros/latex/contrib/exams/exam.cfg @@ -0,0 +1,110 @@ +% EXAMPLE OF CFG-FILE -- SHOWS CUSTOMIZING +% +% fontchanges; e.g. instead of Computer Modern either Lucida or MathTime: +%\RequirePackage[expert]{lucbr} +%\RequirePackage{mathtime} +% +% Copyright notice found here: +\providecommand{\Copyright}{% + \InputIfFileExists{\commonfolder copyrightnotice.tex }% + {\mbox{}}{\mbox{}}} +% +% macros can be localized: +\newcommand\fullanswer{Geef de volledige afleiding; + slechts het antwoord vermelden wordt \emph{niet} goed gerekend.} + \let\opgavedatum=\problemdate + \let\parameteropgave=\parameterproblem + \let\opgave=\problem + \let\endopgave=\endproblem + \let\vraag=\question + \let\endvraag=\endquestion + \let\keuze=\choice + \let\endkeuze=\endchoice + \let\tentamen=\exam + \let\endtentamen=\endexam + \let\foutmerk=\badmark + \let\goedmerk=\goodmark + \let\foutitem=\baditem + \let\goeditem=\gooditem + \let\kortantwoord=\shortanswer + \let\antwoordblok=\longanswer + \let\endantwoordblok=\endlonganswer + \let\antwoord=\answer + \let\altantwoord=\altanswer + \let\volledigantwoord=\fullanswer + \let\opmerking=\remark +% +\pagestyle{examheadings} +% +\addtolength{\topmargin}{-15mm} +\addtolength{\textheight}{35mm} +\addtolength{\oddsidemargin}{-10mm} +\addtolength{\textwidth}{20mm} +\setlength{\parindent}{0pt} +\tolerance=2000 +\hbadness=2000 +\emergencystretch=2mm +\interlinepenalty=1000 +\widowpenalty 1000 +% see lost characters (possibly wrong font/encoding) +\tracingonline=1 \tracinglostchars=1 +% +% +% The titlepage is set by a redefined \maketitle. Of course it +% needs to be suppressed if the notitlepage option is given +% on the \documentclass call. Provide two versions, one +% for a real exam and one for collections and/or answers. +% +\if@titlepage +\renewcommand\maketitle{% +\begin{titlepage} + \begin{center}\titlefont + \vspace*{1cm}% + \mbox{}\rule{2cm}{0.4pt}\mbox{}\par + \addvspace{1cm}% + \begin{Large} + \textbf{\ifseries\Collection\else\Exam\fi}\\[10mm] + \end{Large} + \begin{large} + \@title\\[5mm] + \ifseries\@author\else\@target\fi\\[5mm] + \@date\\[10mm] + \end{large} + \mbox{}\rule{2cm}{0.4pt}\mbox{}\par + \addvspace{2cm}% + \ifseries + \vfill\vfill + \begin{flushleft}\Copyright\end{flushleft}% + \else\ifanswers + \begin{huge}\Answers\end{huge}\par + \else + \begin{minipage}{.75\textwidth}% + \raggedright\parindent\medskipamount + Naam:\enspace\dotfill\strut\par + Adres:\enspace\dotfill\strut\par + Plaats:\enspace\dotfill\strut\par + Collegekaart:\enspace\dotfill\strut\par + \vspace{1cm}% + \begin{itemize}% + \item Zonder geldige collegekaart wordt geen + tentamenbriefje uitgereikt. + \item U wordt met nadruk verzocht om een + \emph{leesbaar} schrift; wat niet leesbaar + is, wordt fout gerekend. + \item Denk erom losse vellen tentamenpapier + van Uw naam en collegekaartnummer te voorzien; + gebruik blokletters voor de leesbaarheid. + \item Dit tentamen telt \theproblemnum\ opgaven + \end{itemize}% + \end{minipage}\\[10mm] + Succes!\par + \fi + \fi + \end{center}% +\end{titlepage}\let\maketitle=\relax} +\else +\let\maketitle=\relax +\fi +\renewcommand\answerstart{\noindent\sffamily\emph{\Answer}:\enspace} +% +\endinput diff --git a/macros/latex/contrib/exams/exam.dtx b/macros/latex/contrib/exams/exam.dtx new file mode 100644 index 0000000000..d3155edad7 --- /dev/null +++ b/macros/latex/contrib/exams/exam.dtx @@ -0,0 +1,2086 @@ +% \CheckSum{1040} +% +%\iffalse % this is a METACOMMENT ! +% +% File: exam.dtx Copyright (C) 1993-1996 Hans van der Meer +% +% \begin{macrocode} +%<*driver> +\documentclass{ltxdoc} +\setlength\overfullrule{5pt} +\usepackage{verbatim} +\IfFileExists{exam.cls}{\def\noexamples{}}% + {\ClassWarningNoLine{ltxdoc}{Install exam.cls first}% + \def\noexamples{\fbox{\huge Install exam.cls first}\end{document}}} +\makeatletter + \let\old@maketitle=\maketitle + \let\LoadClass=\@gobble + \let\@oldtableofcontents=\tableofcontents + \input{exam.cls}% + \let\tableofcontents=\@oldtableofcontents + \let\maketitle=\old@maketitle +\makeatother +\noexamples +\ProvidesFile{exam.dtx}[1997/03/14 3.30 Slides and notes] +\GetFileInfo{exam.dtx} +\title{The \textsf{exam} package% +\thanks{This file has version \fileversion\space dated \filedate.}} +\author{Hans van der Meer\\hansm@wins.uva.nl} +\date{Printed \today} +\CodelineNumbered +\DisableCrossrefs +\RecordChanges +\begin{document} +\maketitle +\DocInput{exam.dtx} +\end{document} +% +% \end{macrocode} +%\fi +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \changes{3.00}{1994/02/13}{First version for LaTeX2E and docstrip} +% \changes{3.01}{1994/03/24}{added mbox{} to Copyright (missing item error)} +% \changes{3.10}{1994/10/19}{updated several features} +% \changes{3.11}{1994/10/21}{added dumpitemno and ignorespace in SRset} +% \changes{3.12}{1994/10/25}{changed pagenumbering index} +% \changes{3.13}{1994/11/10}{help shows class options} +% \changes{3.14}{1994/11/24}{empty default for mainfolder, etc.} +% \changes{3.15}{1994/12/10}{default language initialization added} +% \changes{3.16}{1995/01/19}{require latest latex because of box trouble} +% \changes{3.17}{1995/01/26}{maketitle redefinition better in exam.cfg} +% \changes{3.18}{1995/02/02}{options, documentation, checksquare->boxtimes} +% \changes{3.19}{1995/03/10}{pagestyle tuned, added options} +% \changes{3.20}{1995/07/12}{table of contents problem solved} +% \changes{3.21}{1995/08/07}{writing toc-entry in question displaced} +% \changes{3.22}{1995/08/09}{folders default set to @currdir} +% \changes{3.23}{1995/10/26}{help standard, textbo removed, small changes} +% \changes{3.24}{1995/10/30}{ignorespaces added to longanswer start} +% \changes{3.25}{1995/12/17}{error in altanswer repaired} +% \changes{3.26}{1996/08/10}{cleaning, fixing loose ends, simplified where possible} +% \changes{3.27}{1996/08/19}{dir path separator changed in folder macros} +% \changes{3.28}{1996/08/23}{shortanswer changed, documentation polished} +% \changes{3.29}{1997/03/08}{directory macros changed} +% \changes{3.30}{1997/03/14}{CurrentDirectory for @currdir added} +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \DoNotIndex{\#} +% \DoNotIndex{\@@input} +% \DoNotIndex{\@dblarg} +% \DoNotIndex{\@depth} +% \DoNotIndex{\@empty} +% \DoNotIndex{\@firstoftwo} +% \DoNotIndex{\@height} +% \DoNotIndex{\@ifstar} +% \DoNotIndex{\@ifundefined} +% \DoNotIndex{\@m} +% \DoNotIndex{\@makeother} +% \DoNotIndex{\@namedef} +% \DoNotIndex{\@ne} +% \DoNotIndex{\@sanitize} +% \DoNotIndex{\@secondoftwo} +% \DoNotIndex{\@tempdima} +% \DoNotIndex{\@tempdimb} +% \DoNotIndex{\@title} +% \DoNotIndex{\@warning} +% \DoNotIndex{\@whilenum} +% \DoNotIndex{\@width} +% \DoNotIndex{\\} +% \DoNotIndex{\{} +% \DoNotIndex{\}} +% \DoNotIndex{\^} +% \DoNotIndex{\ } +% \DoNotIndex{\addtolength} +% \DoNotIndex{\addvspace} +% \DoNotIndex{\advance} +% \DoNotIndex{\begin} +% \DoNotIndex{\begingroup} +% \DoNotIndex{\bgroup} +% \DoNotIndex{\bigskip} +% \DoNotIndex{\bigskipamount} +% \DoNotIndex{\box} +% \DoNotIndex{\catcode} +% \DoNotIndex{\count@} +% \DoNotIndex{\csname} +% \DoNotIndex{\def} +% \DoNotIndex{\dimen@} +% \DoNotIndex{\divide} +% \DoNotIndex{\do} +% \DoNotIndex{\dotfill} +% \DoNotIndex{\dp} +% \DoNotIndex{\edef} +% \DoNotIndex{\egroup} +% \DoNotIndex{\else} +% \DoNotIndex{\emph} +% \DoNotIndex{\end} +% \DoNotIndex{\endcsname} +% \DoNotIndex{\endgroup} +% \DoNotIndex{\endlist} +% \DoNotIndex{\enskip} +% \DoNotIndex{\enspace} +% \DoNotIndex{\ensuremath} +% \DoNotIndex{\expandafter} +% \DoNotIndex{\f@baselineskip} +% \DoNotIndex{\fbox} +% \DoNotIndex{\fi} +% \DoNotIndex{\footnotesize} +% \DoNotIndex{\gdef} +% \DoNotIndex{\global} +% \DoNotIndex{\hbox} +% \DoNotIndex{\hfil} +% \DoNotIndex{\hfill} +% \DoNotIndex{\hrule} +% \DoNotIndex{\hskip} +% \DoNotIndex{\hspace} +% \DoNotIndex{\hss} +% \DoNotIndex{\ht} +% \DoNotIndex{\if} +% \DoNotIndex{\ifcase} +% \DoNotIndex{\ifdim} +% \DoNotIndex{\ifnum} +% \DoNotIndex{\ifodd} +% \DoNotIndex{\ifx} +% \DoNotIndex{\ignorespaces} +% \DoNotIndex{\item} +% \DoNotIndex{\itemsep} +% \DoNotIndex{\leavevmode} +% \DoNotIndex{\let} +% \DoNotIndex{\list} +% \DoNotIndex{\llap} +% \DoNotIndex{\m@ne} +% \DoNotIndex{\makebox} +% \DoNotIndex{\mbox} +% \DoNotIndex{\medskip} +% \DoNotIndex{\medskipamount} +% \DoNotIndex{\multiply} +% \DoNotIndex{\newcommand} +% \DoNotIndex{\newcount} +% \DoNotIndex{\newcounter} +% \DoNotIndex{\newenvironment} +% \DoNotIndex{\newif} +% \DoNotIndex{\newlength} +% \DoNotIndex{\newpage} +% \DoNotIndex{\newsavebox} +% \DoNotIndex{\newtoks} +% \DoNotIndex{\next} +% \DoNotIndex{\noexpand} +% \DoNotIndex{\noindent} +% \DoNotIndex{\null} +% \DoNotIndex{\number} +% \DoNotIndex{\or} +% \DoNotIndex{\p@} +% \DoNotIndex{\par} +% \DoNotIndex{\parbox} +% \DoNotIndex{\parsep} +% \DoNotIndex{\partopsep} +% \DoNotIndex{\phantom} +% \DoNotIndex{\protect} +% \DoNotIndex{\providecommand} +% \DoNotIndex{\raggedright} +% \DoNotIndex{\relax} +% \DoNotIndex{\renewcommand} +% \DoNotIndex{\rlap} +% \DoNotIndex{\rmfamily} +% \DoNotIndex{\romannumeral} +% \DoNotIndex{\selectfont} +% \DoNotIndex{\setbox} +% \DoNotIndex{\setcounter} +% \DoNotIndex{\setlength} +% \DoNotIndex{\settowidth} +% \DoNotIndex{\sffamily} +% \DoNotIndex{\sloppy} +% \DoNotIndex{\small} +% \DoNotIndex{\smallskip} +% \DoNotIndex{\smallskipamount} +% \DoNotIndex{\space} +% \DoNotIndex{\stepcounter} +% \DoNotIndex{\string} +% \DoNotIndex{\strut} +% \DoNotIndex{\test} +% \DoNotIndex{\textbf} +% \DoNotIndex{\textemdash} +% \DoNotIndex{\textsl} +% \DoNotIndex{\texttt} +% \DoNotIndex{\the} +% \DoNotIndex{\thinspace} +% \DoNotIndex{\tw@} +% \DoNotIndex{\topsep} +% \DoNotIndex{\typeout} +% \DoNotIndex{\undefined} +% \DoNotIndex{\underbar} +% \DoNotIndex{\uppercase} +% \DoNotIndex{\upshape} +% \DoNotIndex{\vadjust} +% \DoNotIndex{\value} +% \DoNotIndex{\vbox} +% \DoNotIndex{\vfil} +% \DoNotIndex{\vfill} +% \DoNotIndex{\vskip} +% \DoNotIndex{\vspace} +% \DoNotIndex{\vss} +% \DoNotIndex{\wd} +% \DoNotIndex{\xdef} +% \DoNotIndex{\z@} +% \DoNotIndex{\z@skip} +% +% \begin{abstract} +% This article describes the use and the implementation of the +% \emph{exam class}. +% Its purpose is the typesetting of exams. +% Exam questions can be multiple choice or free long\slash short +% answer questions. +% Options are the typesetting of the exam itself, an exam +% showing all the answers and a collection of questions and answers. +% Questions can be parametrized. +% Use of a random generator provides for automatic shuffling +% of multiple choice items. +% \end{abstract} +% +% \tableofcontents +% +% \section{Usage} +% +% \subsection{Exam production} +% +% An exam can be built from the following template. +% For special issues as the use of default names for +% various directories, language selection, etc. see +% the implementation section. +% +% You may customize the typesetting by providing +% a file \emph{exam.cfg} in the search path; this file +% is read just before typesetting begins. +% The example of this file gives a language customization +% and an implementation for a title page. +% +% \medskip\noindent +% \DescribeEnv{exam} +% |\documentclass[options]{exam}|\\ +% |\title{title of exam}|\\ +% |\author{the examinator}|\\ +% |\target{the students}|\\ +% |\begin{document}|\\ +% |\begin{exam}[startvalue random generator]{date of exam}|\\ +% |\question{directory}{file}|\\ +% |\question[parameter value]{directory}{file}|\\ +% |....|\\ +% |\end{exam}|\\ +% |... % possibly other exams|\\ +% |\end{document}| +% +% \subsection{Format of a problem} +% +% \DescribeEnv{problem} +% A problem is built by environment |problem|. +% In it several elements can be placed. These are: +% \begin{enumerate} +% \item \DescribeMacro{\parameterproblem} +% |\parameterproblem{text}|: used to communicate to the +% maintainer of the problems the possibilities offered +% by the transfer of macro |\parameter| on posing +% the question; an example of this will follow. +% Can also find a place before the problem declaration. +% \item |\begin{problem}[#1]|; the optional parameter +% can have the value |\compact| (no pagebreak within problem, default) +% or the value |\split| (pagebreak may occur in problem). +% \item |\problemdate{date}|: a macro to remember on which +% day the problem was born; +% \item \DescribeMacro{\score} +% |\score{value}|: use this macro for the number of +% points the answer is worth; it is possible to include +% several score items in one problem for partial rewards. +% The score value is not shown when an exam is typeset, +% the student must earn these points! +% \item text of the question. +% \item the answer or multiple choice list; +% see the description below. +% \item |\remark[h]{b}|: a boxed remark with heading h and body b. +% \item |\end{problem}|. +% \end{enumerate} +% +% \subsection{Examples of Question and Typesetting} +% +% \subsubsection{Simple Problem} +% +% \begin{center} +% \textbf{problem --- coding} +% \end{center} +% \medskip +% |\begin{problem}|\\ +% |\problemdate{\today}|\\ +% |What is the question?|\\ +% |\score{2}|\\ +% |\shortanswer{To be or not to be.}|\\ +% |\end{problem}| +% +% \medskip +% \DescribeMacro{\question} +% This problem is called up with\\ +% |\question{}{exampa}|\\ +% which we show without |answers| option and with both the |answers| and +% |series| option set. +% \begin{center} +% \textbf{problem --- result --- without answers} +% \end{center} +% \medskip +% \begin{center} +% \begin{minipage}{.9\linewidth}\setlength\linewidth{.8\linewidth} +% \answersfalse +% \MakePercentComment\question{}{exampa}\MakePercentIgnore +% \end{minipage} +% \end{center} +% \medskip +% \begin{center} +% \textbf{problem --- result --- with answers} +% \end{center} +% \medskip +% \begin{center} +% \begin{minipage}{.9\linewidth}\setlength\linewidth{.8\linewidth} +% \answerstrue\seriestrue +% \addtocounter{problemnum}{-1} +% \MakePercentComment\question{}{exampa}\MakePercentIgnore +% \end{minipage} +% \end{center} +% +% \subsubsection{Parametrized Problem} +% +% \DescribeMacro{\parameter} +% The next example shows the use of |\parameter| for the selection +% of alternate questions. It is given both value 1 and 2 and called +% with respectively:\\ +% |\question[1]{}{exampb}|\\ +% |\question[2]{}{exampb}|\\ +% However, remember that |\parameter| can be defined to anything; +% e.g. the number that goes into a calculation, a word substituted +% at a specific place, etc. +% +% \medskip +% \begin{center} +% \textbf{parameterproblem --- coding} +% \end{center} +% \medskip +% |\parameterproblem{1= to be\\2= not to be}|\\ +% |\problemdate{\today}|\\ +% |\begin{problem}|\\ +% |\score{2}|\\ +% |What is\ifnum\parameter=1\relax \else n't\fi\ the question?|\\ +% |\shortanswer{\ifnum\parameter=1\relax To be or n\else N\fi ot to be.}|\\ +% |\end{problem}| +% \medskip +% \begin{center} +% \textbf{parameterproblem --- result --- parameter = 1} +% \end{center} +% \medskip +% \begin{center} +% \begin{minipage}{.9\linewidth}\setlength\linewidth{.8\linewidth} +% \answerstrue\seriestrue +% \MakePercentComment\question[1]{}{exampb}\MakePercentIgnore +% \end{minipage} +% \end{center} +% \medskip +% \begin{center} +% \textbf{parameterproblem --- result --- parameter = 2} +% \end{center} +% \medskip +% \begin{center} +% \begin{minipage}{.9\linewidth}\setlength\linewidth{.8\linewidth} +% \answerstrue\seriestrue +% \addtocounter{problemnum}{-1} +% \MakePercentComment\question[2]{}{exampb}\MakePercentIgnore +% \end{minipage} +% \end{center} +% +% \subsection{Answers} +% \DescribeMacro{\answer} +% \DescribeMacro{\altanswer} +% The basic macros for showing and suppressing answers are +% |\answer| that shows its argument when the \emph{answers} +% option is chosen, and |\altanswer| that alternates its +% two arguments. Both macros have a first, optional argument +% for specifying the width of the box wherein the text +% is placed. +% +% \medskip +% \begin{center} +% \textbf{answer --- coding} +% \end{center} +% \medskip +% |\answer{answer}| +% +% \medskip +% \begin{center} +% \textbf{answer --- result --- +% left without, right with answers} +% \end{center} +% \medskip +% \begin{center} +% \fbox{\parbox[t]{.4\linewidth}{\strut\answersfalse +% \answer{answer} +% }}\qquad\fbox{\parbox[t]{.4\linewidth}{\strut\answerstrue +% \answer{answer}}} +% \end{center} +% +% \medskip +% \begin{center} +% \textbf{altanswer --- coding} +% \end{center} +% \medskip +% |\altanswer{answer NO}{answer YES}| +% +% \medskip +% \begin{center} +% \textbf{altanswer --- result --- +% left without, right with answers} +% \end{center} +% \medskip +% \begin{center} +% \fbox{\parbox[t]{.4\linewidth}{\strut\answersfalse +% \altanswer{answer NO}{answer YES} +% }}\qquad\fbox{\parbox[t]{.4\linewidth}{\strut\answerstrue +% \altanswer{answer NO}{answer YES}}} +% \end{center} +% +% \DescribeMacro{\shortanswer} +% Some questions can be answered by a few words, a short sentence. +% The command |\shortanswer| serves this purpose; +% its argument is the answer. +% +% \medskip +% \begin{center} +% \textbf{short answer --- coding} +% \end{center} +% |\shortanswer{The answer.}| +% +% \medskip +% \begin{center} +% \textbf{short answer --- result --- +% left without answers, right with answers} +% \end{center} +% \medskip +% \begin{center} +% \renewcommand*\shortwhite{2mm} +% \fbox{\parbox[t]{.4\linewidth}{\answersfalse +% Answer the next question: +% \shortanswer{The answer.}}} +% \qquad +% \fbox{\parbox[t]{.4\linewidth}{\answerstrue +% Answer the next question: +% \shortanswer{The answer.}}} +% \end{center} +% +% \DescribeEnv{longanswer} +% When however more space is needed by the student, the +% environment |longanswer| can be used. +% This environment has one optional parameter, meant +% for specifying the amount of white space to be reserved +% for the students answer. +% +% \medskip +% \begin{center} +% \textbf{long answer --- coding} +% \end{center} +% \medskip +% |\begin{longanswer}[5mm]|\\ +% |The answer.|\\ +% |\end{longanswer}| +% +% \medskip +% \begin{center} +% \textbf{long answer --- result --- +% left without answers, right with answers} +% \end{center} +% \medskip +% \begin{center} +% \fbox{\parbox[t]{.4\linewidth}{\answersfalse +% Answer the next question: +% \begin{longanswer}[5mm] +% The answer. +% \end{longanswer}}} +% \qquad +% \fbox{\parbox[t]{.4\linewidth}{\answerstrue +% Answer the next question: +% \begin{longanswer}[5mm] +% The answer. +% \end{longanswer}}} +% \end{center} +% +% \DescribeMacro{\answerstart} +% The answer is headed by a call to |\answerstart|; redefine +% to your taste. +% +% \DescribeMacro{\shortwhite} +% \DescribeMacro{\longwhite} +% The default of white space reserved for the depth of the short answer +% can be changed by redefinition of |\shortwhite|. +% The default for the white space of the long answer +% can be changed by redefinition of |\longwhite|. +% +% \subsection{Multiple Choice} +% +% \DescribeEnv{choice} +% Multiple choice is provided for by environment |choice|. +% Within this environment a itemized list of alternatives is given. +% \DescribeMacro{\baditem} +% \DescribeMacro{\gooditem} +% However instead of |\item| one codes |\baditem{text}| for wrong answers +% and |\gooditem{text}| for the correct one; the answer being put +% into the argument of these two macros. +% \DescribeMacro{\ordered} +% \DescribeMacro{\random} +% The optional parameter of this environment can be |\ordered| for +% production of the alternatives in the order specified, or +% |\random| for randomization; randomize is the default, unless +% the \emph{series} option is specified in the |\documentclass| call. +% +% \medskip +% \begin{center} +% \textbf{multiple choice example --- coding} +% \end{center} +% \medskip +% |\begin{choice}[\ordered]|\\ +% |\baditem{first wrong answer}|\\ +% |\gooditem{the right answer}|\\ +% |\baditem{second wrong answer}|\\ +% |\end{choice}| +% +% \medskip +% \begin{center} +% \textbf{multiple choice --- result --- +% left without answers, right with answers} +% \end{center} +% \medskip +% \begin{center} +% \fbox{\parbox[t]{.4\linewidth}{\answersfalse +% Choose appropriate alternative: +% \begin{choice}[\ordered] +% \baditem{first wrong answer} +% \gooditem{the right answer} +% \baditem{2nd wrong answer} +% \end{choice}}} +% \qquad +% \fbox{\parbox[t]{.45\linewidth}{\answerstrue +% Choose appropriate alternative: +% \begin{choice}[\ordered] +% \baditem{first wrong answer} +% \gooditem{the right answer} +% \baditem{2nd wrong answer} +% \end{choice}}} +% \end{center} +% +% \DescribeMacro{\badmark} +% \DescribeMacro{\goodmark} +% The marks for the multiple choice items are produced +% by the macros |\badmark| and |\goodmark|. For their +% redefinition see the implementation section of this +% document. +% +% \subsection{Shuffling it Yourself} +% +% \DescribeMacro{\loaditem} +% The selection of alternatives is implemented by the +% mechanism in macros |\loaditem| and friends. +% Pieces text can be loaded (in this implementation at most 5) and +% selectively dumped into the typeset input stream. +% It is a useful mechanism when one has to produce +% a whole series of variations on the same theme. +% +% Macro |\loaditem| can be used to load from one to five +% items in a data store. +% \DescribeMacro{\shuffle} +% This data store can be shuffled +% by a call to |\shuffle|. +% \DescribeMacro{\dumpitem} +% \DescribeMacro{\dumpitems} +% Popping items from the store +% is effected by macros |\dumpitem| (pop one item) and +% |\dumpitems| (all items). Clearing of the store +% is done by |\resetloadcounter|. +% \DescribeMacro{\SRtest} +% With |\SRtest{1}{2}| one can make a random choice between two +% alternatives. +% +% \medskip +% \begin{center} +% \textbf{load and dump --- coding} +% \end{center} +% \medskip +% |\SRset{349} % start random generator|\\ +% |\resetloadcounter % initialize load stack|\\ +% |\loaditem{\fbox{item 1}\space} % load 4 items of text|\\ +% |\loaditem{\fbox{item 2}\space}|\\ +% |\loaditem{\fbox{item 3}\space}|\\ +% |\loaditem{\fbox{item 4}\space}|\\ +% |Here comes nr~2: \dumpitemno{2} % dump 2nd item|\\ +% |\par|\\ +% |\shuffle % randomize|\\ +% |Here nr~2 again after randomization: \dumpitemno{2}|\\ +% |\par|\\ +% |Dump the whole lot: \dumpitems| +% +% \medskip +% \begin{center} +% \textbf{load and dump --- result} +% \end{center} +% \medskip +% \begin{center} +% \parbox[t]{.8\linewidth}{% +% \SRset{349} +% \resetloadcounter +% \loaditem{\fbox{item 1}\space} +% \loaditem{\fbox{item 2}\space} +% \loaditem{\fbox{item 3}\space} +% \loaditem{\fbox{item 4}\space} +% Here comes nr~2: \dumpitemno{2}\par +% \shuffle +% Nr~2 after randomization: \dumpitemno{2}\par +% Dump the whole lot: \dumpitems +% } +% \end{center} +% +% +% \section{Summary of Options and Macros} +% +% \subsection{Options} +% +% \begin{flushleft}\sloppy +% |answers| problems with answers\\ +% |pages| each problen on a separate page\\ +% |questiononly| suppress open space for answers\\ +% |nosep| suppress separation between successive problems\\ +% |scores| add score values\\ +% |series| produce problem collection +% \end{flushleft} +% +% \subsection{Exam Production} +% +% \begin{flushleft}\sloppy +% |\target{name}| exam meant for these people\\ +% |\begin{exam}[randomstart]{date}...\end{exam}| dated exam\\ +% |\begin{exam}{date}...\end{exam}| randomstart=0, i.e. not random\\ +% |\begin{exam}{}...\end{exam}| today's date\\ +% |\question[variant]{dir}{file}| call problem variant from dir/file\\ +% |\question{dir}{file}| no problem variants +% \end{flushleft} +% +% \subsection{Problem Definition} +% +% \begin{flushleft}\sloppy +% |\parameterproblem[param]{explication}| set default, show explication\\ +% |\begin{problem}...\end{problem}| problem definition, kept wholly on page\\ +% |\begin{problem}[\split]...\end{problem}| do not confine to one page\\ +% |\problemdate{date}| reference date for problem\\ +% |\score{value}| set problems worth in points\\ +% |\remark[label]{text}| place remark if series option\\[\smallskipamount] +% |\answer[width]{answer}| coding in an answer\\ +% |\altanswer[width]{alt}{answer}| alternate text instead of answer\\ +% |\shortanswer{answer}| short answer or row of dots\\ +% |\begin{longanswer}[height]...\end{longanswer}| long answer or space\\[\smallskipamount] +% |\begin{choice}...\end{choice}| randomly permuted multiple choice\\ +% |\begin{choice}[\ordered]...\end{choice}| not permuted\\ +% |\baditem{text}| inside a |choice| text for false item\\ +% |\gooditem{text}| ditto for good item\\[\smallskipamount] +% |\loaditem{anything}| put `anything' to memory stack\\ +% |\dumpitem| pop top from memory stack\\ +% |\dumpitems| pop whole memory stack\\ +% |\shuffle| randomize memory stack +% +% \end{flushleft} +% +% \subsection{Styling and Customization} +% +% \begin{flushleft}\sloppy +% |\everyproblem| token register executed at start of each problem\\ +% |\scoreboxsize{size}| set size of square score box\\ +% |\shortwhite| default vertical space short answers, change |\renewcommand|\\ +% |\longwhite| ditto for long answers\\ +% |\marksize| size of multiple choice marks, |\selectfont| expression\\ +% |\badmark| symbol for multiple choice item box\\ +% |\goodmark| ditto for the good one\\ +% |\headerfont| font for page header\\ +% |\bodyfont| font for exam text\\ +% |\titlefont| font for titles\\ +% |\Mainfolder{dir}| set |\mainfolder| to dir\\ +% |\Commonfolder{dir}| set |\commonfolder| to dir\\ +% |\Figuresfolder{dir}| set |\figuresfolder| to dir +% \end{flushleft} +% +% \StopEventually{\PrintChanges} +% +% \newpage +% \begin{macrocode} +%<*cls> +% \end{macrocode} +% +% \section{Identification} +% +% This document class can only be used with \LaTeXe, so we make +% sure that an appropriate message is displayed when another \TeX{} +% format is used. We require the latest version that has no known +% troubles with this class. +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +% \end{macrocode} +% +% Announce the Class name and its version. +% \begin{macrocode} +\ProvidesClass{exam}[1997/03/14 vs 3.30 exam package] +% \end{macrocode} +% +% \section{Declaration of Class Options} +% +% In this part we define the options for this class that are additional +% to those of its parent class. +% +% \subsection{Switching answers on and off} +% +% \begin{macro}{\ifanswers} +% The flag |\ifanswers| governs the production of answers in the +% typesetting of problems. With the |answers| options in the +% optional argument of the document class this option is turned on. +% Then also we show the score values. +% +% \begin{macrocode} +\newif\ifanswers +\answersfalse +\DeclareOption{answers}{\answerstrue\scorestrue} +% \end{macrocode} +% \end{macro} +% +% \subsection{Each problem on separate page} +% +% \begin{macro}{\ifproblempages} +% The flag |\ifproblempages| governs the typesetting of problems +% on separate pages, or their collection of more than one to a page. +% If separate pages are chosen, a separator between problems +% is unnecessary. +% +% \begin{macrocode} +\newif\ifproblempages +\problempagesfalse +\DeclareOption{pages}{\problempagestrue\problemsepfalse} +% \end{macrocode} +% \end{macro} +% +% \subsection{Suppress prompt for answer} +% +% \begin{macro}{\ifreservespace} +% The flag |\ifreservespace| governs the typesetting of space +% for answers. If true, all reservation of answer space is +% suppressed. It is set by option |questiononly|; +% this option has no effect when the |answers| option is on. +% +% \begin{macrocode} +\newif\ifreservespace +\reservespacetrue +\DeclareOption{questiononly}{\reservespacefalse} +% \end{macrocode} +% \end{macro} +% +% \subsection{Visible separation between problems} +% +% \begin{macro}{\ifproblemsep} +% The value of flag |\ifproblemsep| determines the appearance +% of a visible separation between successive problems. +% +% \begin{macrocode} +\newif\ifproblemsep +\problemseptrue +\DeclareOption{nosep}{\problemsepfalse} +% \end{macrocode} +% \end{macro} +% +% \subsection{Showing score values} +% +% \begin{macro}{\ifscores} +% The flag |\ifshowscores| determines when score values are printed. +% +% \begin{macrocode} +\newif\ifscores +\scoresfalse +\DeclareOption{scores}{\scorestrue} +% \end{macrocode} +% \end{macro} +% +% \subsection{Typeset a Catalogue of Problems} +% +% \begin{macro}{\ifseries} +% The flag |\ifseries| initiates the production of a problem catalogue. +% In order to show answers and score values, the respective flags are set. +% +% \begin{macrocode} +\newif\ifseries +\seriesfalse +\DeclareOption{series}{\seriestrue\answerstrue\scorestrue} +% \end{macrocode} +% \end{macro} +% +% \subsection{Show Options} +% +% Show options to the user with option |help|. +% +% \begin{macrocode} +\DeclareOption{help}{\ClassWarningNoLine{exam}{% + available options for exam:\MessageBreak + answers:\space show questions with answers;\MessageBreak + nosep:\space no separators between problems;\MessageBreak + pages:\space each problem on a page;\MessageBreak + questiononly:\space suppress answer space in exams;\MessageBreak + scores:\space typeset score values always;\MessageBreak + series:\space\space typeset catalogue of problems}} +% \end{macrocode} +% +% \section{Loading of Parent Class} +% +% Since the \emph{exam class} is implemented as a modification +% of an existing document class, we must load the parent class. +% \begin{macro}{\parentclass} +% In order to make changes in parent class easy, the +% name of this class is parametrized in macro |\parentclass|. +% Obvious candidates are \emph{article} and \emph{report}. +% In order to provide some flexibility, we allow for the case +% that the user has already defined |\parentclass| (before +% the call to |\documentclass|. In that case we refrain +% from redefinition. +% +% \begin{macrocode} +\providecommand\parentclass{article} +% \end{macrocode} +% \end{macro} +% +% The options of the |\documentclass| call which are not specific for the +% \emph{exam class} must be passed to the parent class. +% We take the opportunity to select the production of a titlepage +% (not automatically added if the parent class is \emph{article}. +% After this we process the local options. +% +% \begin{macrocode} +\DeclareOption*{\PassOptionsToClass{\CurrentOption}{\parentclass}} +\PassOptionsToClass{titlepage}{\parentclass} +\ProcessOptions +% \end{macrocode} +% +% Then we load the parent class. +% +% \begin{macrocode} +\LoadClass{\parentclass} +% \end{macrocode} +% +% A table of contents can be produced when a series is run or when +% producing an exam including answers, otherwise kill the +% corresponding macro. +% +% \begin{macrocode} +\ifseries\else\ifanswers\else\let\tableofcontents=\relax\fi\fi +% \end{macrocode} +% +% \section{Helpfull Macros} +% +% \begin{macro}{\@ifemptyarg} +% Testing for the presence or absence of a parameter. +% +% \begin{macrocode} +\providecommand\@ifemptyarg[1]{% {absence}{presence} + \ifx\@empty#1\@empty + \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\examerror} +% \begin{macro}{\examwarning} +% Define |\examerror| and |\examwarning| to issue proper +% warnings in case of errors. +% Note that the error macro provides for a help text in its +% second argument. +% +% \begin{macrocode} +\newcommand*\examerror[2]{\ClassError{exam}{!!!! #1}{#2}} +\newcommand*\examwarning[1]{\ClassWarning{exam}{!!!! #1}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \section{Produce an Exam} +% +% \begin{macro}{\examnum} +% First we need a counter for exams, since in one run more than +% one exam can be produced. +% By stepping this counter we will effect the automatic reset of +% the counter that numbers the problems and +% the counter that remembers the score value. +% +% \begin{macrocode} +\newcounter{examnum} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{exam} +% Exams are produced within the |exam| environment. This environment takes +% 2 parameters. The first one is optional and provides the initial value +% of the random generator.\footnote{Not used when a series +% is run.} The default is 0, which effectively shuts off randomness. +% The second parameter must be present, but can be empty. +% It fixes the date for which the exam is planned; an empty argument +% fills in the current date. +% +% \begin{macrocode} +\newenvironment{exam}[2][0]{% + \stepcounter{examnum}% + \@ifemptyarg{#2}{}{\date{#2}}% +% \end{macrocode} +% +% When answers are requested we start with a titlepage.\footnote{% +% If not inhibited by the |notitlepage| option.} +% In the case of exam production, typesetting of the titlepage +% is deferred to the end of the exam, +% so that we may print on it the number of problems. +% We write a few messages to the table of contents (date and initial +% value of the random generator) when an exam with answers +% is in production. +% Disable the random generator for a series. +% +% \begin{macrocode} + \ifanswers + \pagenumbering{roman}% + \maketitle\newpage\mbox{}\newpage + \fi + \pagenumbering{arabic}% + \ifseries\SRset{0}\else + \SRset{#1}% + \addtocontents{toc}{\protect\contentsline{section}% + {\Exam~\theexamnum~\textemdash~\@date~% + \textemdash~random start #1}{}}% + \fi +% \end{macrocode} +% +% In each separate exam the first page gets the number one. +% +% \begin{macrocode} + \setcounter{page}{1}}% +% \end{macrocode} +% +% At the end of the exam produced for the students +% a titlepage is made. If answers are given for the exam +% we also provide the total of the scores. +% +% \begin{macrocode} + {\ifseries\else + \typeout{Total value scores = \thetotalscore}% + \ifanswers + \addtocontents{toc}{\protect\contentsline{section}% + {Total value scores = \thetotalscore}{}}% + \else\maketitle + \fi\fi} +% \end{macrocode} +% \end{environment} +% +% \section{Choosing Problems} +% +% \begin{macro}{\problemnum} +% We start with a counter |\problemnum| with which the problems +% of the exam are neatly numbered. This counter is automatically +% reset each time a new |exam| environment is entered. +% \begin{macro}{\problemid} +% A textual identification of the current problem is collected +% in token register |\problemid|. +% +% \begin{macrocode} +\newcounter{problemnum}[examnum] +\newtoks\problemid +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\question} +% \textbf{Each question must reside in its own file} which is called up +% by macro |\question|. Of its three parameters the first is +% optional and provides a means of communication with the +% problem itself. To achieve this the first +% argument of |\question| is cached +% in macro |\parameter|.\footnote{As most uses of this mechanism +% boil down to a choice between several alternatives, the +% number~1 is provided by macro {\ttfamily\protect\bslash parameterproblem} +% as a convenient default value. See also the discussion +% under the heading ``Parametrized Problems''.} +% The default behaviour here is not touching the +% definition of |\parameter| in case of an empty argument; +% in many cases a forgotten argument will then lead to +% a ``missing something'' error. The benefit of not +% touching |\parameter| in case of an empty argument +% is that this macro now also can be initialized by +% other means, e.g. by definition earlier in the problem coding. +% +% The second parameter of |\question| is the name of the (sub)directory +% where the file named in the third parameter can be found. +% This second parameter doubles up as section name in the +% series production.\footnote{It is silently assumed +% that all problems of a given category reside in a common +% directory.} +% +% \begin{macrocode} +\newcommand*\question[3][]{% + \@ifemptyarg{#1}{}{\renewcommand\parameter{#1}}% +% \end{macrocode} +% +% When a series is run we look for the start of a new section and +% perform the appropriate actions if indeed a new section is found. +% I.e.\ eject the page and then reset the section name +% and the problem counter. +% Note the use of uppercase in order to smooth out differences in typing. +% The identification of the problem is set to its file name and, +% in the case of a series, is mentioned in the output. +% Then the problem number is incremented. +% +% \begin{macrocode} + \ifseries + \uppercase{\def\@namesection{#2}}% + \ifx\namesection\@namesection + \else + \newpage + \global\let\namesection=\@namesection + \addcontentsline{toc}{subsection}{\namesection}% + \setcounter{problemnum}{0}% + \fi + \fi + \problemid={\MakeUppercase{#3}}% + \ifseries + \noindent\underbar{\emph{File\,:}~\texttt{\the\problemid}}\par + \nopagebreak\medskip\nopagebreak + \fi + \stepcounter{problemnum}% +% \end{macrocode} +% +% If appropriate a summary of this problem is written to the table of contents. +% +% \begin{macrocode} + \ifanswers + \addcontentsline{toc}{subsection}% + {\hbox to1cm{\theproblemnum:\hss}#3}% + \fi +% \end{macrocode} +% +% Reading of the problem itself is surrounded by calculations +% on the score that this question will bring. +% Scores are mentioned on the console except when a series is run. +% In a problem all contributions from the various parts of the +% problem are collected in counter |scorecounter|. +% At the end of the problem |totalscore| is +% updated with this value.\footnote{% +% Note the resets for |totalscore| with |examnum| +% and |scorecounter| with |problemnum| in their declaration.} +% The code guards against typing errors in the name of the file. +% +% \begin{macrocode} + \edef\@curquestion{\mainfolder\@ifemptyarg{#2}{}{#2\@currdir}#3}% + \IfFileExists{\@curquestion}{\@@input \@curquestion}% + {\examwarning{File \@curquestion: not found}}% + \ifseries\else + \addtocounter{totalscore}{\value{scorecounter}}% + \typeout{\Problem\space\theproblemnum: score=\thescorecounter}% + \fi + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{namesection} +% Macro |\namesection| gets its initial value here: +% +% \begin{macrocode} +\newcommand*\namesection{\Collection} +% \end{macrocode} +% \end{macro} +% +% \subsection{Parametrized Problems} +% +% \begin{macro}{\reset@parameter} +% A parametrized problem gets its parameter from the first +% argument of macro |\question|, as already have been mentioned. +% This is effected by definition of macro |\parameter| to +% the value of that argument. +% We add code here to (re)initialize this macro. +% +% \begin{macrocode} +\newcommand*\reset@parameter{\gdef\parameter{}} +\reset@parameter +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\parameterproblem} +% The first argument of |\parameterproblem| is optional and +% sets a default by for |\parameter|; +% set to the number~1 if not explicitely given. +% It is recommended that |\parameterproblem| is placed +% before the first use of |\parameter| or even before the +% |\begin{problem}|. +% Furthermore, in typesetting an exam this macro will print a warning +% if |\parameter| has not been set on the |\question| call. +% +% |\parameterproblem| will typeset its second argument in a framed box. +% Usually this tells the reader which selections are available; however, +% only in the case a series is run, otherwise `silence' is the word. +% The description is placed by macro |\remark| which does the +% necessary suppression. +% +% \begin{macrocode} +\newcommand\parameterproblem[2][1 ]{% + \ifx\parameter\@empty + \ifseries\else\examwarning{\string\parameter\space set to `#1'}\fi + \renewcommand\parameter{#1}% + \fi + \remark[Parameter \Problem]{#2}} +% \end{macrocode} +% \end{macro} +% +% +% \section{Typesetting a Problem} +% +% Each problem must be enclosed in an environment |problem|. +% Within this environment a default setup exists. +% \begin{macro}{\everyproblem} +% By supplying code in token register |\everyproblem| one +% can influence the typesetting of each problem. +% +% \begin{macrocode} +\newtoks\everyproblem +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{problem} +% The |problem| environment also has one optional parameter +% for specific adjustments of the options setting. +% Execution of options occurs in the order: +% default setup, possible modification by |\everyproblem| and +% final customization through the optional parameter. +% This mechanism provides for maximum flexibility. +% +% \begin{macrocode} +\newenvironment{problem}[1][]{% +% \end{macrocode} +% +% Choose by default for keeping the whole problem on a page, +% execute any code in the token register and honor the +% option calls from the user. +% +% \begin{macrocode} +\compact\the\everyproblem#1\relax +% \end{macrocode} +% +% In order to keep everything on page we will enclose +% the problem in a |\vbox|, coded in +% macro |\@boxing|. Otherwise |\@boxing| is a noop and +% \TeX's pagebuilder can choose its breakpoint freely. +% For the declaration of |\@boxing| see section~\ref{ref:boxing}. +% +% The problem is typeset with a standard opening +% programmed in |\problemstart|, completing the +% opening manoeuvres of the environment. +% +% \begin{macrocode} + \@boxing\bgroup\noindent\problemstart\ignorespaces}% +% \end{macrocode} +% +% After processing the body of the problem some postprocessing follows +% and the possible |\vbox| is closed by an |\egroup|. +% +% In particular a visual separation from the next problem is added, +% if not suppressed. +% In the case of series production the origin date +% of the problem is added too.\footnote{Only if it has been +% provided to it by the proper macro call, of course.} +% +% \begin{macrocode} + {\par\ifproblemsep + \nopagebreak\smallskip\nopagebreak + \hbox to\linewidth{\hrulefill + \ifseries + \emph{\footnotesize\thinspace\the\@problemdate}% + \fi}\fi + \egroup\par +% \end{macrocode} +% +% Start a new page or separate the problem from the next one by a skip. +% +% \begin{macrocode} + \ifproblempages\newpage\else\bigskip\fi +% \end{macrocode} +% +% The origin date and the communicated value +% in macro |\parameter| are cleared for the next problem. +% +% \begin{macrocode} + \reset@problemdate\reset@parameter} +% \end{macrocode} +% \end{environment} +% +% \subsection{Code for Options to Problem} +% \label{ref:boxing} +% +% \begin{macro}{\compact} +% \begin{macro}{\split} +% The options to |problem| are |\compact| or |\split|. +% These options govern the possibility for the problem +% to be split between successive pages or the necessity +% to keep everything on page; the last one being the +% favoured behaviour in this implementation. +% Note the |\noident| before the |\vbox| that prevents +% an unwanted shift to the right. +% +% \begin{macrocode} +\newcommand*\compact{\def\@boxing{\noindent\vbox}} +\newcommand*\split{\def\@boxing{}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \subsection{Numbering the Problem} +% +% \begin{macro}{\problemstart} +% \begin{macro}{\@problemstart} +% A problem gets a standard opening clause, coded in +% macro |\@problemstart|. The opening code is used to +% format the first paragraph with a nice indentation.\footnote{% +% This indentation is also used in the left margin in multiple +% choice listings in order to limit the variation in margins.} +% +% \begin{macrocode} +\newcommand*\problemstart{% + \hangafter-2\settowidth\hangindent{\@problemstart}% + \noindent\llap{\@problemstart}} +\newcommand*\@problemstart{% + \textbf{\Problem\,\ifnum\value{problemnum}<10 \phantom{0}\fi + \theproblemnum}.\enskip} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Date of Origin} +% +% \begin{macro}{\@problemdate} +% \begin{macro}{\problemdate} +% \begin{macro}{\@resetproblemdate} +% The user may specify an original date or date of last change +% for the problem to be printed when a series is produced. +% The global assignments are here just in case things happen in +% a deeper nested level. +% +% \begin{macrocode} +\newtoks\@problemdate +\newcommand*\problemdate[1]{\global\@problemdate={#1}\ignorespaces} +\newcommand*\reset@problemdate{\global\@problemdate={}} +\reset@problemdate +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Score Values} +% +% Associated with each problem are of course the benefits the +% student receives for a good answer to (part of) the problem. +% \begin{macro}{\score} +% The |\score| macro exists for this purpose. +% If answers are not included, just an empty square is printed +% into which the teacher can express his satisfaction with +% the answer given. When answers are included in the printout +% the each call |\score{value}| shows up in the right margin +% of the document.\footnote{At the end of each problem a summary +% of its total score plus a grand total are presented +% on the console.} +% +% \begin{macro}{\totalscore} +% \begin{macro}{\scorecounter} +% These counters collect the values. Note that |\totalscore| +% is reset for each new exam and |\scorecounter| for each problem. +% +% \begin{macrocode} +\newcounter{totalscore}[examnum] +\newcounter{scorecounter}[problemnum] +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\scoreboxsize} +% \begin{macro}{\scorebox} +% The next commands are used for the production of the box +% for the score value. +% +% \begin{macrocode} +\newcommand*\scoreboxsize{6mm} +\newcommand*\scorebox[1]{% + \fbox{\vbox to\scoreboxsize{\vss\hbox to + \scoreboxsize{\hss#1\hss}\vss}}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% Finally the next code puts the score box on paper. +% It takes the value of the score as its argument and adds +% it to the running sum for this problem. +% +% \begin{macrocode} +\newcommand*\score[1]{% + \addtocounter{scorecounter}{#1}% + \rightnote{\scorebox{\ifscores#1\fi}}% + \ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\leftnote} +% \begin{macro}{\rightnote} +% We do not use |\marginpar| for the placement of the score values, +% because we do not want these items wandering around, as +% |\marginpar|'s sometimes do. +% +% \begin{macro}{\@rlnote}\mbox{} +% \begin{macrocode} +\providecommand\leftnote{\@rlnote l} +\providecommand\rightnote{\@rlnote r} +\providecommand\@rlnote[2]{% + \leavevmode\noindent + \vadjust{\vbox to\z@{% + \leftskip\z@skip\rightskip\z@skip + \noindent + \if#1l\llap{#2\hskip\marginparsep}% + \else\hfill\rlap{\null\hskip\marginparsep\relax#2}\fi + \vss\vskip\z@skip + }}\ignorespaces} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Adding remarks} +% +% In making a catalogue of problems (option \emph{series} selected) +% it is useful when remarks can be added that stand out against the rest +% of the text. +% \begin{macro}{\remark} +% Macro |\remark| provides such a mechanism. +% Its first (optional) argument is set emphasized, its second argument +% hangs on the first. The complete remark is placed +% in a |\parbox| and then boxed and centered. +% +% \begin{macrocode} +\newcommand\remark[2][]{% + \ifseries + \begin{center}% + \fbox{\parbox{.9\linewidth}{% + \sloppy\hangafter\@ne + \sbox\@tempboxa{\emph{#1}\@ifemptyarg{#1}{}{:~}}% + \hangindent=\wd\@tempboxa + \strut\usebox{\@tempboxa}#2}}% + \end{center}% + \nopagebreak\addvspace{\bigskipamount}\nopagebreak + \fi} +% \end{macrocode} +% \end{macro} +% +% \section{Answers} +% +% In this section various ways of typesetting answers are provided. +% +% \begin{macro}{\longwhite} +% \begin{macro}{\shortwhite} +% We start with two definitions for long and short stretches of white +% space. These are meant for leaving room for the students answer. +% +% \begin{macrocode} +\newcommand*\longwhite{25mm} +\newcommand*\shortwhite{8mm} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\answerstart} +% Just as with the typesetting of the problem, we provide +% a macro to start an answer. Note that the text is +% parametrized in order to keep switching to other +% languages simple. +% +% \begin{macrocode} +\newcommand*\answerstart{\noindent\emph{\Answer}:\enspace} +% \end{macrocode} +% \end{macro} +% +% \subsection{Switching Answer On and Off} +% +% \begin{macro}{\answer} +% Macro call |\answer| holds the answer and shows it when +% answers are requested. The optional first argument specifies +% a width for the box into which the typesetting takes places. +% The answer is centered by default; change it with |\hfil|'s. +% Implementation of |\answer| is by the next macro |\altanswer|. + +% \begin{macrocode} +\newcommand*\answer[2][]{\altanswer[#1]{}{#2}} +% \end{macrocode} +% \end{macro} +% +% \subsection{Alternating Some Stuff and Answer} +% +% \begin{macro}{\altanswer} +% With |\altanswer| the text alternates between two possibilities: +% the first one is typeset when answers are suppressed, the second +% one for the opposite case. Optional width argument and placement +% are the same as for |\answer|. +% +% \begin{macrocode} +\newcommand*\altanswer[3][]{% + \@ifemptyarg{#1}% + {\mbox{\ifanswers#3\else#2\fi}}% + {\makebox[#1]{\ifanswers#3\else#2\fi}}% + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Problem with a Short Answer} +% +% \begin{macro}{\shortanswer} +% A question ``Give a short answer to \ldots'' is formatted +% in |\shortanswer|. Usually the answer will fit on one line. +% In the exam a row of dots is produced, otherwise the answer will show. +% The optional argument provides the width of the box into which +% the data are typeset. +% +% \begin{macrocode} +\newcommand*\shortanswer[1]{\par + \ifanswers + \addvspace{\smallskipamount}% + \settowidth\@tempdima{\answerstart\quad}% + \setlength\@tempdimb{\linewidth}% + \addtolength\@tempdimb{-\@tempdima}% + \answerstart\parbox[t]{\@tempdimb}{\noindent#1}% + \par\medskip + \else\ifreservespace + \addvspace{\shortwhite}% + \answerstart\mbox{}\dotfill\quad\mbox{}\par + \medskip + \fi\fi + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Problem with a Long Answer} +% +% \begin{environment}{longanswer} +% For elaborate questions, problems, etc.\ an environment is available. +% The |longanswer| environment takes as optional argument the length +% of white to be reserved for the student. +% +% Code for opening of the environment. +% It opens a box in order to let the answer disappear +% and places a rule in order to guarantee sufficient +% white space. +% +% \begin{macrocode} +\newenvironment{longanswer}[1][\longwhite]{ + \par + \ifanswers + \addvspace{\medskipamount}\answerstart + \nopagebreak\par\noindent + \else\ifreservespace + \addvspace{\medskipamount}\answerstart + \nopagebreak\par\noindent + \hrule\@height#1\@width\z@\par + \fi + \setbox\z@\vbox\bgroup\leavevmode + \fi\ignorespaces} +% \end{macrocode} +% +% Aftermath of |longanswer|. If necessary close the box +% and empty it to get rid of the answer. +% \begin{macrocode} + {\ifanswers\par\medskip\else\egroup\setbox\z@\hbox{}\fi} +% \end{macrocode} +% \end{environment} +% +% \section{Multiple Choice Questions} +% +% Multiple choice problems must be placed +% in an |choice| environment, a modification +% of |itemize|. +% +% We will make it possible to +% shuffle the items of a multiple +% choice problem randomly. These items are held in a series +% of token registers declared below. +% +% \begin{macro}{\loadcounter} +% \begin{macro}{\resetloadcounter} +% \begin{macro}{\incloadcounter} +% \begin{macro}{\decloadcounter} +% We need a counter into which to keep the number of items +% at any time loaded into the token registers declared above. +% Also we provide for resetting, incrementing and decrementing +% of this register. Note the global assignments. +% +% \begin{macrocode} +\newcount\loadcounter +\newcommand*\resetloadcounter{\global\loadcounter\z@} +\newcommand*\incloadcounter{\global\advance\loadcounter\@ne} +\newcommand*\decloadcounter{\global\advance\loadcounter\m@ne} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% We want a specific behaviour when the list of items is typeset. +% However, we cannot be sure at which listlevel this will occur. +% \begin{macro}{\@listk} +% Therefore we predeclare a replacement for |\@listi|, |\@listii|, +% or whatsoever, and swap the |\@list..| at the right time. +% Note the choice for the leftside margin, derived from the +% width of the text with which the problem starts. This choice +% diminishes the number of different margins. It is easily adapted +% to your own taste. +% +% \begin{macrocode} +\newcommand*\@listk{% + \settowidth{\leftmargin}{\@problemstart}% + \topsep\medskipamount + \partopsep\z@ + \itemsep\smallskipamount + \parsep\z@} +% \end{macrocode} +% \end{macro} +% +% \subsection{Typesetting Multiple Choice} +% +% \begin{environment}{choice} +% The multiple choice environment |choice| takes one argument, +% the modifier options to the environment typesetting. +% Here the options are |\random| and |\ordered|; the names +% speak for themselves. Note that random permutation is not +% executed if a series is run. Furthermore the counter +% for the number of items loaded is reset. +% +% \begin{macrocode} +\newenvironment{choice}[1][]{% + \ifseries\ordered\else\random\fi#1\relax + \resetloadcounter +% \end{macrocode} +% +% The following code is taken from \LaTeX's |itemize|. +% I did not find a more elegant way to bend this environment +% to my whims. +% +% \begin{macrocode} + \ifnum\@itemdepth>3 \@toodeep \else + \advance\@itemdepth\@ne + \expandafter\let + \csname @list\romannumeral\the\@itemdepth\endcsname=\@listk + \list{\badmark}{\def\makelabel##1{\hss\llap{##1}}}% + \fi}% +% \end{macrocode} +% +% At the end of |choice| we dump all the items that may have been +% collected inbetween and finish the |list|. +% +% \begin{macrocode} + {\@dumpitems\endlist} +% \end{macrocode} +% \end{environment} +% +% \subsection{Code for Options to Choice} +% +% \begin{macro}{\random} +% The option |\random| codes macros |\@loaditem| and +% |\@dumpitems| so that the items are actually loaded, +% then shuffled and dumped afterwards. +% \begin{macro}{\ordered} +% The |\ordered| option makes them noops and thus the +% items will be typeset on the fly. +% +% \begin{macrocode} +\newcommand*\random{% + \def\@loaditem{\loaditem}% + \def\@dumpitems{\shuffle\dumpitems}} +\newcommand*\ordered{\def\@loaditem{}\def\@dumpitems{}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Formatting the Item Mark} +% +% \begin{macro}{\marksize} +% \begin{macro}{\badmark} +% \begin{macro}{\goodmark} +% We require two marks: one for the bad guys and one +% for the good guy. We use the two symbols |\square| and |\boxtimes|, +% but provide replacements (later on, after giving exam.cfg a chance +% to define them) in case these are undefined. +% Typeset these marks in fixed size (unchanged baselineskip) +% provided by macro |\marksize|. +% +% \begin{macrocode} +\newcommand*\marksize{\fontsize{12}{\f@baselineskip}\selectfont} +\newcommand*\badmark{{\marksize\ensuremath{\square}}} +\newcommand*\goodmark{% + \ifanswers{\marksize\ensuremath{\boxtimes}}\else\badmark\fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\baditem} +% \begin{macro}{\gooditem} +% Each item can either be right or wrong. We take the precaution +% to suppress the difference when typesetting the actual exam. +% Enclose each item in your list in the argument to +% |\gooditem| and |\baditem|. They +% will load the item in memory prior to (possible) random shuffling. +% +% \begin{macrocode} +\newcommand*\baditem[1]{\@loaditem{\item[\badmark]#1}} +\newcommand*\gooditem[1]{\@loaditem{\item[\goodmark]#1}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Loading and Dumping Items} +% +% \begin{macro}{\@itemA} +% \begin{macro}{\@itemB} +% \begin{macro}{\@itemC} +% \begin{macro}{\@itemD} +% \begin{macro}{\@itemE} +% This series of token registers +% can hold five alternatives. The mechanism that loads the +% items is sufficiently general to use it for other purposes too. +% Use your imagination! +% That there are five of them is remembered in a definition +% because we will need this number to prevent overfilling the store. +% +% \begin{macro}{\@itemstore}\mbox{} +% \begin{macrocode} +\newtoks\@itemA +\newtoks\@itemB +\newtoks\@itemC +\newtoks\@itemD +\newtoks\@itemE +\newcommand\@itemstore{5} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\loaditem} +% According to the value of |loadcounter| the token registers +% |\@itemA|, etc.\ are filled. Argument to macro |\loaditem| +% is the contents of the item. +% +% \begin{macrocode} +\newcommand\loaditem[1]{% + \ifcase\loadcounter + \@itemA={#1}% + \or\@itemB={#1}% + \or\@itemC={#1}% + \or\@itemD={#1}% + \or\@itemE={#1}% + \fi + \ifnum\loadcounter<\@itemstore \incloadcounter + \else\examwarning{\string\loaditem\space ignored, too many}\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\dumpitemno} +% Produce items that were loaded. +% +% \begin{macrocode} +\newcommand*\dumpitemno[1]{% + \ifnum#1>\loadcounter + \examwarning{\string\dumpitemno[#1] ignored, out range}% + \else\ifcase#1\relax + \or\the\@itemA + \or\the\@itemB + \or\the\@itemC + \or\the\@itemD + \or\the\@itemE + \fi\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\dumpitem} +% \begin{macro}{\dumpitems} +% With |\dumpitem| the last one comes out and is chopped off +% from the stack, with |\dumpitems| the whole lot is dumped. +% By means of |\dumpitemno| one can peek inside the stack: +% its parameter gives the position to be produced, the item itself +% remains on the stack. +% \begin{macrocode} +\newcommand*\dumpitem{\dumpitemno{\loadcounter}\decloadcounter} +\newcommand*\dumpitems{\@whilenum\loadcounter>\z@\do{\dumpitem}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{Shuffling Items} +% +% \begin{macro}{\shuffle} +% This macro permutes |loadcounter| items in the +% token registers |\@itemA|, etc. Undoubtedly it +% can be done better, but who's perfect? +% +% \begin{macrocode} +\newcommand*\shuffle{% + \ifcase\loadcounter + \or + \or\shuffle@ii + \or\shuffle@\@itemA\@itemC \shuffle@ii \shuffle@\@itemB\@itemC + \or\shuffle@iv + \or\shuffle@\@itemD\@itemE \shuffle@iv \shuffle@\@itemD\@itemE + \fi + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\shuffle@} +% \begin{macro}{\shuffle@ii} +% \begin{macro}{\shuffle@iv} +% \begin{macro}{\@item@} +% Random interchange of two and four items. +% +% \begin{macrocode} +\newtoks\@item@ +\newcommand*\shuffle@[2]{\SRtest{}{\@item@=#1 #1=#2 #2=\@item@}} +\newcommand*\shuffle@ii{\shuffle@\@itemA\@itemB} +\newcommand*\shuffle@iv{% + \SRtest{\shuffle@\@itemA\@itemB}{\shuffle@\@itemC\@itemD}% + \SRtest{\shuffle@\@itemA\@itemC}{\shuffle@\@itemB\@itemD}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{Random Generator Implementation} +% +% \begin{macro}{\SRset} +% \begin{macro}{\SRbit} +% \begin{macro}{\SRtest} +% \begin{macro}{\SRvalue} +% Not much commentary with these macros. They are +% described in Tugboat~1994, vol.~15.1, p.~57--58. +% +% \begin{macro}{\@SR} +% \begin{macro}{\@SRconst} +% \begin{macro}{\@SRadvance}\mbox{} +% \begin{macrocode} +\ifx\@SR\undefined\newcount\@SR\fi +\providecommand\@SRconst{2097152} +\providecommand\SRset[1]{\global\@SR#1 \ignorespaces} +\providecommand\@SRadvance{% + \begingroup + \ifnum\@SR<\@SRconst\relax\count@\z@\else\count@\@ne\fi + \ifodd\@SR\advance\count@\@ne\fi + \global\divide\@SR\tw@ + \ifodd\count@\global\advance\@SR\@SRconst\relax\fi + \endgroup} +\providecommand\SRbit{\@SRadvance\ifodd\@SR1\else0\fi} +\providecommand\SRtest[2]{\@SRadvance + \ifodd\@SR#2\else#1\fi\ignorespaces} +\providecommand\SRvalue{\number\@SR } +\SRset{0} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \section{Page Style} +% +% \begin{macro}{\thehead} +% For a page style |examheadings| is offered. +% Choose it by supplying to |\pagestyle|. +% +% \begin{macro}{\ps@examheadings}\mbox{} +% \begin{macrocode} +\newcommand*\thehead{% + \textsl{\@title\enspace:\enspace + \ifseries\namesection\else\@date\fi}} +\newcommand*\ps@examheadings{% + \let\@oddfoot\@empty + \let\@evenfoot\@empty + \renewcommand*\@oddhead{% + \vbox{% + \hbox to\textwidth{\headerfont\thehead\hfil\upshape\thepage}% + \vskip1.5\p@ + \hrule\@height.5\p@\@width\textwidth + }}% + \let\@evenhead\@oddhead} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \section{Titlepage} +% +% \begin{macro}{\target} +% With target we denote the group of students for whom +% the exam is meant. Defined with |\target| and called up +% with |\@target|, just like |\author|, etc. +% +% \begin{macrocode} +\newcommand*\target[1]{\gdef\@target{#1}}\def\@target{} +% +% \end{macrocode} +% \end{macro} +% +% The titlepage is best set by a redefined |\maketitle|. Of course it +% needs to be suppressed if the \texttt{notitlepage} option is given +% on the |\documentclass| call. Provide two versions, one +% for a real exam and one for collections and/or answers. +% See the example below, supplied in \emph{exam.cfg}. +% +% The titlepage is set by a redefined |\maketitle|. Of course it +% needs to be suppressed if the notitlepage option is given +% on the |\documentclass| call. Provided are two versions, one +% for a real exam and one for collections and/or answers. +% +% \subsection{Example titlepage} +% +% \begin{macrocode} +%<*cfg> +% +\if@titlepage +\renewcommand*\maketitle{% +\begin{titlepage} + \begin{center}\titlefont + \vspace*{1cm}% + \mbox{}\rule{2cm}{0.4pt}\mbox{}\par + \addvspace{1cm}% + \begin{Large} + \textbf{\ifseries\Collection\else\Exam\fi}\\[10mm] + \end{Large} + \begin{large} + \@title\\[5mm] + \ifseries\@author\else\@target\fi\\[5mm] + \@date\\[10mm] + \end{large} + \mbox{}\rule{2cm}{0.4pt}\mbox{}\par + \addvspace{2cm}% + \ifseries + \vfill\vfill + \begin{flushleft}\emph{Copyright notice, if any.}\end{flushleft}% + \else\ifanswers + \begin{huge}\Answers\end{huge}\par + \else + \begin{minipage}{.75\textwidth}% + \raggedright\parindent\medskipamount + Name:\enspace\dotfill\strut\par + Address:\enspace\dotfill\strut\par + City:\enspace\dotfill\strut\par + Student number:\enspace\dotfill\strut\par + \vspace{1cm}% + \begin{itemize}% + \item Please write legible, what cannot be read + cannot be given credit. + \item Put your name and student number on all + on all separate sheets of paper. + \item This exam has \theproblemnum\ problems. + \end{itemize}% + \end{minipage}\\[10mm] + Good luck!\par + \fi + \fi + \end{center}% +\end{titlepage}\let\maketitle=\relax} +% \end{macrocode} +% +% And in case no title page requested: +% +% \begin{macrocode} +\else\let\maketitle=\relax\fi +% +% \end{macrocode} +% +% +% \section{Language Dependent Items} +% +% \begin{macro}{\Exam} +% \begin{macro}{\Collection} +% \begin{macro}{\Answers} +% \begin{macro}{\Answer} +% \begin{macro}{\Problem} +% Predefine all language specific macros, +% default is the English language. +% +% \begin{macrocode} +%<*cls> +\newcommand*\Exam{EXAM} +\newcommand*\Collection{COLLECTION OF EXAMS} +\newcommand*\Answers{ANSWERS} +\newcommand*\Answer{Answer} +\newcommand*\Problem{Problem} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Dutch equivalents} +% +% \begin{macrocode} +% +%<*cfg> +\renewcommand*\Answers{ANTWOORDEN} +\renewcommand*\Answer{Antwoord} +\renewcommand*\Exam{TENTAMEN} +\renewcommand*\Collection{TENTAMENBUNDEL} +\renewcommand*\Problem{Opgave} +% +%<*cls> +% \end{macrocode} +% +% \section{Initializations} +% +% \subsection{Fonts} +% +% \begin{macro}{\headerfont} +% \begin{macro}{\bodyfont} +% \begin{macro}{\titlefont} +% Fonts for pageheader, body of the text and on the titlepage. +% +% \begin{macrocode} +\newcommand*\headerfont{\rmfamily\small} +\newcommand*\bodyfont{\sffamily} +\newcommand*\titlefont{\rmfamily\upshape} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% And initialize to |\bodyfont|. +% +% \begin{macrocode} +\bodyfont +% \end{macrocode} +% +% \subsection{Directory Localization} +% +% \begin{macro}{\CurrentDirectory} +% \begin{macro}{\DirectorySeparator} +% We can determine from |\@currdir| which +% character separates directories in a path name. +% E.g. in UNIX this is |/| from the string |./|, but +% in the MacOS the current directory and the separator are both |:|. +% Therefore we extract from |\@currdir| the last character +% (of two at most).\\ +% Make |\CurrentDirectory| a synonyme for |\@currdir|. +% +% \begin{macrocode} +\let\CurrentDirectory=\@currdir +\def\DirectorySeparator#1#2`\^^M{\@ifemptyarg{#2}{#1}{#2}} +\edef\DirectorySeparator{% + \expandafter\DirectorySeparator\CurrentDirectory`\^^M} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\LastChar} +% Another macro delivers the last character of a string. +% +% \begin{macrocode} +\providecommand*{\LastChar}[1]{% + \@ifemptyarg{#1}{}{\expandafter\@lastchar#1`\^^M}} +\def\@lastchar#1#2`\^^M{\@ifemptyarg{#2}{#1}{\@lastchar#2`\^^M}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DirectoryName} +% The next macro ensures that a path name ends correctly, when +% a filename is concatenated with it. +% If the directory separator character isn't the last character, +% it is added. +% +% \begin{macrocode} +\providecommand*{\DirectoryName}[1]{\@ifemptyarg{#1}{}% + {\if\LastChar{#1}\DirectorySeparator\relax#1\else + #1\DirectorySeparator\fi}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Setfolder} +% Macro |\Setfolder| can be used to install a standard +% folder (directory) name. +% E.g. a name |\figuresfolder| can be defined as the +% standard place for figures. +% Supply as first argument to |\Setfolder| the macro name +% for the folder. e.g. |\figuresfolder| and as second +% parameter its location on disk. +% Below three of these folders (here initialized +% with empty names) are defined in the example configuration file. +% \begin{macrocode} +\newcommand*\Setfolder[2]{\edef#1{\DirectoryName{#2}}} +% +%<*cfg> +\Setfolder{\mainfolder}{} +\Setfolder{\commonfolder}{} +\Setfolder{\figuresfolder}{} +% +%<*cls> +% \end{macrocode} +% \end{macro} +% +% \subsection{Configuration File} +% +% Last, but not least, see if there is a configuration +% file \texttt{exam.cfg} and read it for the final adjustments. +% +% \begin{macrocode} +\InputIfFileExists{exam.cfg}{}{} +% \end{macrocode} +% +% \subsection{Macros Needed but Possibly Missing} +% +% \begin{macro}{\square} +% \begin{macro}{\boxtimes} +% Possibly the following macros are still undefined; here we guarantee +% they are available. You may define them yourselves in +% \emph{exam.cfg} or in your document. +% +% \begin{macrocode} +\providecommand\square{\bigcirc} +\providecommand\boxtimes{\surd} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macrocode} +% +% \end{macrocode} +% +% \section{Coding of Example Questions} +% +% \begin{macrocode} +%<*exa> +\begin{problem} +\problemdate{\today} +What is the question? +\score{2} +\shortanswer{To be or not to be.} +\end{problem} +% +% \end{macrocode} +% +% \begin{macrocode} +%<*exb> +\parameterproblem{1= to be\\2= not to be} +\problemdate{\today} +\begin{problem} +\score{2} +What is\ifnum\parameter=1\relax\else n't\fi\ the question? +\shortanswer{\ifnum\parameter=1\relax To be or n\else N\fi ot to be.} +\end{problem} +% +% \end{macrocode} +% \Finale +% diff --git a/macros/latex/contrib/exams/exam.ins b/macros/latex/contrib/exams/exam.ins new file mode 100644 index 0000000000..fe43229dcb --- /dev/null +++ b/macros/latex/contrib/exams/exam.ins @@ -0,0 +1,38 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% +%% --------------- start of docstrip commands ------------------ +%% +\def\batchfile{exam.ins} +\input docstrip.tex + +\preamble +Copyright (C) 1993-1996 Hans van der Meer. All rights reserved. +\endpreamble + +\keepsilent + +\generate{\file{exam.cls}{\from{exam.dtx}{cls}} + \file{exam.cfg}{\from{exam.dtx}{cfg}} + \file{exampa.tex}{\from{exam.dtx}{exa}} + \file{exampb.tex}{\from{exam.dtx}{exb}} + } + +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* Move into a directory searched by TeX:} +\Msg{*} +\Msg{* \space\space exam.cls} +\Msg{* \space\space exam.cfg} +\Msg{*} +\Msg{* For the documentation run slidenotes.dtx through LaTeX.} +\Msg{* First remove the comment lines from exampa.tex, exampb.tex} +\Msg{*} +\Msg{***********************************************************} +} + +\endinput diff --git a/macros/latex/contrib/exams/exam.readme b/macros/latex/contrib/exams/exam.readme new file mode 120000 index 0000000000..100b93820a --- /dev/null +++ b/macros/latex/contrib/exams/exam.readme @@ -0,0 +1 @@ +README \ No newline at end of file -- cgit v1.2.3