% \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}
%</driver>
%<package,ls>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{mathexam}
%<*package>
        [2007/07/30 v1.00 Package for typesetting exams]
%</package>
%<*driver>
\documentclass{ltxdoc}
\usepackage[nohdr]{mathexam}[2007/07/30]
\usepackage{hyperref}
\EnableCrossrefs         
\CodelineIndex
\RecordChanges
\begin{document}
\DocInput{mathexam.dtx}
\PrintChanges
\PrintIndex
\end{document}
%</driver>
% \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 
