summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/latex/probsoln/probsoln-manual.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/doc/latex/probsoln/probsoln-manual.tex')
-rw-r--r--Master/texmf-dist/doc/latex/probsoln/probsoln-manual.tex781
1 files changed, 781 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/latex/probsoln/probsoln-manual.tex b/Master/texmf-dist/doc/latex/probsoln/probsoln-manual.tex
new file mode 100644
index 00000000000..aae8befbed2
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/probsoln/probsoln-manual.tex
@@ -0,0 +1,781 @@
+\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{creatdtx}
+\ifmakedtx{
+\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}
+}
+{
+\usepackage{html}
+\usepackage{makeidx}
+\renewcommand{\LaTeX}{LaTeX}
+\renewcommand{\LaTeXe}{LaTeX2e}
+\newcommand{\dq}[1]{"#1"}
+\newenvironment{important}{\textbf{NOTE:} }{}
+\newenvironment{definition}{\htmlrule}{\htmlrule}
+\html{\newcommand{\SpecialMainIndex}[1]{\index{#1@\cs{#1}}}}
+}
+
+\newcommand*{\ics}[1]{\cs{#1}\SpecialMainIndex{#1}}
+
+\ifmakedtx{
+\newcommand{\pkgopt}[1]{\textsf{#1}\index{package options>#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}}
+}
+{
+\newcommand{\pkgopt}[1]{\texttt{#1}\index{package options!#1@\texttt{#1}}}
+\newcommand{\sty}[1]{\texttt{#1}}
+\newcommand{\isty}[1]{\sty{#1}\index{#1@\sty{#1}}}
+\newcommand{\env}[1]{\texttt{#1}}
+\newcommand{\ienv}[1]{\env{#1}\index{#1 environment@\env{#1} environment}}
+\newcommand*{\bool}[1]{\texttt{#1}\index{#1 boolean variable@\texttt{#1} boolean variable}}
+\newcommand{\csdef}[1]{\ics{#1}}
+\renewcommand{\DescribeEnv}[1]{\index{#1 environment@\env{#1} environment}}
+\newcommand{\toTop}{\mbox{}\par\htmlref{Top}{top}}
+}
+
+\begin{document}\ifmakedtx{}{\label{top}}
+\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.
+\ifmakedtx{}{\toTop}
+
+\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}
+\ifmakedtx{}{\toTop}
+
+\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}
+\ifmakedtx{}{\toTop}
+
+\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
+\ifmakedtx{\autoref{sec:showanswers}}{\htmlref{Showing and
+Hiding Solutions}{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) &= 2^x = \exp(\ln(x^2)) =\exp(2\ln(x))\\
+f'(x) &= \exp(2\ln(x))\times \frac{2}{x}\\
+ &= f(x)\frac{2}{x}
+\end{align*}
+\item
+\begin{align*}
+f(x) &= \cot(x) = (\tan(x))^{-2}\\
+f'(x) &= -(\tan(x))^{-2}\times\sec^2(x)\\
+&=-\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
+\ifmakedtx{\href{http://www.tex.ac.uk/tex-archive/help/Catalogue/bytopic.html\#enumeration}{TeX
+Catalogue}}{\htmladdnormallink{TeX
+Catalogue}{http://www.tex.ac.uk/tex-archive/help/Catalogue/bytopic.html\#enumeration}} 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}
+\ifmakedtx{}{\toTop}
+
+\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 \&, 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
+\ifmakedtx{\autoref{sec:load}}{\htmlref{Loading Problems From
+External Files}{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
+\ifmakedtx{\autoref{sec:showanswers} and
+\autoref{sec:formatting}}{\htmlref{Showing and Hiding
+Solutions}{sec:showanswers} and \htmlref{General Formatting
+Commands}{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}
+\ifmakedtx{}{\toTop}
+
+\section{Using a Problem}\label{sec:useproblem}
+
+Once you have defined a problem using \ienv{defproblem} or
+\cs{newproblem} (see
+\ifmakedtx{\autoref{sec:defproblem}}{\htmlref{Defining a
+Problem}{sec:defproblem}}), you can later display the problem
+using:
+\DescribeMacro{\useproblem}
+\begin{definition}
+\csdef{useproblem}\oarg{data set}\marg{label}\marg{arg\ifmakedtx{$_1$}{\HTMLcode{SUB}{1}}}\ldots
+\marg{arg\ifmakedtx{$_N$}{\HTMLcode{SUB}{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\ifmakedtx{$_1$}{\HTMLcode{SUB}{1}}}, \ldots,
+\meta{arg\ifmakedtx{$N$}{\HTMLcode{SUB}{N}}}
+are the arguments to pass to the problem, if the problem was
+defined to have arguments (where \ifmakedtx{$N$}{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}
+\ifmakedtx{}{\toTop}
+
+\section{Loading Problems From External Files}\label{sec:load}
+
+You can store all your problem definitions (see
+\ifmakedtx{\autoref{sec:defproblem}}{\htmlref{Defining New
+Problems}{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 \ifmakedtx{\autoref{sec:foreach}}{\htmlref{Iterating
+Through Datasets}{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}
+
+\ifmakedtx{}{\toTop}
+
+\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 \ifmakedtx{\autoref{sec:useproblem}}{\htmlref{Using a
+Problem}{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}
+
+\ifmakedtx{}{\toTop}
+
+\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}
+
+\ifmakedtx{}{\toTop}
+
+\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.
+
+\ifmakedtx{}{\toTop}
+
+ \StopEventually{\clearpage\phantomsection\addcontentsline{toc}{section}{Index}\PrintIndex}
+
+\ifmakedtx{}{\printindex\toTop}
+\end{document}