% \def\EmailAddress{jhlavace@svsu.edu}
% \iffalse meta-comment
%
% Program mathexam
% Copyright (C) 2007 Jan Hlavacek
%
% This program may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.2
% of this license or (at your option) any later version.
% The latest version of this license is in
% http://www.latex-project.org/lppl.txt
% and version 1.2 or later is part of all distributions of LaTeX
% version 1999/12/01 or later.
%
% The Program's files are mathexam.dtx, mathexam.ins and mathexam.sty.
%
% Run latex with the input file mathexam.ins to generate the mathexam.sty
% package file. Run latex with the input file mathexam.dtx to generate the
% package documentation.
%
% \fi
%
% \CheckSum{179}
%
% \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 \~}
%
% \iffalse
%<*driver>
\ProvidesFile{mathexam.dtx}
%
%\NeedsTeXFormat{LaTeX2e}
%\ProvidesPackage{mathexam}
%<*package>
[2007/07/30 v1.00 Package for typesetting exams]
%
%<*driver>
\documentclass{ltxdoc}
\usepackage[nohdr]{mathexam}[2007/07/30]
\usepackage{hyperref}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
\begin{document}
\DocInput{mathexam.dtx}
\PrintChanges
\PrintIndex
\end{document}
%
% \fi
%
% \GetFileInfo{mathexam.dtx}
%
% \DoNotIndex{\newcommand,\newenvironment}
%
% \changes{1.00}{2007/07/30}{Rewrote as a .dtx file for distribution}
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \title{\bf The \textsf{mathexam} Package\thanks{This document
% describes the version number \fileversion, last
% revised \filedate.}}
%
% \author{Jan Hlavacek\\
% \small Email: \texttt{\EmailAddress}}
% \date{30 July 2007}
% \maketitle
%
% \begin{abstract}
% This package can help you typeset exams (mostly in mathematics and related
% disciplines where students are required to show their calculations followed by
% one or more short answers). It provides commands for inclusion of space for
% calculations, as well as commands for automatic creation of ``answer spaces''.
% In addition, the package will automatically create page headers and footers,
% and will let you include instructions and space for students to put their
% name.
% \end{abstract}
% \thispagestyle{empty}
% \tableofcontents
% \section{Introduction}
%
% There are several classes and packages for typesetting exams in \LaTeX\
% available. However, I found out that none of them satisfy my needs. Some of
% the classes and packages are very sophisticated, providing commands and
% environments for things like fill in the blank, true/false and multiple choice
% questions. In contrast, nearly all exams in my lower level undergraduate math
% classes (including exams I took myself as an undergraduate) have basically the
% same format: a list of questions, each followed by a vertical space for
% students to do their calculations, each optionally followed by one or more
% reserved spaces for students to write their final answers.
%
% Some of my colleagues use various word-processing softwares to type their
% exams. Because of limitations of these programs, they usually end up typing
% each questions, followed by bunch of blank lines, followed by something like
% ``Answer underscore underscore underscore \ldots'', carefully inserting just
% the right number of blank lines so that the each question will be on the same
% page as its corresponding ``Answer:\ldots'', and the last ``Answer:\ldots'' on
% each page will be somewhat close to the bottom of the page. This works fine
% as long as you don't change the questions, the font, margins, and as long as
% you always use the same printer to print the exam. Every time you do anything
% that results in a change in pagination, you have to go back and insert or
% delete blank lines in order to have everything align correctly again.
%
% \TeX\, with its stretchable vertical glue, can easily solve this
% problem. This package provides a way for easy inclusion of vertical space
% after questions, as well as single or multiple ``answer spaces''.
% It does not take care of things like numbering of questions (I prefer to use
% standard \LaTeX\ list making environments), tracking the number of points,
% etc.
%
% \section{Installation}
%
% To install this package, simply run \LaTeX\ with the input file
% \texttt{mathexam.ins} like this:
% \begin{verbatim}
% $ latex mathexam.ins
% \end{verbatim}
% That will create the file \texttt{mathexam.sty}. You need to move this file to
% a place where \LaTeX\ can find it.
%
% To generate documentation for this package, run \LaTeX\ with the input file
% \texttt{mathexam.dtx} instead, like
% \begin{verbatim}
% $ latex mathexam.dtx
% \end{verbatim}
% to generate the documentation in the \texttt{.dvi} format, or
% \begin{verbatim}
% $ pdflatex mathexam.dtx
% \end{verbatim}
% to create a \texttt{pdf} file.
%
% \section{Usage} \label{usage}
%
% To use the package, all you have to do is include |\usepackage{mathexam}| in
% the preamble of your document:
% \begin{verbatim}
% \documentclass[11pt]{article}
% \usepackage{mathexam}
% \end{verbatim}
%
% \DescribeMacro{nohdr}
% Normally, the \texttt{mathexam} package automatically generates headers and
% footers for each page, containing information about the exam. In order to do
% that, the package uses several other packages, namely \texttt{fancyhdr},
% \texttt{lastpage} and \texttt{ifthen}. These packages have to be installed on
% your computer if you want the \texttt{mathexam} package generate headers. If
% you don't have all of these packages, or if for some reason you don't want the
% \texttt{mathexam} package to generate headers (you have your own way to
% include headers, for example), you can call the \texttt{mathexam} package with
% \texttt{nohdr} option:
% \begin{verbatim}
% \documentclass[11pt]{article}
% \usepackage[nohdr]{mathexam}
% \end{verbatim}
%
% \subsection{Main Commands}
%
% \DescribeMacro{\answer}
% The command |\answer| inserts a stretchable vertical space followed by a
% generic ``answer space'':
% \begin{verbatim}
% What is $1+1$? \answer
% \end{verbatim}
% produces:
%
% What is $1+1$? \answer
%
% \DescribeMacro{\addanswer}
% The command |\addanswer| works just like |\answer| except that it does not
% insert any extra vertical space. It can be used for example in situation where we
% need two ``answer spaces'' immediately following each other:
% \begin{verbatim}
% Product of two numbers equals 24, while their sum is 10. What are the
% numbers? \answer\addanswer
% \end{verbatim}
% produces:
%
% Product of two numbers equals 24, while their sum is 10. What are the
% numbers? \answer\addanswer
%
% \subsection{Optional Arguments}
%
% In the examples above, there is a stretchable vertical glue between the text
% of each problem and the ``answer space''. You cannot really see it in this
% document, since the problems are surrounded by other text and we let \LaTeX\
% decide where to break the page. Normally, you would insert |\newpage| after
% several problems, which would make the problems nicely distributed on the
% page.
%
% Sometimes you want to make sure that certain problem has enough space for
% students to write down their work. You can specify an exact amount of space between
% the text of the problem and the ``answer space'' using an optional argument
% with the |\answer| or |\addanswer| commands:
% \begin{verbatim}
% What is $1+1$? \answer[1in]
% \end{verbatim}
% produces:
%
% What is $1+1$? \answer[1in]
%
% Here, the space between the text of the problem and the ``answer space'' will
% be 1 inch. In this aspect, |\addanswer[1in]| will work the exact same way.
% The argument can be any glue, for example if you want to include at least one inch,
% which can possibly stretch further, you can do |\answer[1in plus 1fill]|
%
% \subsection{Changing Labels for ``Answer Spaces''}
%
% Often you want to use different text instead of the default ``Answer:'' label
% for an ``answer space''. This can easily be done with the ``stared'' version
% of the commands. The commands |\answer*| and |\addanswer*| take one mandatory
% argument (in addition to the optional argument described above) with the text
% you want to use for the label. For example
% \begin{verbatim}
% Find the first two derivatives of the function $f(x) = x^2\cos(x)$. Simplify
% your answers as much as possible. Show all your work.
% \answer*[1in]{$f'(x)=$}\answer*[1in]{$f''(x)=$}
% \end{verbatim}
% produces
%
% Find the first two derivatives of the function $f(x) = x^2\cos(x)$. Simplify
% your answers as much as possible. Show all your work.
% \answer*[1in]{$f'(x)=$}\answer*[1in]{$f''(x)=$}
%
% Notice that here, vertical spaces before both of the ``answer spaces'' will be
% 1 inch long.
% In the following example, the answer spaces for $x$ and $y$ will be right
% above each other:
% \begin{verbatim}
% If $x + y = 10$ and $2x - y = 8$, find $x$ and $y$.
% \answer*[1in]{$x=$}\addanswer*{$y=$}
% \end{verbatim}
% produces
%
% If $x + y = 10$ and $2x - y = 8$, find $x$ and $y$.
% \answer*[1in]{$x=$}\addanswer*{$y=$}
%
% \subsection{No ``Answer Space''}
%
% Sometimes you will have problems where the work is the answer, or the answer
% is too long to fit into a short ``answer space''. For that purpose, the
% package defines the |\noanswer| command.
%
% \DescribeMacro{\noanswer}
% This command will simply include a stretchable vertical space after the
% problem. Again, as with |\answer| and |\addanswer|, the command takes one
% optional argument, which is an optional length of the vertical space.
%
% \subsection{Other Commands}
%
% The package provides several other commands for things like identifying the
% exam, giving instructions to students, including space for student's name etc.
%
% \DescribeMacro{\ExamName}\DescribeMacro{\ExamClass}\DescribeMacro{\ExamHead}
% The commands |\ExamName|, |\ExamClass| and |\ExamHead| are used for
% identifying the exam. They will determine how will the headers of the exam
% pages look like. For example, in the preamble of your document you could
% specify
% \begin{verbatim}
% \ExamName{Final Exam}
% \ExamClass{Calculus III}
% \ExamHead{\today}
% \end{verbatim}
% The \texttt{mathexam} package will use the \texttt{fancyhdr} package to
% include this information in the page headers.
%
% \DescribeMacro{\ExamNameLine}
% The |\ExamNameLine| command can be used to include a line on which students
% can write their name:
% \begin{verbatim}
% \ExamNameLine
% \end{verbatim}
% produces
%
% \ExamNameLine
%
% \DescribeMacro{\ExamInstrBox}
% The command |\ExamInstrBox| lets you include some basic instructions to
% students taking the exam. Example:
% \begin{verbatim}
% \ExamInstrBox{Please show all your work! Answers without supporting work will
% not be given credit. Write answers in spaces provided. You have 1 hour and 50
% minutes to complete this exam.}
% \end{verbatim}
% produces
%
% \ExamInstrBox{Please show all your work! Answers without supporting work will
% not be given credit. Write answers in spaces provided. You have 1 hour and 50
% minutes to complete this exam.}
%
% \section{Notes}
%
% \subsection{TODO}
%
% There are several things I plan to improve in the future:
% \begin{itemize}
% \item Some basic internationalization (right now everything is in English)
% \item Add some code for printing point value of problems.
% \end{itemize}
% If you have any other suggestions, please contact me.
%
% \subsection{Bugs, Suggestions, Comments\ldots}
%
% If you find any bugs, or have any suggestions, comments, patches etc.~please
% let me know at \texttt{\EmailAddress}.
% \StopEventually{}
%
% \section{Implementation}
%
% First we will process options:
% \begin{macrocode}
\newif\ifExamHdr
\ExamHdrtrue
\DeclareOption{nohdr}{\ExamHdrfalse}
\ProcessOptions
% \end{macrocode}
%
% If ExamHdr is true, we load some packages we need
% \begin{macrocode}
\ifExamHdr
\RequirePackage{fancyhdr}
\RequirePackage{lastpage}
\RequirePackage{ifthen}
\fi
% \end{macrocode}
%
% \begin{macro}{\ExamName}
% \begin{macro}{\ExamClass}
% \begin{macro}{\ExamHead}
% Here we will set up macros that handle exam headers and footers. First we
% will define the three commands that provide a user interface:
% \begin{macrocode}
\newcommand{\ExamName}[1]{\def\@xamname{#1}}
\newcommand{\ExamClass}[1]{\def\@xamclass{#1}}
\newcommand{\ExamHead}[1]{\def\@xamrighthdr{#1}}
% \end{macrocode}
% Then we will initialize the internal macros to some default values:
% \begin{macrocode}
\def\@xamname{\relax}
\def\@xamclass{\relax}
\def\@xamrighthdr{\relax}
% \end{macrocode}
% If ExamHdr is true, set up the fancy headers:
% \begin{macrocode}
\ifExamHdr
\pagestyle{fancy}
\lhead{\@xamclass}
\chead{\@xamname}
\rhead{Page \thepage\ of \pageref{LastPage}}
\rfoot{\ifthenelse{\value{page}=\pageref{LastPage}}{The End.}{Cont.}}
\cfoot{}
% \end{macrocode}
% Handle the first page differently:
% \begin{macrocode}
\AtBeginDocument{
\begin{center}
\large\scshape \@xamclass \hfill \@xamname \hfill \@xamrighthdr
\end{center}}
\thispagestyle{empty}
\fi
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\answer}
% \begin{macro}{\addanswer}
% Prepare auxiliary commands for |\answer| and |\addanswer|. First the regular
% (non-stared) version:
% \begin{macrocode}
\newcommand{\answ@r}[1][\fill]{%
\nopagebreak\vspace{#1}\par\nopagebreak\hfill\hbox to
.5\columnwidth{Answer:\hrulefill}\vspace{\baselineskip}}
\newcommand{\addansw@r}[1][\baselineskip]{%
\nopagebreak\vspace{#1}\par\nopagebreak\hfill\hbox to
.5\columnwidth{Answer:\hrulefill}\vspace{\baselineskip}}
% \end{macrocode}
%
% Then the stared version:
% \begin{macrocode}
\newcommand{\answ@rstar}[2][\fill]{%
\nopagebreak\vspace{#1}\par\nopagebreak\hfill\hbox to
.5\columnwidth{#2\hrulefill}\vspace{\baselineskip}}
\newcommand{\addansw@rstar}[2][\baselineskip]{%
\nopagebreak\vspace{#1}\par\nopagebreak\hfill\hbox to
.5\columnwidth{#2\hrulefill}\vspace{\baselineskip}}
% \end{macrocode}
%
% Now we will pot them together. Look ahead to see if there is a star. If
% there is, use the stared version:
% \begin{macrocode}
\def\answer{%
\def\e@t*{}%
\def\n@xt{\if\noexpand\myn@@xt*%
\expandafter\expandafter\expandafter\answ@rstar\expandafter\e@t\else%
\expandafter\answ@r\fi}%
\futurelet\myn@@xt\n@xt}
\def\addanswer{%
\def\e@t*{}%
\def\n@xt{\if\noexpand\myn@@xt*%
\expandafter\expandafter\expandafter\addansw@rstar\expandafter\e@t\else%
\expandafter\addansw@r\fi}%
\futurelet\myn@@xt\n@xt}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\noanswer}
% \begin{macrocode}
\newcommand{\noanswer}[1][\fill]{\nopagebreak\vspace{#1}\par}
% \end{macrocode}
% \end{macro}
%
% Finally, couple of very simple macros. They could probably be made more
% interesting and flexible.
% \begin{macro}{\ExamNameLine}
% \begin{macrocode}
\newcommand{\ExamNameLine}{%
\par
\vspace{\baselineskip}
Name:\hrulefill\relax
\par}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ExamInstrBox}
% \begin{macrocode}
\newcommand{\ExamInstrBox}[1]{\begin{center}\vspace{\baselineskip}%
\fbox{\fbox{\parbox{.8\hsize}{#1}}}\end{center}}
% \end{macrocode}
% \end{macro}
%
% \Finale
\endinput