<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">%\iffalse
% probsoln.dtx generated using makedtx version 0.94b (c) Nicola Talbot
% Command line args:
%   -macrocode ".*\.tex"
%   -setambles ".*\.tex=&gt;\nopreamble\nopostamble"
%   -comment ".*\.tex"
%   -src "(.+\.sty)\Z=&gt;\1"
%   -src "(.+\.tex)\Z=&gt;\1"
%   -doc "probsoln-manual.tex"
%   -author "Nicola Talbot"
%   -dir "source"
%   probsoln
% Created on 2008/8/27 14:19
%\fi
%\iffalse
%&lt;*package&gt;
%% \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     \&amp;
%%   Acute accent  \'     Left paren    \(     Right paren   \)
%%   Asterisk      \*     Plus          \+     Comma         \,
%%   Minus         \-     Point         \.     Solidus       \/
%%   Colon         \:     Semicolon     \;     Less than     \&lt;
%%   Equals        \=     Greater than  \&gt;     Question mark \?
%%   Commercial at \@     Left bracket  \[     Backslash     \\
%%   Right bracket \]     Circumflex    \^     Underscore    \_
%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%%   Right brace   \}     Tilde         \~}
%&lt;/package&gt;
%\fi
% \iffalse
% Doc-Source file to use with LaTeX2e
% Copyright (C) 2008 Nicola Talbot, all rights reserved.
% \fi
% \iffalse
%&lt;*driver&gt;
\documentclass[a4paper]{ltxdoc}
\usepackage[colorlinks,
            bookmarks,
            hyperindex=false,
            pdfauthor={Nicola L.C. Talbot},
            pdftitle={probsoln: creating problem sheets optionally with solutions}]{hyperref}

\usepackage{color}

\usepackage{probsoln}
\RecordChanges
\PageIndex
\CheckSum{886}

\renewcommand{\usage}[1]{\textit{\hyperpage{#1}}}
\renewcommand{\main}[1]{\hyperpage{#1}}
\newcommand{\see}[2]{\emph{see} #1}
\makeatletter
\def\index@prologue{\section*{Index}}
\makeatother
\CodelineNumbered
\newcommand{\dq}[1]{``#1''}

\definecolor{defbackground}{rgb}{0.8,1,1}

\newsavebox\defsbox
\newlength\defwidth
\newenvironment{definition}{%
\setlength{\fboxsep}{4pt}\setlength{\fboxrule}{1.25pt}%
\begin{lrbox}{\defsbox}%
\setlength\defwidth\linewidth
\addtolength\defwidth{-2\fboxrule}%
\addtolength\defwidth{-2\fboxsep}%
\begin{minipage}{\defwidth}\flushleft
}{%
\end{minipage}
\end{lrbox}%
\vskip10pt
\noindent
\fcolorbox{black}{defbackground}{\usebox\defsbox}%
\vskip10pt
}

\newlength\boxlength
\newsavebox\importantbox
\newenvironment{important}{%
\setlength{\fboxrule}{4pt}%
\setlength\boxlength{\linewidth}%
\addtolength\boxlength{-2\fboxsep}%
\addtolength\boxlength{-2\fboxrule}%
\begin{lrbox}{\importantbox}%
\begin{minipage}{\boxlength}%
}{\end{minipage}\end{lrbox}%
\par\vskip10pt\noindent
\fcolorbox{red}{white}{\usebox{\importantbox}}\par\vskip10pt}


\newcommand*{\ics}[1]{\cs{#1}\SpecialMainIndex{#1}}

\newcommand{\pkgopt}[1]{\textsf{#1}\index{package options&gt;#1=\textsf{#1}|hyperpage}}
\newcommand*{\sty}[1]{\textsf{#1}}
\newcommand*{\isty}[1]{\sty{#1}\index{#1 package=\sty{#1} package|hyperpage}}
\newcommand*{\env}[1]{\textsf{#1}}
\newcommand{\ienv}[1]{\env{#1}\index{#1 environment=\env{#1} environment|hyperpage}}
\newcommand*{\bool}[1]{\textsf{#1}\index{#1 boolean variable=\textsf{#1} boolean variable|hyperpage}}
\newcommand{\csdef}[1]{\cs{#1}}


\begin{document}\DocInput{probsoln.dtx}
\end{document}
%&lt;/driver&gt;
%\fi
%\MakeShortVerb{"}
%\DeleteShortVerb{\|}
%
% \title{probsoln v3.0: creating problem sheets optionally with solutions}
% \author{Nicola L.C. Talbot\\[10pt]
%School of Computing Sciences\\
%University of East Anglia\\
%Norwich. Norfolk\\
%NR4 7TJ. United Kingdom.\\
%\url{http://theoval.cmp.uea.ac.uk/~nlct/}}
%
% \date{26th August 2008}
% \maketitle
%\tableofcontents
%
% \section{Introduction}
%The \sty{probsoln} package is designed for teachers or
%lecturers who want to create problem sheets for their 
%students.  This package was designed with specifically 
%mathematics problems in mind, but can be used for other 
%subjects as well.  The idea is to create a file containing a
%large number of problems with their solutions which can be 
%read in by \LaTeX, and then select a number of problems to
%typeset.  This means that once the database has been set up,
%each year you can easily create a new problem sheet that is
%sufficiently different from the previous year, thus
%preventing the temptation of current students seeking out
%the previous year's students, and checking out their
%answers.  There is also an option that can be passed to the
%package to determine whether or not the solutions should be
%printed.  In this way, one file can either produce the
%student's version or the teacher's version.
%
%\section{Package Options}\label{sec:pkgopt}
%The following options may be passed to this package:
%\begin{description}
%\item[\pkgopt{answers}]  Show the answers
%\item[\pkgopt{noanswers}] Don't show the answers (default)
%\item[\pkgopt{draft}] Display the label and dataset name when a problem is used
%\item[\pkgopt{final}] Don't display label and dataset name when a problem is used
%\end{description}
%
%\section{Showing and Hiding Solutions}\label{sec:showanswers}
%
%In addition to the \pkgopt{answers} and \pkgopt{noanswers} package
%options, it is also possible to show or suppress the solutions
%using \DescribeMacro{\showanswers}\cs{showanswers} and
%\DescribeMacro{\hideanswers}\cs{hideanswers}, respectively.
%The boolean variable \bool{showanswers} determines whether the
%answers should be displayed. You can use this value with the
%\isty{ifthen} package to specify different text depending on 
%whether the solutions should be displayed. For example:
%\begin{verbatim}
%Assignment 1\ifthenelse{\boolean{showanswers}}{ (Solution Sheet)}{}
%\end{verbatim}
%Alternatively you can use \ics{ifshowanswers}\ldots\cs{else}\ldots
%\cs{fi}:
%\begin{verbatim}
%Assignment 1\ifshowanswers\space (Solution Sheet)\fi
%\end{verbatim}
%
%For longer passages, you can use the environments \DescribeEnv{onlyproblem}\env{onlyproblem}
%and \DescribeEnv{onlysolution}\env{onlysolution}. For example:
%\begin{verbatim}
%\begin{onlyproblem}%
%What is the derivative of $f(x) = x^2$?
%\end{onlyproblem}%
%\begin{onlysolution}%
%$f'(x) = 2x$
%\end{onlysolution}
%\end{verbatim}
%The above will only display the question if \bool{showanswers}
%is false and will only display the solution if \bool{showanswers}
%is true. If you want the question to appear in the answer
%sheet as well as the solution, then don't put the question in
%the \env{onlyproblem} environment:
%\begin{verbatim}
%What is the derivative of $f(x) = x^2$?
%\begin{onlysolution}%
%Solution: $f'(x) = 2x$
%\end{onlysolution}
%\end{verbatim}
%\begin{important}
%You can't use verbatim text in the body of the
%\ienv{onlyproblem} or \ienv{onlysolution} environments.
%If you need verbatim-like text, then try packages such as
%\isty{alltt}. Remember that you also can't use verbatim
%text in command arguments.
%\end{important}
%
%\section{General Formatting Commands}\label{sec:formatting}
%
%The commands and environments described in this section are
%provided to assist formatting problems and their solutions.
%\DescribeEnv{solution}
%\begin{definition}
%\verb|\begin{solution}|\meta{text}\verb|\end{solution}|
%\end{definition}
%This is equivalent to 
%\verb|\par\noindent\textbf{\solutionname}:|\meta{text}
%where \DescribeMacro{\solutionname}\cs{solutionname} defaults
%to \dq{Solution}. Note that you must place the \env{solution}
%environment inside the \ienv{onlysolution} environment or
%between \ics{ifshowanswers}\ldots\cs{fi} to ensure that it
%is suppressed when the solutions are not wanted. (See
%\autoref{sec:showanswers}.) 
%
%
%Note that the \sty{probsoln} package will only define the 
%\env{solution} environment if it is not already defined.
%
%\DescribeEnv{textenum}
%\begin{definition}
%\verb|\begin{textenum}|\ldots\verb|\end{textenum}|
%\end{definition}
%The \env{textenum} environment is like the \ienv{enumerate} 
%environment but is in-line. It uses the same counter that the
%\env{enumerate} environment would use at that level so the
%question can be compact but the answer can use \env{enumerate}
%instead. For example:
%\begin{verbatim}
%\begin{onlyproblem}%
%Differentiate the following: 
%\begin{textenum}
%\item $f(x)=2^x$;
%\item $f(x)=\cot(x)$
%\end{textenum}
%\end{onlyproblem}
%\begin{onlysolution}
%\begin{enumerate}
%\item 
%\begin{align*}
%f(x) &amp;= 2^x = \exp(\ln(x^2)) =\exp(2\ln(x))\\
%f'(x) &amp;= \exp(2\ln(x))\times \frac{2}{x}\\
% &amp;= f(x)\frac{2}{x}
%\end{align*}
%\item
%\begin{align*}
%f(x) &amp;= \cot(x) = (\tan(x))^{-2}\\
%f'(x) &amp;= -(\tan(x))^{-2}\times\sec^2(x)\\
%&amp;=-\csc^2x
%\end{align*}
%\end{enumerate}
%\end{onlysolution}
%\end{verbatim}
%In this example, the items in the question are brief, so an
%\ienv{enumerate} environment would result in a lot of 
%unnecessary white space,
%but the answers require more space, so an \env{enumerate}
%environment is more appropriate. Since the \ienv{textenum}
%environment uses the same counters as the \env{enumerate}
%environment, the question and answer sheets use consistent
%labelling. Note that there are other packages available on
%CTAN that you can use to create in-line lists. Check the
%\href{http://www.tex.ac.uk/tex-archive/help/Catalogue/bytopic.html\#enumeration}{TeX Catalogue} for
%further details.
%
%\DescribeMacro{\correctitem}\DescribeMacro{\incorrectitem}
%\begin{definition}
%\csdef{correctitem}\\
%\csdef{incorrectitem}
%\end{definition}
%You can use the commands \cs{correctitem} and \cs{incorrectitem} 
%in place of \ics{item}. If the solutions are suppressed, these
%commands behave in the same way as \cs{item}, otherwise they
%format the item label using one of the commands:
%\DescribeMacro{\correctitemformat}\DescribeMacro{\incorrectitemformat}
%\begin{definition}
%\csdef{correctitemformat}\marg{label}\\
%\csdef{incorrectitemformat}\marg{label}
%\end{definition}
%For example:
%\begin{verbatim}
%Under which of the following functions does $S=\{a_1,a_2\}$
%become a probability space?
%\begin{enumerate}
%\incorrectitem $P(a_1)=\frac{1}{3}$, $P(a_2)=\frac{1}{2}$
%\correctitem $P(a_1)=\frac{3}{4}$, $P(a_2)=\frac{1}{4}$
%\correctitem $P(a_1)=1$, $P(a_2)=0$
%\incorrectitem $P(a_1)=\frac{5}{4}$, $P(a_2)=-\frac{1}{4}$
%\end{enumerate}
%\end{verbatim}
%
%\section{Defining a Problem}\label{sec:defproblem}
%
%It is possible to construct a problem sheet with solutions using
%the commands described in the previous sections, however it is
%also possible to define a set of problems for later use. In this
%way you can create an external file containing many problems some
%or all of which can be loaded and used in a document. The
%\sty{probsoln} package has a default data set labelled
%\dq{default} in which you can store problems or you can create
%multiple data sets. You can then iterate through each problem
%in a problem set. You can use a previously defined problem more
%than once, which means that by judicious use of \ienv{onlyproblem},
%\ienv{onlysolution} or the \bool{showanswers} boolean variable
%in conjunction with \ics{showanswers} and \ics{hideanswers},
%you can print the solutions in a different location to the
%questions (for example in an appendix).
%
%\DescribeEnv{defproblem}
%\begin{definition}
%\verb|\begin{defproblem}|\oarg{n}\marg{label}\meta{definition}\verb|\end{defproblem}|
%\end{definition}
%This defines the problem whose label is given by \meta{label}.
%The label must be unique for a given data set and should not
%contain active characters. (Active characters include the special
%characters such as \$ and \&amp;, but some packages may make other
%symbols active. For example, the \isty{ngerman} and \isty{babel}
%packages make certain punctuation active. Check the relevant 
%package documentation for details.)
%
%If \env{defproblem} occurs in the document or is included via
%\cs{input} or \cs{include}, then the problem will be added to
%the default data set. If \env{defproblem} occurs in an external
%file that is loaded using one of the commands defined in
%\autoref{sec:load} then the problem will be added to
%the specified data set.
%
%The contents of the \env{defproblem} environment should be the
%text that defines the problem. This may include any of the
%commands defined in 
%\autoref{sec:showanswers} and \autoref{sec:formatting}.
%
%The problem may optionally take \meta{n} arguments (where 
%\meta{n} is from 0 to 9). The arguments can be referenced
%in the definition via \texttt{\#1},\ldots,\texttt{\#9}.
%If \meta{n} is omitted then the problem doesn't take any
%arguments.
%The following example defines a problem with one argument:
%\begin{verbatim}
%\begin{defproblem}[1]{diffsin}
%Differentiate $f(x)=\sin(#1x)$.
%\begin{onlysolution}%
%\begin{solution}
%$f'(x) = #1\cos(#1x)$
%\end{solution}
%\end{onlysolution}
%\end{defproblem}
%\end{verbatim}
%
%\DescribeMacro{\newproblem}
%\begin{definition}
%\csdef{newproblem}\oarg{n}\marg{label}\marg{problem}\marg{solution}
%\end{definition}
%This is a shortcut command for:
%\begin{ttfamily}\obeylines
%\cs{begin}\{defproblem\}\oarg{n}\marg{label}\%
%\meta{problem}\%
%\cs{begin}\{onlysolution\}\%
%\cs{begin}\{solution\}\%
%\meta{solution}\%
%\cs{end}\{solution\}\%
%\cs{end}\{onlysolution\}\%
%\cs{end}\{defproblem\}
%\end{ttfamily}
%For example:
%\begin{verbatim}
%\newproblem[1]{diffsin}{%
%\(f(x) = \sin(#1x)\)
%}{%
%\(f'(x) = #1\cos(#1x)\)
%}
%\end{verbatim}
%is equivalent to
%\begin{verbatim}
%\begin{defproblem}[1]{diffcos}%
%\(f(x) = \cos(#1x)\)
%\begin{onlysolution}%
%\begin{solution}%
%\(f'(x) = -#1\sin(#1x)\)
%\end{solution}%
%\end{onlysolution}%
%\end{defproblem}
%\end{verbatim}
%(In this example, the argument will need to be a positive number
%to avoid a double minus in the answer. If you want to perform
%floating point arithmetic on the arguments, then try the
%\isty{fp} package.)
%
%\DescribeMacro{\newproblem*}
%\begin{definition}
%\csdef{newproblem*}\oarg{n}\marg{label}\marg{definition}
%\end{definition}
%This is a shortcut for:
%\begin{ttfamily}\obeylines
%\cs{begin}\{defproblem\}\oarg{n}\marg{label}\%
%\meta{definition}\%
%\cs{end}\{defproblem\}
%\end{ttfamily}
%
%\begin{important}
%Verbatim text must not be used in the contents of \ienv{defproblem}
%or in any of the arguments to \cs{newproblem} or
%\cs{newproblem*}. If you need verbatim-like text consider using
%\cs{texttt} or the \isty{alltt} package.
%\end{important}
%
%\section{Using a Problem}\label{sec:useproblem}
%
%Once you have defined a problem using \ienv{defproblem} or
%\cs{newproblem} (see 
%\autoref{sec:defproblem}), you can later display the problem 
%using:
%\DescribeMacro{\useproblem}
%\begin{definition}
%\csdef{useproblem}\oarg{data set}\marg{label}\marg{arg$_1$}\ldots\marg{arg$_N$}\end{definition}
%where \meta{data set} is the name of the data set that contains
%the problem (the default data set is used if omitted), 
%\meta{label} is the label identifying the required problem and
%\meta{arg$_1$}, \ldots, \meta{arg$N$} are the arguments to pass to the problem, if the problem was 
%defined to have arguments (where $N$ is the number of arguments specified when the problem was defined).
%
%For example, in the previous section the problem \texttt{diffcos} 
%was defined to have one argument, so it can be used as follows:
%\begin{verbatim}
%\useproblem{diffcos}{3}
%\end{verbatim}
%This will be equivalent to:
%\begin{verbatim}
%\(f(x) = \cos(3x)\)
%\begin{onlysolution}%
%\begin{solution}%
%\(f'(x) = -3\sin(3x)\)
%\end{solution}%
%\end{onlysolution}%
%\end{verbatim}
%
%\section{Loading Problems From External Files}\label{sec:load}
%
%You can store all your problem definitions (see
%\autoref{sec:defproblem}) in an external file. 
%These problems can all be appended to the default data set by
%including the file via \ics{input} or they can be appended
%to other data sets using one of the commands described below.
%Once you have loaded all the required problems, you can
%iterate through the data sets using the commands described
%in \autoref{sec:foreach}. Note that the commands below
%will create a new data set, if the named data set doesn't
%exist.
%
%\DescribeMacro{\loadallproblems}
%\begin{definition}
%\csdef{loadallproblems}\oarg{data set}\marg{filename}
%\end{definition}
%This will load all problems defined in \meta{filename} and
%append them to the specified data set, in the order in which
%they are defined in the file. If \meta{data set} is
%omitted, the default data set will be used. If \meta{data set}
%doesn't exist, it will be created.
%
%\DescribeMacro{\loadselectedproblems}
%\begin{definition}
%\csdef{loadselectedproblems}\oarg{data set}\marg{labels}\marg{filename}
%\end{definition}
%This is like \cs{loadproblems}, but only those problems whose
%label is listed in the comma-separated list \meta{labels} are
%loaded. For example, if I have some problems defined in the
%file \texttt{derivatives.tex}, then
%\begin{verbatim}
%\loadselectedproblems{diffsin,diffcos}{derivatives}
%\end{verbatim}
%will only load the problems whose labels are \texttt{diffsin}
%and \texttt{diffcos}, respectively. All the other problems in 
%the file will remain undefined.
%
%\DescribeMacro{\loadrandomproblems}
%\begin{definition}
%\csdef{loadrandomproblems}\oarg{data set}\marg{n}\marg{filename}
%\end{definition}
%This randomly loads \meta{n} problems from \meta{filename} and
%adds them to the given data set. If \meta{data set} is omitted,
%the default data set is assumed. Note that the problems will be
%added to the data set in a random order, not in the order in
%which they were defined. There must be at least \meta{n} problems
%defined in \meta{filename}.
%
%\begin{important}
%It is generally not a good idea to place anything in 
%\meta{filename} that is not inside the body of \ienv{defproblem} 
%or in the arguments to \ics{newproblem} or \ics{newproblem*}.
%All the commands in this section input the external file within
%a local scope, so commands definitions would need to be made
%global to have any effect. In addition, \cs{loadrandomproblems}
%has to load each file twice, which means that anything outside
%a problem definition will be parsed twice.
%\end{important}
%
%
%\section{Iterating Through Datasets}\label{sec:foreach}
%
%Once you have defined all your problems for a given data set,
%you can use an individual problem with \ics{useproblem}
%(see \autoref{sec:useproblem}) but it is more likely that you will
%want to iterate through all the problems so that you don't need
%to remember the labels of all the problems you have defined.
%
%\DescribeMacro{\foreachproblem}
%\begin{definition}
%\csdef{foreachproblem}\oarg{data set}\marg{body}
%\end{definition}
%This does \meta{body} for each problem in the given data set.
%If \meta{data set} is omitted, the default data set is used.
%Within \meta{body} you can use 
%\DescribeMacro{\thisproblem}\cs{thisproblem} to use the
%current problem and \DescribeMacro{\thisproblemlabel}\cs{thisproblemlabel} 
%to access the current label. If the problem requires arguments,
%you will be prompted for them, so if you want to use this
%approach you will need to use \LaTeX\ in interactive mode. If
%you do provide arguments, they will be stored in the event that
%you need to iterate through the data set again. The
%arguments will be included in \cs{thisproblem}, so you only
%need to use \cs{thisproblem} without having to specify
%\ics{useproblem}. For example, to iterate through all problems
%in the default data set:
%\begin{verbatim}
%\begin{enumerate}
%\foreachproblem{\item\thisproblem}
%\end{enumerate}
%\end{verbatim}
%
%\DescribeMacro{\foreachdataset}
%\begin{definition}
%\csdef{foreachdataset}\marg{cmd}\marg{body}
%\end{definition}
%This does \meta{body} for each of the defined data sets. Within
%\meta{body}, \meta{cmd} will be set to the name of the current
%data set. For example, to display all problems in all data sets:
%\begin{verbatim}
%\begin{enumerate}
%\foreachdataset{\thisdataset}{%
%\foreachproblem[\thisdataset]{\item\thisproblem}}
%\end{enumerate}
%\end{verbatim}
%
%Suppose I have two external files called
%\texttt{derivatives.tex} and \texttt{probspaces.tex} which
%define problems using both \ienv{onlyproblem} and 
%\ienv{onlysolution} for example:
%\begin{verbatim}
%\begin{defproblem}{cosxsqsinx}%
%\begin{onlyproblem}%
%$y = \cos(x^2)\sin x$.%
%\end{onlyproblem}%
%\begin{onlysolution}%
%\[\frac{dy}{dx} = -\sin(x^2)2x\sin x + \cos(x^2)\cos x\]
%\end{onlysolution}%
%\end{defproblem}
%\end{verbatim}
%I can write a document that creates two data sets, one for
%the derivative problems and one for the problems about
%probability spaces. I can then use \ics{hideanswers} and
%iterate through the require data set to produce the problems.
%Later, I can use \ics{showanswers} and iterate over all problems defined in both data
%sets to produce the chapter containing all the answers. When
%displaying the questions, I have taken advantage of the fact that
%I can cross-reference items within an \ienv{enumerate} environment,
%and redefined \ics{theenumi} to label the questions according to
%the chapter. The cross-reference label is constructed from
%the problem label and is referenced in the answer section to
%ensure that the answers have the same label as the questions.
%\begin{verbatim}
%\documentclass{report}
%\usepackage{probsoln}
%\begin{document}
%\hideanswers
%\chapter{Differentiation}
%% randomly select 25 problems from derivatives.tex and add to
%% the data set called 'deriv'
%\loadrandomproblems[deriv]{25}{derivatives}
%
%% Display the problems
%\renewcommand{\theenumi}{\thechapter.\arabic{enumi}}
%\begin{enumerate}
%\foreachproblem[deriv]{\item\label{prob:\thisproblemlabel}\thisproblem}
%\end{enumerate}
%% You may need to change \theenumi back here
%
%\chapter{Probability Spaces}
%% randomly select 25 problems from probspaces.tex and add to
%% the data set called 'spaces'
%\loadrandomproblems[spaces]{25}{probspaces}
%
%% Display the problems
%\renewcommand{\theenumi}{\thechapter.\arabic{enumi}}
%\begin{enumerate}
%\foreachproblem[spaces]{\item\label{prob:\thisproblemlabel}\thisproblem}
%\end{enumerate}
%% You may need to change \theenumi back here
%
%\appendix
%
%\chapter{Solutions}
%\showanswers
%\begin{itemize}
%\foreachdataset{\thisdataset}{%
%\foreachproblem[\thisdataset]{\item[\ref{prob:\thisproblemlabel}]\thisproblem}
%}
%\end{itemize}
%
%\end{document}
%\end{verbatim}
%
%
%\section{Random Number Generator}\label{sec:random}
%
%This package provides a pseudo-random number generator that is used
%by \ics{loadrandomproblems}.
%
%\DescribeMacro{\PSNrandseed}
%\begin{definition}
%\csdef{PSNrandseed}\marg{n}
%\end{definition}
%This sets the seed to \meta{n} which must be a non-zero integer.
%For example, to generate a different set of random numbers
%every time you \LaTeX\ your document,\footnote{assuming you
%leave at least a minute between runs.} put the following in your
%preamble:
%\begin{verbatim}
%\PSNrandseed{\time}
%\end{verbatim}
%or to generate a different set of random numbers every year you
%\LaTeX\ your document:
%\begin{verbatim}
%\PSNrandseed{\year}
%\end{verbatim}
%
%\DescribeMacro{\PSNgetrandseed}
%\begin{definition}
%\csdef{PSNgetrandseed}\marg{register}
%\end{definition}
%This stores the current seed in the count register specified by 
%\meta{register}.
%For example:
%\begin{verbatim}
%\newcount\myseed
%\PSNgetrandseed{\myseed}
%\end{verbatim}
%
%\DescribeMacro{\PSNrandom}
%\begin{definition}
%\csdef{PSNrandom}\marg{register}\marg{n}
%\end{definition}
%Generates a random integer from 1 to \meta{n} and stores in 
%the count register specified by \meta{register}. For example,
%the following generates an integer from 1 to 10 and stores it
%in the register \cs{myreg}:
%\begin{verbatim}
%\newcount\myreg
%\PSNrandom{\myreg}{10}
%\end{verbatim}
%
%\DescribeMacro{\random}
%\begin{definition}
%\csdef{random}\marg{counter}\marg{min}\marg{max}
%\end{definition}
%Generates a random integer from \meta{min} to \meta{max} and
%stores in the given counter. For example, the following generates
%a random number between 3 and 8 (inclusive) and stores it in
%the counter \texttt{myrand}.
%\begin{verbatim}
%\newcounter{myrand}
%\random{myrand}{3}{8}
%\end{verbatim}
%
%\DescribeMacro{\doforrandN}
%\begin{definition}
%\csdef{doforrandN}\marg{n}\marg{cmd}\marg{list}\marg{text}
%\end{definition}
%Randomly selects \meta{n} values from the comma-separated list
%given by \meta{list} and iterates through this subset. On
%each iteration it sets \meta{cmd} to the current value and
%does \meta{text}. For example, the following will load a
%randomly selected problem from two of the listed files (where
%\texttt{file1.tex}, \texttt{file2.tex} and \texttt{file3.tex}
%are files containing at least one problem):
%\begin{verbatim}
%\doforrandN{2}{\thisfile}{file1,file2,file3}{%
%\loadrandomproblems{1}{\thisfile}}
%\end{verbatim}
%
%
%\section{Compatibility With Versions Prior to 3.0}
%
%Version 3.0 of the \sty{probsoln} package completely changed the
%structure of the package, but the commands described in this
%section have been provided to maintain compatibility with 
%earlier versions. The only problems that are likely to occur are
%those where commands are contained within groups. This will 
%effect any commands that are contained in external files that are
%outside of the arguments to \ics{newproblem} and \ics{newproblem*}.
%However, since the external files had to be parsed twice in
%order to load the problems, this shouldn't be an issue as adding
%anything other than problem definitions in those files would
%be problematic anyway.
%
%The other likely difference is where the random generator is
%used in a group. This includes commands such as 
%\ics{selectrandomly}. For example, if your document contained
%something like:
%\begin{verbatim}
%\begin{enumerate}
%\selectrandomly{file1}{8}
%
%\item Solve the following:
%\begin{enumerate}
%\selectrandomly{file2}{4}
%\end{enumerate}
%
%\selectrandomly{file3}{2}
%\end{enumerate}
%\end{verbatim}
%Then using versions prior to v3.0 will produce a different
%set of random numbers since the second \cs{selectrandomly}
%is in a different level of grouping. If you want to ensure
%that the document produces exactly the same random set with
%the new version as with the old version, you will need to
%get and set the random number seed. For example, the above
%would need to be modified so that it becomes:
%\begin{verbatim}
%\begin{enumerate}
%\selectrandomly{file1}{8}
%
%\item Solve the following:
%\newcount\oldseed
%\PSNgetrandseed{\oldseed}
%\begin{enumerate}
%\selectrandomly{file2}{4}
%\end{enumerate}
%\PSNrandseed{\oldseed}
%
%\selectrandomly{file3}{2}
%\end{enumerate}
%\end{verbatim}
%
%\DescribeMacro{\selectrandomly}
%\begin{definition}
%\csdef{selectrandomly}\marg{filename}\marg{n}
%\end{definition}
%This is now equivalent to:
%\begin{ttfamily}\obeylines
%\{\cs{loadrandomproblems}\oarg{filename}\marg{n}\marg{filename}\}\%
%\cs{foreachproblem}\oarg{filename}\marg{\cs{PSNitem}\cs{thisproblem}\cs{endPSNitem}}
%\end{ttfamily}
%
%\DescribeMacro{\selectallproblems}
%\begin{definition}
%\csdef{selectallproblems}\marg{filename}
%\end{definition}
%This is now equivalent to:
%\begin{ttfamily}\obeylines
%\{\cs{loadallproblems}\oarg{filename}\marg{filename}\}\%
%\cs{foreachproblem}\oarg{filename}\marg{\cs{PSNitem}\cs{thisproblem}\cs{endPSNitem}}
%\end{ttfamily}
%
%Note that in both the above cases, a new data set is created
%with the same name as the file name.
%
%
% \StopEventually{\clearpage\phantomsection\addcontentsline{toc}{section}{Index}\PrintIndex}
%
%
%
%\section{The Code}
%\iffalse
%    \begin{macrocode}
%&lt;*probsoln.sty&gt;
%    \end{macrocode}
%\fi
%\subsection{Package Definition}
% This package requires \LaTeXe.
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
%    \end{macrocode}
% Identify this package and version:
%    \begin{macrocode}
\ProvidesPackage{probsoln}[2008/08/25 v3.0 (NLCT)]
%    \end{macrocode}
% Required packages:
%    \begin{macrocode}
\RequirePackage{ifthen}
\RequirePackage{substr}
\RequirePackage{amsmath}
%    \end{macrocode}
% \subsection{Package Options}
%\begin{macro}{\ifshowanswers}
% Define boolean to determine whether or not to show the
% solutions. This governs whether the contents of \env{onlysolution}
% and \env{onlyproblem} are displayed.
%    \begin{macrocode}
\newif\ifshowanswers
\showanswersfalse
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\showanswers}
% Define synonym for \cs{showanswerstrue}
%    \begin{macrocode}
\let\showanswers\showanswerstrue
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\hideanswers}
% Define synonym for \cs{showanswersfalse}
%    \begin{macrocode}
\let\hideanswers\showanswersfalse
%    \end{macrocode}
%\end{macro}
% The package option \pkgopt{answers} displays the solutions.
%    \begin{macrocode}
\DeclareOption{answers}{\showanswerstrue}
%    \end{macrocode}
% The package option \pkgopt{noanswers} hides the solutions.
%    \begin{macrocode}
\DeclareOption{noanswers}{\showanswersfalse}
%    \end{macrocode}
%\begin{macro}{\prob@showdraftlabel}
%\begin{definition}
%\cs{prob@showdraftlabel}\marg{db name}\marg{label}
%\end{definition}
% Used by \cs{useproblem} to display data base name and problem
% label when in draft mode.
%    \begin{macrocode}
\newcommand*{\prob@showdraftlabel}[2]{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\draftproblemlabel}
%\begin{definition}
%\cs{draftproblemlabel}\marg{db name}\marg{label}
%\end{definition}
% Displays the data base name and label.
%    \begin{macrocode}
\newcommand*{\draftproblemlabel}[2]{[#1,#2]}
%    \end{macrocode}
%\end{macro}
% Draft mode displays the problem label using \cs{draftproblemlabel}
%    \begin{macrocode}
\DeclareOption{draft}{%
\renewcommand*{\prob@showdraftlabel}[2]{\draftproblemlabel{#1}{#2}}}
%    \end{macrocode}
% Final mode:
%    \begin{macrocode}
\DeclareOption{final}{%
\renewcommand*{\prob@showdraftlabel}[2]{}}
%    \end{macrocode}
% Process package options:
%    \begin{macrocode}
\ProcessOptions
%    \end{macrocode} 
%\subsection{Databases}
% All the problems are stored in data bases. Each data base 
% \meta{name} is represented as a macro \cs{prob@db@}\meta{name}
% which stores a comma-separated list of labels for each problem
% associated with that data base. Each problem \meta{label} is 
% stored in the macro 
% \cs{prob@data@}\meta{name}"@"\meta{name}"@"\meta{label}. Problems
% loaded from an external file using \cs{loadproblems} are added
% to the specified data base. Any problems that are defined in the
% document or are \cs{input}ed from another file (without the
% use of \cs{loadproblems}) are added to the default data base.
%
% Define the default data base:
%    \begin{macrocode}
\newcommand*{\prob@db@default}{}
%    \end{macrocode}
%
%\begin{macro}{\prob@databases}
% Store a list of all the defined data bases.
%    \begin{macrocode}
\newcommand*{\prob@databases}{default}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\prob@newdb}
%\begin{definition}
%\cs{prob@newdb}\marg{name}
%\end{definition}
% Creates a new (empty) data base.
%    \begin{macrocode}
\newcommand*{\prob@newdb}[1]{%
\@ifundefined{prob@db@#1}{%
  \expandafter\gdef\csname prob@db@#1\endcsname{}%
  \xdef\prob@databases{\prob@databases,#1}%
  }{%
  \PackageError{probsoln}{Data set `#1' is already defined}{}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\prob@currentdb}
% Keep a track of the current data base
%    \begin{macrocode}
\newcommand*{\prob@currentdb}{default}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\moveproblem}
%\begin{definition}
%\cs{moveproblem}\marg{label}\marg{source}\marg{target}
%\end{definition}
%    \begin{macrocode}
\newcommand{\moveproblem}[3]{%
\@moveproblem{#1}{#2}{#3}%
\expandafter\let\expandafter\@tmpdblist
 \csname prob@db@#2\endcsname
\expandafter\gdef\csname prob@db@#2\endcsname{}%
\@for\@tmplab:=\@tmpdblist\do{%
 \ifthenelse{\equal{\@tmplab}{#1}}{}{%
   \expandafter\ifx\csname prob@db@#2\endcsname\@empty
     \expandafter\xdef\csname prob@db@#2\endcsname{\@tmplab}%
   \else
     \expandafter\xdef\csname prob@db@#2\endcsname{%
       \csname prob@db@#2\endcsname,%
       \@tmplab}%
   \fi
 }%
}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@moveproblem}
%\begin{definition}
%\cs{@moveproblem}\marg{label}\marg{source}\marg{target}
%\end{definition}
% Moves problem identified by \meta{label} from the data base
% \meta{source} to the data base \meta{target}. (Doesn't remove
% label from \meta{source} --- that needs to be done separately.)
%    \begin{macrocode}
\newcommand*{\@moveproblem}[3]{%
%    \end{macrocode}
% Add label to target data base
%    \begin{macrocode}
  \expandafter\ifx\csname prob@db@#3\endcsname\@empty
    \expandafter\xdef\csname prob@db@#3\endcsname{#1}%
  \else
    \expandafter\xdef\csname prob@db@#3\endcsname{%
      \csname prob@db@#3\endcsname,#1}%
  \fi
%    \end{macrocode}
% Redefine \cs{prob@data@}\meta{source}"@"\meta{label} as
% \cs{prob@data@}\meta{target}"@"\meta{label}.
%    \begin{macrocode}
  \edef\do@movedata{%
    \noexpand\global\noexpand\let\expandafter\noexpand
      \csname prob@data@#3@#1\endcsname=%
      \expandafter\noexpand\csname prob@data@#2@#1\endcsname
      \noexpand\global\noexpand\let
      \expandafter\noexpand
      \csname prob@data@#2@#1\endcsname=\noexpand\undefined
    }%
  \do@movedata
%    \end{macrocode}
% Redefine \cs{prob@argN@}\meta{source}"@"\meta{label} as
% \cs{prob@argN@}\meta{target}"@"\meta{label}.
%    \begin{macrocode}
  \edef\do@moveargN{%
    \noexpand\global\noexpand\let\expandafter\noexpand
      \csname prob@argN@#3@#1\endcsname=%
      \expandafter\noexpand\csname prob@argN@#2@#1\endcsname
      \noexpand\global\noexpand\let
      \expandafter\noexpand
      \csname prob@argN@#2@#1\endcsname=\noexpand\undefined
    }%
  \do@moveargN
%    \end{macrocode}
% Redefine \cs{prob@args@}\meta{source}"@"\meta{label} as
% \cs{prob@args@}\meta{target}"@"\meta{label}, if defined.
%    \begin{macrocode}
  \@ifundefined{prob@args@#2@#1}{}{%
    \edef\do@moveargs{%
      \noexpand\global\noexpand\let\expandafter\noexpand
        \csname prob@args@#3@#1\endcsname=%
        \expandafter\noexpand\csname prob@args@#2@#1\endcsname
        \noexpand\global\noexpand\let
        \expandafter\noexpand
        \csname prob@args@#2@#1\endcsname=\noexpand\undefined
      }%
    \do@moveargs
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\subsection{Defining New Problems}
%\begin{macro}{\prob@newproblem}
%\begin{definition}
%\cs{prob@newproblem}\marg{n}\marg{db name}\marg{label}\marg{definition}
%\end{definition}
% Define a new problem identified by \meta{label} for data base
% \meta{db name} with the given definition. The problem has \meta{n}
% arguments (each represented by "#1" etc). The arguments may 
% either be appended to \cs{useproblem}\marg{label} or may
% be stored in \cs{prob@args@}\meta{db name}"@"\meta{label} if
% the problem is to be accessed via \cs{foreachproblem}. The
% number of arguments is stored in
% \cs{prob@argN@}\meta{db name}"@"\meta{label}
%    \begin{macrocode}
\newcommand{\prob@newproblem}[4]{%
%    \end{macrocode}
% If the given data base is not defined, create it:
%    \begin{macrocode}
\@ifundefined{prob@db@#2}{\prob@newdb{#2}}{}%
%    \end{macrocode}
% Check whether this entry has already been defined:
%    \begin{macrocode}
\@ifundefined{prob@data@#2@#3}{%
%    \end{macrocode}
% Define the new problem and make it global:
%    \begin{macrocode}
\let\@tmp=\undefined
\newcommand\@tmp[#1]{#4}%
\expandafter\global\expandafter\let
   \csname prob@data@#2@#3\endcsname=\@tmp
\expandafter\xdef\csname prob@argN@#2@#3\endcsname{\number#1}%
\let\@tmp=\undefined
%    \end{macrocode}
% Add the label to the data base:
%    \begin{macrocode}
\expandafter\ifx\csname prob@db@#2\endcsname\@empty
  \expandafter\xdef\csname prob@db@#2\endcsname{#3}%
\else
  \expandafter\xdef\csname prob@db@#2\endcsname{%
    \csname prob@db@#2\endcsname,#3}%
\fi
%    \end{macrocode}
% If the problem requires arguments, prompt the user if necessary:
%    \begin{macrocode}
\ifnum#1&gt;0\relax
  \@prob@do@getargs{#1}{#2}{#3}%
\fi
  }{%
  \PackageError{probsoln}{Problem `#3' is already defined for
  data base `#2'}{Problem labels must be unique for each data base}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@prob@gobblethree}
% Ignore all three arguments
%    \begin{macrocode}
\newcommand{\@prob@gobblethree}[3]{}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@prob@getargs}
%\begin{definition}
%\cs{@prob@getargs}\meta{n}\meta{db name}\meta{label}
%\end{definition}
% Prompt user for \meta{n} arguments for problem \meta{label}
% in data base \meta{db name}.
%    \begin{macrocode}
\newcommand{\@prob@getargs}[3]{%
\message{Problem `#3' (in data base `#2') requires #1 argument(s).^^J
Please specify (e.g. {5}{3}):}%
\read-1to\@tmp
\expandafter\global\expandafter\let
  \csname prob@args@#2@#3\endcsname=\@tmp
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@prob@do@getargs}
%    \begin{macrocode}
\let\@prob@do@getargs\@prob@gobblethree
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\long@collect@body}
% Need long versions of \cs{collect@body}. These macros are 
% adapted from the macros defined by \sty{amsmath}.
%    \begin{macrocode}
\long\def\long@collect@body#1{%
  \@envbody{\@xp#1\@xp{\the\@envbody}}%
  \edef\process@envbody{\the\@envbody\@nx\end{\@currenvir}}%
  \@envbody\@emptytoks \def\begin@stack{b}%
  \begingroup
  \@xp\let\csname\@currenvir\endcsname\long@collect@@body
  \edef\process@envbody{\@xp\@nx\csname\@currenvir\endcsname}%
  \process@envbody
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\long@addto@envbody}
%    \begin{macrocode}
\long\def\long@addto@envbody#1{\global\@envbody\@xp{\the\@envbody#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\long@collect@@body}
%    \begin{macrocode}
\long\def\long@collect@@body#1\end#2{%
  \edef\begin@stack{\long@push@begins#1\begin\end \@xp\@gobble\begin@stack}%
  \ifx\@empty\begin@stack
    \endgroup
    \@checkend{#2}%
    \long@addto@envbody{#1}%
  \else
    \long@addto@envbody{#1\end{#2}}%
  \fi
  \process@envbody
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\long@push@begins}
%    \begin{macrocode}
\long\def\long@push@begins#1\begin#2{%
  \ifx\end#2\else b\@xp\long@push@begins\fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{environment}{defproblem}
%\begin{definition}
%"\begin{defproblem}"\oarg{n}\marg{label}
%\end{definition}
% Define a new problem identified by \meta{label} with
% \meta{n} arguments to add to the current data base. Note that
% since the contents of the environment are passed to a command,
% the contents can't contain any verbatim text. 
%    \begin{macrocode}
\newenvironment{defproblem}[2][0]{%
  \def\@prob@currentargN{#1}%
  \def\@prob@currentlabel{#2}%
  \long@collect@body\prob@do@defproblem
}{}
%    \end{macrocode}
%\end{environment}
%\begin{macro}{\prob@do@newproblem}
%\begin{definition}
%\cs{prob@do@newproblem}\marg{definition}
%\end{definition}
% Defines a new problem given by \meta{definition}, where
% the number of arguments is given by \cs{@prob@currentargN},
% the label is given by \cs{@prob@currentlabel} and the data base
% is given by \cs{prob@currentdb}.
%    \begin{macrocode}
\newcommand{\prob@do@newproblem}[1]{%
\prob@newproblem\@prob@currentargN\prob@currentdb
  \@prob@currentlabel{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\prob@do@defproblem}
% The default action of the \env{defproblem} environment is to
% define a new problem.
%    \begin{macrocode}
\let\prob@do@defproblem=\prob@do@newproblem
%    \end{macrocode}
%\end{macro}
%
%\begin{environment}{onlysolution}
% Define an environment that only displays its contents if the
% solutions should be displayed.
%    \begin{macrocode}
\newenvironment{onlysolution}{%
   \long@collect@body\do@onlysolution
}{}
%    \end{macrocode}
%\end{environment}
%\begin{macro}{\do@onlysolution}
%    \begin{macrocode}
\newcommand{\do@onlysolution}[1]{%
\ifshowanswers
  #1%
\fi}
%    \end{macrocode}
%\end{macro}
%
%\begin{environment}{onlyproblem}
% Define an environment that only displays its contents if the
% solutions should not be displayed.
%    \begin{macrocode}
\newenvironment{onlyproblem}{%
   \long@collect@body\do@onlyproblem
}{}
%    \end{macrocode}
%\end{environment}
%\begin{macro}{\do@onlyproblem}
%    \begin{macrocode}
\newcommand{\do@onlyproblem}[1]{%
\ifshowanswers
\else
  #1%
\fi}
%    \end{macrocode}
%\end{macro}
%
%\subsection{Using Problems}
%\begin{macro}{\useproblem}
%\begin{definition}
%\cs{useproblem}\oarg{db name}\marg{label}\marg{arg1}\ldots
%\marg{argN}
%\end{definition}
% Use problem identified by \meta{label} in data base
% \meta{db name} where \meta{arg1}\ldots\meta{argN} are the
% arguments to pass to the problem, if the problem was defined
% to take arguments.
%    \begin{macrocode}
\newcommand{\useproblem}[2][default]{%
\prob@showdraftlabel{#1}{#2}%
\let\@next=\relax
\@ifundefined{prob@data@#1@#2}{%
  \PackageError{probsoln}{Problem `#2' is not defined in data set
  `#1'}{}%
}{%
  \def\@next{\csname prob@data@#1@#2\endcsname}%
}%
\@next}
%    \end{macrocode}
%\end{macro}
%\subsection{Loading Problems From Another File}
%\begin{macro}{\loadallproblems}
%\begin{definition}
%\cs{loadallproblems}\oarg{db name}\marg{filename}
%\end{definition}
% Loads all the problems defined in \meta{filename} and adds
% them to data base \meta{db name}. (\cs{par} is temporarily 
% disabled to allow for blank lines between problems.)
%    \begin{macrocode}
\newcommand*{\loadallproblems}[2][default]{%
\bgroup
 \let\par\relax
 \edef\prob@currentdb{#1}%
 \input{#2}%
\egroup
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\prob@do@selectedproblem}
% Only define problem if the label is listed in
% \cs{prob@selectedlabels}. (The current label is
% given by \cs{@prob@currentlabel}.)
%    \begin{macrocode}
\newcommand{\prob@do@selectedproblem}[1]{%
\IfSubStringInString{,\@prob@currentlabel,}{,\prob@selectedlabels,}{%
\prob@do@newproblem{#1}}{}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\loadselectedproblems}
%\begin{definition}
%\cs{loadselectedproblems}\oarg{db name}\marg{list}\marg{filename}
%\end{definition}
% Loads only those problems whose labels are listed in
% \meta{list}.
%    \begin{macrocode}
\newcommand{\loadselectedproblems}[3][default]{%
\bgroup
 \let\par\relax
 \edef\prob@currentdb{#1}%
 \edef\prob@selectedlabels{#2}%
 \let\prob@do@defproblem=\prob@do@selectedproblem
 \input{#3}%
\egroup
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\prob@add@currentlabel}
% Adds the current label to \cs{prob@selectedlabels} (ignores
% argument.)
%    \begin{macrocode}
\newcommand{\prob@add@currentlabel}[1]{%
\ifx\prob@selectedlabels\@empty
 \xdef\prob@selectedlabels{\@prob@currentlabel}%
\else
 \xdef\prob@selectedlabels{\prob@selectedlabels,\@prob@currentlabel}%
\fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\iffirstpass}
% Determines if this is the first pass of the filename when loading
% a data base.
%    \begin{macrocode}
\newif\iffirstpass
\firstpasstrue
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\loadrandomproblems}
%\begin{definition}
%\cs{loadrandomproblems}\oarg{db name}\marg{n}\marg{filename}
%\end{definition}
% Loads \meta{n} randomly selected problems from \meta{filename}.
% Needs to input \meta{filename} twice: the first time just gathers
% all the labels, the second time only loads the selected problems.
%    \begin{macrocode}
\newcommand{\loadrandomproblems}[3][default]{%
\bgroup
 \let\par\relax
 \def\prob@db@reserved{}%
 \def\prob@currentdb{reserved}%
 \edef\prob@selectedlabels{}%
%    \end{macrocode}
% Collect labels:
%    \begin{macrocode}
 \let\prob@do@defproblem=\prob@add@currentlabel
 \firstpasstrue
 \input{#3}%
%    \end{macrocode}
% Shuffle labels.
%    \begin{macrocode}
 \@probselN=0\relax
 \@for\@thislabel:=\prob@selectedlabels\do{%
   \advance\@probselN by 1\relax
   \expandafter
     \edef\csname @prob@tmp@\romannumeral\@probselN\endcsname{%
       \@thislabel}%
 }%
 \shuffle{@prob@tmp@}{\@probselN}%
 \ifnum\@probselN&lt;#2\relax
   \PackageError{probsoln}{%
     Can't select \number#2\space\space problem(s):^^J
     '#3' only contains \number\@probselN\space problem(s)}{%
     Only \number\@probselN\space problem(s) will be selected}%
 \else
   \@probselN=#2\relax
 \fi
%    \end{macrocode}
% Store only the first \meta{n} of the shuffled labels.
%    \begin{macrocode}
 \@probN=0\relax
 \def\prob@selectedlabels{}%
 \whiledo{\@probN&lt;\@probselN}{%
   \advance\@probN by 1\relax
   \ifx\prob@selectedlabels\@empty
     \edef\prob@selectedlabels{%
       \csname @prob@tmp@\romannumeral\@probN\endcsname}%
   \else
     \edef\prob@selectedlabels{%
       \prob@selectedlabels,%
       \csname @prob@tmp@\romannumeral\@probN\endcsname}%
   \fi
 }%
%    \end{macrocode}
% Only load selected labels.
%    \begin{macrocode}
 \let\prob@do@defproblem=\prob@do@selectedproblem
 \firstpassfalse
 \input{#3}%
%    \end{macrocode}
% Move them from the reserved data base into the required data base
% in the order specified by \cs{prob@selectedlabels}
%    \begin{macrocode}
\@ifundefined{prob@db@#1}{\prob@newdb{#1}}{}%
\@for\@thislabel:=\prob@selectedlabels\do{%
  \@moveproblem{\@thislabel}{reserved}{#1}%
}%
%    \end{macrocode}
% \cs{prob@selectedlabels} had to be globally defined. It's no
% longer required to undefine it.
%    \begin{macrocode}
 \let\prob@selectedlabels=\undefined
\egroup
}
%    \end{macrocode}
%\end{macro}
%
%\subsection{Iterating Through a Data Base}
%\begin{macro}{\foreachproblem}
%\begin{definition}
%\cs{foreachproblem}\oarg{db name}\marg{body}
%\end{definition}
% Does \meta{body} for each problem defined in the data base
% \meta{db name}. Within \meta{body}, the command \cs{thisproblem}
% can be used to do the current problem and the command
% \cs{thisproblemlabel} can be used to access the current label.
%    \begin{macrocode}
\newcommand{\foreachproblem}[2][default]{%
\@ifundefined{prob@db@#1}{%
  \PackageError{probsoln}{Data base `#1' is not defined}{}%
}{%
  \expandafter\let\expandafter\@tmp\csname prob@db@#1\endcsname
  \@for\thisproblemlabel:=\@tmp\do{%
    \expandafter\ifnum
       \csname prob@argN@#1@\thisproblemlabel\endcsname&gt;0\relax
       \@ifundefined{prob@args@#1@\thisproblemlabel}{%
         \expandafter\@prob@getargs
           \csname prob@argN@#1@\thisproblemlabel\endcsname
           {#1}{\thisproblemlabel}}{}%
       \expandafter\let\expandafter\thisproblemargs
         \csname prob@args@#1@\thisproblemlabel\endcsname
    \else
       \let\thisproblemargs\@empty
    \fi
    \expandafter\toks@\expandafter{\thisproblemargs}%
    \edef\thisproblem{\noexpand\useproblem[#1]{\thisproblemlabel}%
       \the\toks@}%
    #2%
  }%
}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\foreachdataset}
%\begin{definition}
%\cs{foreachdataset}\marg{cmd}\marg{body}
%\end{definition}
% Iterates through all defined data sets. Assigns \meta{cmd} to the 
% name of the data base.
%    \begin{macrocode}
\newcommand{\foreachdataset}[2]{%
\@for#1:=\prob@databases\do{#2}}
%    \end{macrocode}
%\end{macro}
%
%\subsection{Random Numbers}
% First define some registers for later use.
%    \begin{macrocode}
\newcount\@probN \newcount\@probselN \newcount\@rndselctr
\newcount\r@ndcur
\newcount\@ps@randtmp
\r@ndcur=1\relax
%    \end{macrocode}
%\begin{macro}{\PSNrandseed}
% Set the random generator seed
%    \begin{macrocode}
\newcommand*{\PSNrandseed}[1]{%
\ifnum#1=0\relax
  \PackageWarning{probsoln}{Can't have 0 as random seed, changing to 1}%
  \global\r@ndcur=1\relax
\else
  \global\r@ndcur=#1\relax
\fi
\PackageInfo{probsoln}{Random Seed = \number\r@ndcur}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\PSNgetrandseed}
%    \begin{macrocode}
\newcommand*{\PSNgetrandseed}[1]{#1=\r@ndcur\relax}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\PSNrand}
% Generate a random integer.
%    \begin{macrocode}
\newcommand*{\PSNrand}{%
\@ps@randtmp=\r@ndcur
\multiply\@ps@randtmp by 16807\relax
\r@ndcur=\@ps@randtmp
\global\divide\r@ndcur by 120001\relax
\global\multiply\r@ndcur by 120001\relax
\advance\@ps@randtmp by -\r@ndcur
\global\r@ndcur = \@ps@randtmp
\ifnum\r@ndcur=0\relax
  \global\r@ndcur=1\relax
\fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\PSNrandom}
%\begin{definition}
%\cs{PSNrandom}\marg{count}\marg{n}
%\end{definition}
% stores a random number from 1 to \meta{n}
% in the TeX count register \meta{count}
%    \begin{macrocode}
\newcommand{\PSNrandom}[2]{%
%    \end{macrocode}
% generate new random number.
%    \begin{macrocode}
\PSNrand
#1=\r@ndcur
\@ps@randtmp=\r@ndcur
%    \end{macrocode}
% now set \meta{count} to (\meta{count} mod \meta{n}) + 1
%    \begin{macrocode}
\divide\@ps@randtmp by #2\relax
\multiply\@ps@randtmp by #2\relax
\advance#1 by -\@ps@randtmp
\advance#1 by 1\relax
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\random}
%\begin{definition}
% \cs{random}\marg{counter}\marg{a}\marg{b}
%\end{definition}
% Generate a random number in the range $[a,b]$, and store this
% number in the \LaTeX\ counter \meta{counter}.
%    \begin{macrocode}
\newcommand{\random}[3]{%
\ifnum#2=1\relax
  \PSNrandom{\value{#1}}{#3}%
\else
  \@rndselctr=#3%
  \advance\@rndselctr by -#2\relax
  \advance\@rndselctr by 1\relax
  \PSNrandom{\value{#1}}{\@rndselctr}%
  \addtocounter{#1}{#2}%
  \addtocounter{#1}{-1}%
\fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\shuffle}
% Shuffle contents of pseudo-array. For example, suppose you have
% the following definitions: "\def\fooi{A}", "\def\fooii{B}" and
% "\def\fooiii{C}", then "\shuffle{foo}{3}" will shuffle the
% definitions, so you may end up with, e.g.\ "\def\fooi{C}", 
% "\def\fooii{A}", "\def\fooiii{B}", or some other variation.
%    \begin{macrocode}
\newcount\@shfctr \newcount\@shfA \newcount\@shfB
\newcommand{\shuffle}[2]{%
\@shfctr=1\relax
\whiledo{\@shfctr &lt; 101}{%
\PSNrandom{\@shfA}{#2}\PSNrandom{\@shfB}{#2}%
\ifnum\@shfA=\@shfB
\else
  \edef\@@tmpA{\csname#1\romannumeral\@shfA\endcsname}%
  \let\@tmpA=\@@tmpA
  \edef\@@tmpB{\csname#1\romannumeral\@shfB\endcsname}%
  \let\@tmpB=\@@tmpB
  \expandafter\xdef\csname#1\romannumeral\@shfA\endcsname{\@tmpB}%
  \expandafter\xdef\csname#1\romannumeral\@shfB\endcsname{\@tmpA}%
\fi
\advance\@shfctr by 1\relax
}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\doforrandN}
%\begin{definition}
% \cs{doforrandN}\marg{n}\marg{cmd}\marg{list}\marg{text}.
%\end{definition}
% A bit like \cs{@for} but only for a random subset of the given 
% list. 
% For example, the following will load one problem each from two 
% out of the three listed files.
%\begin{verbatim}
%\doforrandN{2}{\tmp}{file1,file2,file3}{%
%\loadrandomproblems{1}{\tmp}}
%\end{verbatim}
%
%    \begin{macrocode}
\newcount\@ps@forrand
\newcommand{\doforrandN}[4]{%
{\@ps@forrand=0\relax
\@for#2:=#3\do{%
\advance\@ps@forrand by 1\relax
\expandafter\edef\csname @doforrandN@\romannumeral\@ps@forrand\endcsname{#2}}%
\ifnum\@ps@forrand&lt;#1\relax
\PackageError{probsoln}{Can't randomly select \number#1 item(s)}{You 
have requested \number#1 item(s), but there
are only \number\@ps@forrand item(s) in the list}%
\else
\shuffle{@doforrandN@}{\@ps@forrand}%
\ifnum#1&gt;0\relax
\@ps@forrand=0\relax
\loop
\advance\@ps@forrand by 1\relax
\edef#2{\csname @doforrandN@\romannumeral\@ps@forrand\endcsname}%
#4%
\ifnum\@ps@forrand&lt;#1\relax
\repeat
\fi
\fi
}}
%    \end{macrocode}
%\end{macro}
%\subsection{Compatibility With Older Versions}
% These commands ensure that this version is compatible with
% versions prior to v3.0
%\begin{macro}{\newproblem}
% Defines a new problem.
%    \begin{macrocode}
\newcommand*{\newproblem}{\@ifstar\@snewproblem\@newproblem}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@snewproblem}
%    \begin{macrocode}
\newcommand{\@snewproblem}[3][0]{%
\begin{defproblem}[#1]{#2}%
#3%
\end{defproblem}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@newproblem}
%    \begin{macrocode}
\newcommand{\@newproblem}[4][0]{%
\begin{defproblem}[#1]{#2}%
#3%
\begin{onlysolution}%
\begin{solution}%
#4%
\end{solution}%
\end{onlysolution}%
\end{defproblem}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\selectallproblems}
%    \begin{macrocode}
\newcommand*{\selectallproblems}[1]{{\loadallproblems[#1]{#1}}%
\foreachproblem[#1]{\PSNitem\thisproblem\endPSNitem}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\selectrandomly}
%    \begin{macrocode}
\newcommand*{\selectrandomly}[2]{%
{\loadrandomproblems[#1]{#2}{#1}}%
\foreachproblem[#1]{\PSNitem\thisproblem\endPSNitem}%
}
%    \end{macrocode}
%\end{macro}
%\begin{environment}{PSNitem}
%    \begin{macrocode}
\newenvironment{PSNitem}{\item}{}
%    \end{macrocode}
%\end{environment}
%
%\subsection{Formatting Commands}
% These commands are provided to format parts of the
% problems/solutions.
%\begin{environment}{solution}
%    \begin{macrocode}
\@ifundefined{solution}{%
\newenvironment{solution}{\par\noindent\textbf{\solutionname:}}{}%
}{}
%    \end{macrocode}
%\end{environment}
%\begin{macro}{\solutioname}
%    \begin{macrocode}
\newcommand*{\solutionname}{Solution}
%    \end{macrocode}
%\end{macro}
% Define an in-line enumeration which uses the enumeration
% environment's counters.
%\begin{environment}{textenum}
%\changes{2007 Oct 6}{2.05}{new}
%    \begin{macrocode}
\newenvironment{textenum}{%
\ifnum\@enumdepth&gt;\thr@@
  \@toodeep
\else
  \advance\@enumdepth\@ne
  \edef\@enumctr{enum\romannumeral\the\@enumdepth}%
  \let\@item\@textitem
  \def\@itemlabel{\refstepcounter{\@enumctr}%
    \csname label\@enumctr\endcsname}%
  \setcounter{\@enumctr}{0}%
\fi\ignorespaces}{%
\global\advance\@enumdepth\m@ne}
%    \end{macrocode}
%\end{environment}
%\begin{macro}{\@textitem}
% In-line enumeration item
%    \begin{macrocode}
\def\@textitem[#1]{#1\space\ignorespaces}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\correctitemformat}
% \changes{2007 Oct 6}{2.05}{new}
% Indicates how to format the item label for \cs{correctitem} when
% the solutions are shown. The argument is the label. This
% defaults to placing the argument in a box.
%    \begin{macrocode}
\newcommand*{\correctitemformat}[1]{\fbox{#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\incorrectitemformat}
% \changes{2007 Oct 6}{2.05}{new}
% Indicates how to format the item label for \cs{incorrectitem} when
% the solutions are shown. The argument is the label. This
% defaults to just the argument shifted
% by \cs{fboxsep} + \cs{fboxrule} to ensure it aligns
% with the default \cs{correctitemformat}.
%    \begin{macrocode}
\newcommand*{\incorrectitemformat}[1]{%
\hspace{\fboxsep}\hspace{\fboxrule}#1}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\correctitem}
% \changes{2007 Oct 6}{2.05}{new}
%This can be used instead of \cs{item}. If the solutions are
% not shown, it behaves like \cs{item}, otherwise, it's like
% \cs{item}, but the label is formatted according to
% \cs{correctitemformat}.
%    \begin{macrocode}
\newcommand*{\correctitem}{\@inmatherr\correctitem
\@ifnextchar[\@correctitem{\@noitemargtrue\@correctitem[\@itemlabel]}}
%    \end{macrocode}
%    \begin{macrocode}
\def\@correctitem[#1]{%
\ifshowanswers
  \@item[\correctitemformat{#1}]%
\else
  \@item[#1]%
\fi}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\incorrectitem}
% \changes{2007 Oct 6}{2.05}{new}
%This can be used instead of \cs{item}. If the solutions are
% not shown, it behaves like \cs{item}, otherwise, it's like
% \cs{item}, but the label is formatted according to
% \cs{incorrectitemformat}.
%    \begin{macrocode}
\newcommand*{\incorrectitem}{\@inmatherr\incorrectitem
\@ifnextchar[\@incorrectitem{\@noitemargtrue\@incorrectitem[\@itemlabel]}}
%    \end{macrocode}
%    \begin{macrocode}
\def\@incorrectitem[#1]{%
\ifshowanswers
  \@item[\incorrectitemformat{#1}]%
\else
  \@item[#1]%
\fi}
%    \end{macrocode}
%\end{macro}
%\iffalse
%    \begin{macrocode}
%&lt;/probsoln.sty&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;*1stprncp.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
 % These all involve differentiating from 1st principles

\newproblem{dfp:xcube}{%
Differentiate $f(x) = x^3$ with respect to $x$ by first principles.}{%
\begin{eqnarray*}
\frac{dy}{dx} &amp; = &amp; \lim_{\Delta x\rightarrow 0}\frac{f(x+\Delta x) - f(x)}{\Delta x}\\
 &amp; = &amp; \lim_{\Delta x\rightarrow 0}\frac{(x+\Delta x)^3-x^3}{\Delta x}\\
 &amp; = &amp; \lim_{\Delta x\rightarrow 0}\frac{(x+\Delta x)(x^2+2x\Delta x+(\Delta x)^2)-x^3}{\Delta x}\\
 &amp; = &amp; \lim_{\Delta x\rightarrow 0}\frac{x^3+3x^2\Delta x+3x(\Delta x)^2+(\Delta x)^3-x^3}{\Delta x}\\
 &amp; = &amp; \lim_{\Delta x\rightarrow 0}\frac{3x^2\Delta x+3x(\Delta x)^2+(\Delta x)^3}{\Delta x}\\
 &amp; = &amp; \lim_{\Delta x\rightarrow 0}3x^2+3x\Delta x + (\Delta x)^2\\
 &amp; = &amp; 3x^2
\end{eqnarray*}}

\newproblem{dfp:Ioverxsq}{%
Differentiate $\displaystyle f(x) = \frac{1}{x^2}$ with respect to $x$ by first principles.}{%
\begin{eqnarray*}
\frac{df}{dx} &amp; = &amp; \lim_{\Delta x\rightarrow 0}\frac{\frac{1}{(x+\Delta x)^2}-\frac{1}{x^2}}{\Delta x}\\
 &amp; = &amp; \lim_{\Delta x\rightarrow 0}\frac{\frac{x^2-(x+\Delta x)^2}{x^2(x+\Delta x)^2}}{\Delta x}\\
 &amp; = &amp; \lim_{\Delta x\rightarrow 0}\frac{x^2-(x^2+2x\Delta x+(\Delta x)^2)}{x^2\Delta x(x+\Delta x)^2}\\
 &amp; = &amp; \lim_{\Delta x\rightarrow 0}\frac{-2x\Delta x-(\Delta x)^2}{x^2\Delta x(x+\Delta x)^2}\\
 &amp; = &amp; \lim_{\Delta x\rightarrow 0}\frac{-2x-\Delta x}{x^2(x+\Delta x)^2}\\
 &amp; = &amp; \frac{-2x}{x^2x^2}\\
 &amp; = &amp; -\frac{2}{x^3}
\end{eqnarray*}}

\newproblem{dfp:sqrtx}{%
Differentiate from first principles $f(x) = \surd x$}{%
\begin{eqnarray*}
\frac{df}{dx} &amp; = &amp; \lim_{\Delta x\rightarrow 0}\frac{\sqrt{x+\Delta x}-\surd x}{\Delta x}\\
 &amp; = &amp; \lim_{\Delta x\rightarrow 0}\frac{(\sqrt{x+\Delta x}-\surd x)(\sqrt{x+\delta x}+\surd x)}{\Delta x(\sqrt{x+\Delta x}+\surd x)}\\
 &amp; = &amp; \lim_{\Delta x\rightarrow 0}\frac{x+\Delta x - x}{\Delta x(\sqrt{x+\Delta x}+\surd x)}\\
 &amp; = &amp; \lim_{\Delta x\rightarrow 0}\frac{\Delta x}{\Delta x(\sqrt{x+\Delta x}+\Delta x)}\\
 &amp; = &amp; \lim_{\Delta x\rightarrow 0}\frac{1}{\sqrt{x+\Delta x}+\surd x}\\
 &amp; = &amp; \frac{1}{2\surd x}
\end{eqnarray*}}

\newproblem{dfp:cons}{%
Differentiate from first principles $f(x) = c$ where $c$ is a constant.}{%
\begin{eqnarray*}
\frac{df}{dx} &amp; = &amp; \lim_{\Delta x\rightarrow 0}\frac{c-c}{\Delta x}\\
 &amp; = &amp; \lim_{\Delta x\rightarrow 0}0\\
 &amp; = &amp; 0
\end{eqnarray*}}

\newproblem{dfp:cosx}{%
Given 
\begin{eqnarray*}
\lim_{x \rightarrow 0} \frac{\cos x - 1}{x} &amp; = &amp; 0\\
\lim_{x \rightarrow 0} \frac{\sin x}{x} &amp; = &amp; 1
\end{eqnarray*}
differentiate from first principles $f(x) = \cos x$.}{%
\begin{eqnarray*}
\frac{df}{dx} &amp; = &amp; \lim_{\Delta x \rightarrow 0}\frac{f(x + \Delta x) - f(x)}{\Delta x}\\
 &amp; = &amp; \lim_{\Delta x \rightarrow 0} \frac{\cos(x + \Delta x) - \cos(x)}{\Delta x}\\
 &amp; = &amp; \lim_{\Delta x \rightarrow 0} \frac{\cos x\cos\Delta x - \sin x\sin\Delta x - \cos x}{\Delta x}\\
 &amp; = &amp; \lim_{\Delta x \rightarrow 0} \frac{\cos x(\cos\Delta x - 1) - \sin x\sin\Delta x}{\Delta x}\\
 &amp; = &amp; \cos x\lim_{\Delta x \rightarrow 0}\frac{\cos\Delta x - 1}{\Delta x} 
      - \sin x\lim_{\Delta x \rightarrow 0}\frac{\sin\Delta x}{\Delta x}\\
 &amp; = &amp; -1 \qquad\mbox{(using given results)}
\end{eqnarray*}}
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;/1stprncp.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;*args.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
 % These problems require arguments

 % Arguments: #1-&gt;a_2, #2-&gt;a_1 and #3-&gt;a_0
 % (Arguments must be integers)
\newcount\ctr
\newproblem[3]{diff:quad}{%
\(f(x) = 
\ifnum#1=0
\else
\ifnum#1=1\else#1\fi x^2 
\fi
\ifnum#2=0
\else
\ifnum#2&gt;0 \ifnum#1=0 \else + \fi \fi
\ifnum#2=1\else#2\fi x 
\fi
\ifnum#3=0
\else
\ifnum#3&gt;0 \ifnum#2=0 \ifnum#1=0 \else + \fi \else + \fi\fi
#3
\fi\)
}{%
\(f'(x) = 
\ifnum#1=0
\else
\ctr=2
\multiply\ctr by #1
\the\ctr x 
\fi
\ifnum#2=0
\else
\ifnum#2&gt;0 \ifnum#1=0 \else + \fi \fi
#2
\fi
 % print 0 if both #1 and #2 are 0
\ifnum#1=0 \ifnum#2=0 0 \fi\fi 
\)
}

\newproblem[1]{diff:sin}{%
\(f(x) = \sin(#1x)\)
}{%
\(f'(x) = #1\cos(#1x)\)
}

%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;/args.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;*easy.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
 % These are all easy differentiation problems

\newproblem{diffeasy:gpowh}{%
\(f(x) = g(x)^{h(x)}.\)}{%
\begin{eqnarray*}
f(x) &amp; = &amp; e^{\ln g(x)^{h(x)}}\\
 &amp; = &amp; e^{h(x)\ln g(x)}\\
f'(x) &amp; = &amp; e^{h(x)\ln g(x)}(h'(x)\ln g(x) + h(x)\frac{g'(x)}{g(x)})\\
 &amp; = &amp; g(x)^{h(x)}(h'(x)\ln g(x) + \frac{h(x)g'(x)}{g(x)})
\end{eqnarray*}}

\newproblem{diffeasy:arcsin}{%
\(y = \arcsin(x)\)}{%
\[\sin(y) = x\]
diff. w.r.t. $x$:
\begin{eqnarray*}
\cos y \frac{dy}{dx} &amp; = &amp; 1\\
\frac{dy}{dx} &amp; = &amp; \frac{1}{\cos y}\\
 &amp; = &amp; \frac{1}{\sqrt{1 - \sin^2y}}\\
 &amp; = &amp; \frac{1}{\sqrt{1-x^2}}.
\end{eqnarray*}}

\newproblem{diffeasy:arccos}{%
$y = \arccos x$.}{%
\(\cos y = x\)
diff. w.r.t. $x$:
\begin{eqnarray*}
-\sin y \frac{dy}{dx} &amp; = &amp; 1\\
\frac{dy}{dx} &amp; = &amp; \frac{-1}{\sin y}\\
 &amp; = &amp; \frac{-1}{\sqrt{1-\cos^2y}}\\
 &amp; = &amp; \frac{-1}{\sqrt{1-x^2}}
\end{eqnarray*}}

\newproblem{diffeasy:tan}{%
\(y = \tan x\)}{%
\begin{eqnarray*}
y &amp; = &amp; \tan x\\
 &amp; = &amp; \frac{\sin x}{\cos x}\\
\frac{dy}{dx} &amp; = &amp; \frac{\cos x}{\cos x} + \sin x\times\frac{-1}{\cos^2x}\times -\sin x\\
 &amp; = &amp; 1 + \tan^2x\\
 &amp; = &amp; \sec^2x.
\end{eqnarray*}}

\newproblem{diffeasy:arctan}{%
\(y = \arctan x = \tan^{-1}x\)}{%
\[\tan y = x\]
diff w.r.t. $x$:
\begin{eqnarray*}
\sec^2y\frac{dy}{dx} &amp; = &amp; 1\\
\frac{dy}{dx} &amp; = &amp; \frac{1}{\sec^2y}\\
 &amp; = &amp; \frac{1}{1+\tan^2y}\\
 &amp; = &amp; \frac{1}{1+x^2}
\end{eqnarray*}}

\newproblem{diffeasy:cot}{%
\(y = (\tan x)^{-1} = \cot x\)}{%
\begin{eqnarray*}
\frac{dy}{dx} &amp; = &amp; -(\tan x)^{-2}\sec^2x\\
 &amp; = &amp; -\frac{\cos^2x}{\sin^2x}\cdot\frac{1}{\cos^2x}\\
 &amp; = &amp; \frac{-1}{\sin^2x}\\
 &amp; = &amp; -\csc^2x.
\end{eqnarray*}}

\newproblem{diffeasy:cosxsqsinx}{%
$y = \cos(x^2)\sin x$.}{%
\[\frac{dy}{dx} = -\sin(x^2)2x\sin x + \cos(x^2)\cos x\]}

\newproblem{diffeasy:xlnx}{%
$y = (x+1)\ln(x+1)$.}{%
\begin{eqnarray*}
\frac{dy}{dx} &amp; = &amp; \ln(x+1) + \frac{x+1}{x+1}\\
 &amp; = &amp; 1 + \ln(x+1).
\end{eqnarray*}}

\newproblem{diffeasy:glng}{%
$f(x) = g(x)\ln(g(x))$.}{%
\begin{eqnarray*}
f'(x) &amp; = &amp; g'(x)\ln(g(x)) + \frac{g(x)}{g(x)}g'(x)\\
 &amp; = &amp; g'(x)(1+\ln(g(x))).
\end{eqnarray*}}

\newproblem{diffeasy:sinx/x}{%
$y = \frac{\sin x}{x}$.}{%
\[\frac{dy}{dx} = \frac{\cos x}{x} - \frac{\sin x}{x^2}\]}

%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;/easy.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;*easy2.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
 % These are all easy differentiation problems

\begin{defproblem}{diffeasy:gpowh}%
\begin{onlyproblem}%
\(f(x) = g(x)^{h(x)}.\)%
\end{onlyproblem}%
\begin{onlysolution}%
\begin{eqnarray*}
f(x) &amp; = &amp; e^{\ln g(x)^{h(x)}}\\
 &amp; = &amp; e^{h(x)\ln g(x)}\\
f'(x) &amp; = &amp; e^{h(x)\ln g(x)}(h'(x)\ln g(x) + h(x)\frac{g'(x)}{g(x)})\\
 &amp; = &amp; g(x)^{h(x)}(h'(x)\ln g(x) + \frac{h(x)g'(x)}{g(x)})
\end{eqnarray*}%
\end{onlysolution}%
\end{defproblem}

\begin{defproblem}{diffeasy:arcsin}%
\begin{onlyproblem}%
\(y = \arcsin(x)\)%
\end{onlyproblem}%
\begin{onlysolution}%
\[\sin(y) = x\]
diff. w.r.t. $x$:
\begin{eqnarray*}
\cos y \frac{dy}{dx} &amp; = &amp; 1\\
\frac{dy}{dx} &amp; = &amp; \frac{1}{\cos y}\\
 &amp; = &amp; \frac{1}{\sqrt{1 - \sin^2y}}\\
 &amp; = &amp; \frac{1}{\sqrt{1-x^2}}.
\end{eqnarray*}
\end{onlysolution}%
\end{defproblem}

\begin{defproblem}{diffeasy:arccos}%
\begin{onlyproblem}%
$y = \arccos x$.%
\end{onlyproblem}%
\begin{onlysolution}%
\(\cos y = x\)
diff. w.r.t. $x$:
\begin{eqnarray*}
-\sin y \frac{dy}{dx} &amp; = &amp; 1\\
\frac{dy}{dx} &amp; = &amp; \frac{-1}{\sin y}\\
 &amp; = &amp; \frac{-1}{\sqrt{1-\cos^2y}}\\
 &amp; = &amp; \frac{-1}{\sqrt{1-x^2}}
\end{eqnarray*}
\end{onlysolution}%
\end{defproblem}

\begin{defproblem}{diffeasy:tan}%
\begin{onlyproblem}%
\(y = \tan x\)%
\end{onlyproblem}
\begin{onlysolution}%
\begin{eqnarray*}
y &amp; = &amp; \tan x\\
 &amp; = &amp; \frac{\sin x}{\cos x}\\
\frac{dy}{dx} &amp; = &amp; \frac{\cos x}{\cos x} + \sin x\times\frac{-1}{\cos^2x}\times -\sin x\\
 &amp; = &amp; 1 + \tan^2x\\
 &amp; = &amp; \sec^2x.
\end{eqnarray*}
\end{onlysolution}%
\end{defproblem}

\begin{defproblem}{diffeasy:arctan}%
\begin{onlyproblem}%
\(y = \arctan x = \tan^{-1}x\)%
\end{onlyproblem}%
\begin{onlysolution}%
\[\tan y = x\]
diff w.r.t. $x$:
\begin{eqnarray*}
\sec^2y\frac{dy}{dx} &amp; = &amp; 1\\
\frac{dy}{dx} &amp; = &amp; \frac{1}{\sec^2y}\\
 &amp; = &amp; \frac{1}{1+\tan^2y}\\
 &amp; = &amp; \frac{1}{1+x^2}
\end{eqnarray*}
\end{onlysolution}%
\end{defproblem}

\begin{defproblem}{diffeasy:cot}%
\begin{onlyproblem}%
\(y = (\tan x)^{-1} = \cot x\)%
\end{onlyproblem}
\begin{onlysolution}%
\begin{eqnarray*}
\frac{dy}{dx} &amp; = &amp; -(\tan x)^{-2}\sec^2x\\
 &amp; = &amp; -\frac{\cos^2x}{\sin^2x}\cdot\frac{1}{\cos^2x}\\
 &amp; = &amp; \frac{-1}{\sin^2x}\\
 &amp; = &amp; -\csc^2x.
\end{eqnarray*}
\end{onlysolution}%
\end{defproblem}

\begin{defproblem}{diffeasy:cosxsqsinx}%
\begin{onlyproblem}%
$y = \cos(x^2)\sin x$.%
\end{onlyproblem}%
\begin{onlysolution}%
\[\frac{dy}{dx} = -\sin(x^2)2x\sin x + \cos(x^2)\cos x\]
\end{onlysolution}%
\end{defproblem}

\begin{defproblem}{diffeasy:xlnx}%
\begin{onlyproblem}%
$y = (x+1)\ln(x+1)$.
\end{onlyproblem}%
\begin{onlysolution}%
\begin{eqnarray*}
\frac{dy}{dx} &amp; = &amp; \ln(x+1) + \frac{x+1}{x+1}\\
 &amp; = &amp; 1 + \ln(x+1).
\end{eqnarray*}
\end{onlysolution}
\end{defproblem}

\begin{defproblem}{diffeasy:glng}%
\begin{onlyproblem}%
$f(x) = g(x)\ln(g(x))$.
\end{onlyproblem}
\begin{onlysolution}%
\begin{eqnarray*}
f'(x) &amp; = &amp; g'(x)\ln(g(x)) + \frac{g(x)}{g(x)}g'(x)\\
 &amp; = &amp; g'(x)(1+\ln(g(x))).
\end{eqnarray*}
\end{onlysolution}%
\end{defproblem}

\begin{defproblem}{diffeasy:sinx/x}
\begin{onlyproblem}%
$y = \frac{\sin x}{x}$.
\end{onlyproblem}
\begin{onlysolution}%
\[\frac{dy}{dx} = \frac{\cos x}{x} - \frac{\sin x}{x^2}\]
\end{onlysolution}%
\end{defproblem}

%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;/easy2.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;*implicit.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
 % These are all implicit differentiation problems

\newproblem{imd:circ}{%
Find the gradient of the unit circle ($x^2 + y^2 = 1$).}{%
Differentiating with respect to $x$ gives:
\begin{eqnarray*}
2x + 2y\frac{dy}{dx} &amp; = &amp; 0\\
\frac{dy}{dx} &amp; = &amp; \frac{-2x}{2y}\\
 &amp; = &amp; \frac{-x}{\sqrt{1-x^2}}.
\end{eqnarray*}}

\newproblem{imd:ysq:xcuov2mx}{%
Find $\frac{dy}{dx}$, given
\begin{displaymath}
y^2 = \frac{x^3}{2-x}
\end{displaymath}}{%
Differentiating both sides w.r.t.\ $x$:
\begin{eqnarray*}
2y\frac{dy}{dx} &amp; = &amp; \frac{(2-x)3x^2 - x^3(-1)}{(2-x)^2}\\
 &amp; = &amp; \frac{3x^2(2-x) + x^3}{(2-x)^2}\\
 &amp; = &amp; \frac{6x^2 - 3x^3 + x^3}{(2-x)^2}\\
 &amp; = &amp; \frac{6x^2-2x^3}{(2-x)^2}\\
 &amp; = &amp; 2x^2\frac{3-x}{(2-x)^2}
\end{eqnarray*}
Therefore
\begin{displaymath}
y\frac{dy}{dx} = x^2\frac{3-x}{(2-x)^2}
\end{displaymath}}

\newproblem{imd:exy:IIxay}{%
Differentiate w.r.t.\ $x$:
\begin{displaymath}
e^{xy} = 2x + y
\end{displaymath}}{%
Differentiating both sides w.r.t.\ $x$:
\begin{eqnarray*}
e^{xy}(1y + x\frac{dy}{dx}) &amp; = &amp; 2 + \frac{dy}{dx}\\
xe^{xy}\frac{dy}{dx} - \frac{dy}{dx} &amp; = &amp; 2 - ye^{xy} \\
\frac{dy}{dx}(xe^{xy}-1) &amp; = &amp; 2 - ye^{xy}\\
\frac{dy}{dx} &amp; = &amp; \frac{2-ye^{xy}}{xe^{xy}-1}
\end{eqnarray*}}
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;/implicit.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;*mchoice.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
\newproblem{mc:prod}{%
Which of the following is the derivative of $x\sin(x)$?
(Circle the correct answer.)
\ifthenelse{\boolean{showanswers}}{}%
{\begin{description}
\item[A] $\sin(x)$
\item[B] $x\cos(x)$
\item[C] $\sin(x) + x\cos(x)$
\end{description}
}}{%
\begin{description}
\item[A] $\sin(x)$
\item[B] $x\cos(x)$
\item[\textcircled{C}] $\sin(x) + x\cos(x)$ (product rule).
\end{description}
}

\newproblem{mc:quot}{%
Which of the following is the derivative of $\frac{\sin(x)}{x}$?
(Circle the correct answer.)
\ifthenelse{\boolean{showanswers}}{}%
{\begin{description}
\item[A] $\sin(x)$
\item[B] $\cos(x)$
\item[C] $\frac{\cos(x)x-\sin(x)}{x^2}$
\end{description}
}}{%
\begin{description}
\item[A] $\sin(x)$
\item[B] $\cos(x)$
\item[\textcircled{C}] $\frac{\cos(x)x-\sin(x)}{x^2}$
(quotient rule)
\end{description}
}
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;/mchoice.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;*newdata.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
\begin{defproblem}{sample}
\begin{onlyproblem}
Differentiate $y=\sin x$
\end{onlyproblem}
\begin{onlysolution}
$y'=\cos x$
\end{onlysolution}
\end{defproblem}

\begin{defproblem}[1]{sample2}
\begin{onlyproblem}
Differentiate $y = \sin(#1x)$
\end{onlyproblem}
\begin{onlysolution}
$y'=#1\cos #1x$
\end{onlysolution}
\end{defproblem}

\begin{defproblem}{sample3}
\begin{onlyproblem}
Differentiate $y = x^2$.
\end{onlyproblem}
\begin{onlysolution}
$y' = 2x$
\end{onlysolution}
\end{defproblem}
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;/newdata.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;*nosoln.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
 % these problems don't have solutions

\newproblem*{oop}{Describe what is meant by object-oriented
programming.}

\newproblem*{inheritance}{Describe what is meant by the term 
\emph{inheritance} in object-oriented programming. Use examples.}
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;/nosoln.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;*probspaces.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
 % Finite probability spaces
\newproblem{weightedcoin}{%
A coin is weighted so that heads is four times as likely
as tails. Find the probability that:
\begin{textenum}
\item tails appears,
\item heads appears
\end{textenum}}{%
Let $p=P(T)$, then $P(H)=4p$. We require $P(H)+P(T)=1$,
so $4p+p=1$, hence $p=\frac{1}{5}$. Therefore:
\begin{textenum}
\item $P(T)=\frac{1}{5}$,
\item $P(H)=\frac{4}{5}$
\end{textenum}}

\newproblem*{validprobspaces}{%
Under which of the following functions does 
$S=\{a_1,a_2\}$ become a probability space?
\par
\begin{textenum}
\begin{tabular}{ll}
\incorrectitem $P(a_1)=\frac{1}{3}$, $P(a_2)=\frac{1}{2}$
&amp;
\correctitem $P(a_1)=\frac{3}{4}$, $P(a_2)=\frac{1}{4}$
\\
\correctitem $P(a_1)=1$, $P(a_2)=0$
&amp;
\incorrectitem $P(a_1)=\frac{5}{4}$, $P(a_2)=-\frac{1}{4}$
\end{tabular}
\end{textenum}
}
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;/probspaces.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;*probspaces2.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
 % Finite probability spaces
\begin{defproblem}{weightedcoin}
\begin{onlyproblem}%
A coin is weighted so that heads is four times as likely
as tails. Find the probability that:
\begin{textenum}
\item tails appears,
\item heads appears
\end{textenum}
\end{onlyproblem}
\begin{onlysolution}%
Let $p=P(T)$, then $P(H)=4p$. We require $P(H)+P(T)=1$,
so $4p+p=1$, hence $p=\frac{1}{5}$. Therefore:
\begin{textenum}
\item $P(T)=\frac{1}{5}$,
\item $P(H)=\frac{4}{5}$
\end{textenum}
\end{onlysolution}
\end{defproblem}

\begin{defproblem}{validprobspaces}
\begin{onlyproblem}%
Under which of the following functions does 
$S=\{a_1,a_2\}$ become a probability space?
\par
\begin{textenum}
\begin{tabular}{ll}
\item $P(a_1)=\frac{1}{3}$, $P(a_2)=\frac{1}{2}$
&amp;
\item\label{validprobspacescorrect1} $P(a_1)=\frac{3}{4}$, $P(a_2)=\frac{1}{4}$
\\
\item\label{validprobspacescorrect2} $P(a_1)=1$, $P(a_2)=0$
&amp;
\item $P(a_1)=\frac{5}{4}$, $P(a_2)=-\frac{1}{4}$
\end{tabular}
\end{textenum}
\end{onlyproblem}%
\begin{onlysolution}%
\ref{validprobspacescorrect1} and \ref{validprobspacescorrect2}%
\end{onlysolution}
\end{defproblem}
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;/probspaces2.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;*sample.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
\documentclass[a4paper]{article}

\usepackage{probsoln}
 %uncomment the following line to display the answers
\showanswers

 % The following will generate a different set of
 % problems in subsequent years
 %\PSNrandseed{\year}
\PSNrandseed{2007}

\begin{document}
\title{Sample Problem Sheet}
\author{Nicola Talbot}
\maketitle

\begin{enumerate}
 % Differentiation from first principles
\selectrandomly{1stprncp}{1}

\item Differentiate the following functions:
\newcount\oldseed
\PSNgetrandseed\oldseed
\begin{enumerate}
\selectrandomly{easy}{5}
\end{enumerate}
\PSNrandseed\oldseed

 % Implicit differentiation
\selectrandomly{implicit}{2}

 % Finite probability spaces
\selectrandomly{probspaces}{2}

 % Multiple choice question
\selectrandomly{mchoice}{1}

 % select one essay style question that doesn't come with a solution

\selectrandomly{nosoln}{1}
\end{enumerate}
\end{document}
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;/sample.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;*sample2.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
\documentclass[a4paper]{article}

\usepackage{probsoln}
 %uncomment the following line to display the answers
\showanswers

 % The following will generate a different set of
 % problems in subsequent years
 %\PSNrandseed{\year}

 % The following will generate a different set of
 % problems on every run (where each run is at
 % least a minute apart from the previous one)
\PSNrandseed{\time}

\begin{document}
\title{Sample Problem Sheet}
\author{Nicola Talbot}
\maketitle

\begin{enumerate}

\newcounter{numproblems}
 % store a random number from 1 to 3 in the counter numproblems
\random{numproblems}{1}{3}

 % selects 1,2 or 3 problems from 1 of the given files:
\doforrandN{1}{\file}{1stprncp,implicit}{\selectrandomly{\file}{\value{numproblems}}}

\item Differentiate the following functions:
\input{args}% load database
\begin{enumerate}
\newcounter{A}
\newcounter{B}
\newcounter{C}
\random{A}{-4}{5}
\random{B}{-3}{3}
\random{C}{-1}{10}
\item \useproblem{diff:quad}{\arabic{A}}{\arabic{B}}{\arabic{C}}

\random{A}{-5}{5}
 % make sure its not 0
\whiledo{\value{A}=0}{\random{A}{-5}{5}}
\item \useproblem{diff:sin}{\arabic{A}}
\end{enumerate}
\end{enumerate}
\end{document}
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;/sample2.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;*sample3.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
\documentclass[a4paper]{article}

\usepackage{longtable}
\usepackage{probsoln}

 %\showanswers

\newcounter{problem}
\renewcommand{\PSNitem}{\refstepcounter{problem}%
\theproblem. }
\renewcommand{\endPSNitem}{\\}

\renewenvironment{solution}{}{}

\newcommand{\selected}{\fbox{$\times$}}
\newcommand{\notselected}{\fbox{\phantom{$\times$}}}

\begin{document}
\begin{longtable}{lrrrl}
\bfseries Question &amp; \bfseries A &amp; \bfseries B &amp; 
\bfseries C &amp; \ifshowanswers \bfseries Reason\fi\\
\selectrandomly{tabmchoice}{2}
\end{longtable}
\end{document}
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;/sample3.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;*sample4.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
\documentclass[a4paper]{article}

\usepackage{probsoln}

 % Sample file illustrating use of \selectallproblems
 % All problems defined in specified file will be used
 % in order of definition

\showanswers

\begin{document}
Differentiate the following functions:
\begin{enumerate}
\selectallproblems{easy}
\end{enumerate}
\end{document}
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;/sample4.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;*sample5.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
\documentclass[a4paper]{report}

\usepackage{probsoln}

\begin{document}

\hideanswers

\chapter{Easy Problems}
\loadrandomproblems[easyproblems]{5}{easy2}

\renewcommand{\theenumi}{\thechapter.\arabic{enumi}}
\begin{enumerate}
\foreachproblem[easyproblems]{\item\label{prob:\thisproblemlabel}\thisproblem}
\end{enumerate}

\chapter{Probability Spaces}
\loadrandomproblems[probspaces]{2}{probspaces2}

\renewcommand{\theenumi}{\thechapter.\arabic{enumi}}
\begin{enumerate}
\foreachproblem[probspaces]{\item\label{prob:\thisproblemlabel}\thisproblem}
\end{enumerate}

\appendix
\chapter{Solutions}
\showanswers
\begin{enumerate}
\foreachdataset{\thisdataset}{%
\foreachproblem[\thisdataset]{\item[\ref{prob:\thisproblemlabel}]\thisproblem}
}
\end{enumerate}

\end{document}
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;/sample5.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;*tabmchoice.tex&gt;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
 % These problems are designed to be placed in a
 % tabular environment
 %
\newproblem{tab:1}{%
What is $(3+2)\times5$? &amp;
25 \ifshowanswers\selected\else\notselected\fi &amp;
13 \notselected &amp;
10 \notselected &amp;
}{Brackets come first}%

\newproblem{tab:2}{%
What is $-1+2\times3$? &amp;
3 \notselected &amp;
-7 \notselected &amp;
5 \ifshowanswers\selected\else\notselected\fi &amp;
}{Multiplication comes first}%
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%&lt;/tabmchoice.tex&gt;
%    \end{macrocode}
%\fi
%\Finale
\endinput
</pre></body></html>