summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/latex/probsoln/probsoln-manual.html
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/doc/latex/probsoln/probsoln-manual.html')
-rw-r--r--Master/texmf-dist/doc/latex/probsoln/probsoln-manual.html1353
1 files changed, 797 insertions, 556 deletions
diff --git a/Master/texmf-dist/doc/latex/probsoln/probsoln-manual.html b/Master/texmf-dist/doc/latex/probsoln/probsoln-manual.html
index 0e24ce57ccd..74e787ec6b0 100644
--- a/Master/texmf-dist/doc/latex/probsoln/probsoln-manual.html
+++ b/Master/texmf-dist/doc/latex/probsoln/probsoln-manual.html
@@ -7,9 +7,9 @@ original version by: Nikos Drakos, CBLU, University of Leeds
Jens Lippmann, Marek Rouchal, Martin Wilck and others -->
<HTML>
<HEAD>
-<TITLE>probsoln.sty v2.04: LATEX2e Package to help create problem sheets</TITLE>
-<META NAME="description" CONTENT="probsoln.sty v2.04: LATEX2e Package to help create problem sheets">
-<META NAME="keywords" CONTENT="manual">
+<TITLE>probsoln v3.0: creating problem sheets optionally with solutions</TITLE>
+<META NAME="description" CONTENT="probsoln v3.0: creating problem sheets optionally with solutions">
+<META NAME="keywords" CONTENT="probsoln-manual">
<META NAME="resource-type" CONTENT="document">
<META NAME="distribution" CONTENT="global">
@@ -21,11 +21,27 @@ original version by: Nikos Drakos, CBLU, University of Leeds
</HEAD>
<BODY >
+<A NAME="top"></A>
- <H1 ALIGN="CENTER">probsoln.sty v2.04: L<SUP><SMALL>A</SMALL></SUP>T<SMALL>E</SMALL>X2<SUB>e</SUB> Package to help create problem sheets</H1>
-<P ALIGN="CENTER"><STRONG>Nicola L.C. Talbot</STRONG></P>
-<P ALIGN="CENTER"><STRONG>21st August 2007</STRONG></P>
- <BR>
+<P>
+
+<P>
+
+ <H1 ALIGN="CENTER">probsoln v3.0: creating problem sheets optionally with solutions</H1>
+<P ALIGN="CENTER"><STRONG>Nicola L.C. Talbot
+<BR>
+<BR>
+School of Computing Sciences
+<BR>
+University of East Anglia
+<BR>
+Norwich. Norfolk
+<BR>
+NR4 7TJ. United Kingdom.
+<BR><TT><A NAME="tex2html1"
+ HREF="http://theoval.cmp.uea.ac.uk/~nlct/">http://theoval.cmp.uea.ac.uk/~nlct/</A></TT></STRONG></P>
+<P ALIGN="CENTER"><STRONG>26th August 2008</STRONG></P>
+<BR>
<H2><A NAME="SECTION00010000000000000000">
Contents</A>
@@ -33,41 +49,34 @@ Contents</A>
<!--Table of Contents-->
<UL>
+<LI><A NAME="tex2html16"
+ HREF="probsoln-manual.html#SECTION00020000000000000000">1 Introduction</A>
+<LI><A NAME="tex2html17"
+ HREF="probsoln-manual.html#SECTION00030000000000000000">2 Package Options</A>
<LI><A NAME="tex2html18"
- HREF="#SECTION00020000000000000000">Introduction</A>
+ HREF="probsoln-manual.html#SECTION00040000000000000000">3 Showing and Hiding Solutions</A>
<LI><A NAME="tex2html19"
- HREF="#SECTION00030000000000000000">Package Options</A>
+ HREF="probsoln-manual.html#SECTION00050000000000000000">4 General Formatting Commands</A>
<LI><A NAME="tex2html20"
- HREF="#SECTION00040000000000000000">Creating a New Problem</A>
+ HREF="probsoln-manual.html#SECTION00060000000000000000">5 Defining a Problem</A>
<LI><A NAME="tex2html21"
- HREF="#SECTION00050000000000000000">Creating a Database</A>
+ HREF="probsoln-manual.html#SECTION00070000000000000000">6 Using a Problem</A>
<LI><A NAME="tex2html22"
- HREF="#SECTION00060000000000000000">Displaying a Problem</A>
+ HREF="probsoln-manual.html#SECTION00080000000000000000">7 Loading Problems From External Files</A>
<LI><A NAME="tex2html23"
- HREF="#SECTION00070000000000000000">Selecting All Problems</A>
+ HREF="probsoln-manual.html#SECTION00090000000000000000">8 Iterating Through Datasets</A>
<LI><A NAME="tex2html24"
- HREF="#SECTION00080000000000000000">Selecting Problems at Random</A>
+ HREF="probsoln-manual.html#SECTION000100000000000000000">9 Random Number Generator</A>
<LI><A NAME="tex2html25"
- HREF="#SECTION00090000000000000000">Other Commands</A>
+ HREF="probsoln-manual.html#SECTION000110000000000000000">10 Compatibility With Versions Prior to 3.0</A>
<LI><A NAME="tex2html26"
- HREF="#SECTION000100000000000000000">Troubleshooting</A>
-<UL>
-<LI><A NAME="tex2html27"
- HREF="#SECTION000101000000000000000">Unexpected Output</A>
-<LI><A NAME="tex2html28"
- HREF="#SECTION000102000000000000000">Error Messages</A>
-</UL>
-<BR>
-<LI><A NAME="tex2html29"
- HREF="#SECTION000110000000000000000">Contact Details</A>
-<LI><A NAME="tex2html30"
- HREF="#SECTION000120000000000000000">Index</A>
+ HREF="probsoln-manual.html#SECTION000120000000000000000">Index</A>
</UL>
<!--End of Table of Contents-->
<P>
<H1><A NAME="SECTION00020000000000000000">
-Introduction</A>
+1 Introduction</A>
</H1>
The <TT>probsoln</TT> package is designed for teachers or
lecturers who want to create problem sheets for their
@@ -75,7 +84,7 @@ 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 L<SUP><SMALL>A</SMALL></SUP>T<SMALL>E</SMALL>X, and then select a number of problems to
+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
@@ -87,666 +96,898 @@ printed. In this way, one file can either produce the
student's version or the teacher's version.
<P>
+<A HREF="probsoln-manual.html#top">Top</A>
+
+<P>
-<H1><A NAME="SECTION00030000000000000000">
-Package Options</A>
+<H1><A NAME="SECTION00030000000000000000"></A><A NAME="sec:pkgopt"></A>
+<BR>
+2 Package Options
</H1>
The following options may be passed to this package:
-<DIV ALIGN="CENTER">
-<TABLE CELLPADDING=3>
-<TR><TD ALIGN="LEFT"><TT></TD><TD ALIGN="LEFT">answers </TT></TD>
-<TD ALIGN="LEFT">Show the answers</TD>
-</TR>
-<TR><TD ALIGN="LEFT"><TT></TD><TD ALIGN="LEFT">noanswers </TT></TD>
-<TD ALIGN="LEFT">Don't show the answers (default)</TD>
-</TR>
-</TABLE>
-</DIV>
+<DL>
+<DT><STRONG><TT>answers</TT><A NAME="673"></A></STRONG></DT>
+<DD>Show the answers
+</DD>
+<DT><STRONG><TT>noanswers</TT><A NAME="676"></A></STRONG></DT>
+<DD>Don't show the answers (default)
+</DD>
+<DT><STRONG><TT>draft</TT><A NAME="679"></A></STRONG></DT>
+<DD>Display the label and dataset name when a problem is used
+</DD>
+<DT><STRONG><TT>final</TT><A NAME="682"></A></STRONG></DT>
+<DD>Don't display label and dataset name when a problem is used
+</DD>
+</DL>
<P>
+<A HREF="probsoln-manual.html#top">Top</A>
-<H1><A NAME="SECTION00040000000000000000">
-Creating a New Problem</A>
-</H1>
+<P>
-<A NAME="newproblem"></A><TT>newproblem</TT><A NAME="386"></A><code>[</code><I>nargs</I><code>]{</code><I>label</I><code>}{</code><I>problem</I><code>}{</code><I>solution</I><code>}</code>
-<BR>
-<BR>
-A new problem is defined using the command
-<TT>&#92;newproblem</TT><A NAME="389"></A>. This does not print anything,
-but merely stores the problem. As from version 2.03, there is also
-a starred version of this command for problems without a solution
-(for example, essay style questions):
+<H1><A NAME="SECTION00040000000000000000"></A><A NAME="sec:showanswers"></A>
<BR>
-<BR>
-<A NAME="newproblem_"></A><TT>newproblem*</TT><A NAME="393"></A><code>[</code><I>nargs</I><code>]{</code><I>label</I><code>}{</code><I>problem</I><code>}</code>
-<BR>
-<BR>
-The argument <I>label</I> is
-a unique string that is assigned to this problem so that it
-can be used later. The argument <I>problem</I> is normal
-L<SUP><SMALL>A</SMALL></SUP>T<SMALL>E</SMALL>X code that should be used to typeset the problem.
-The argument <I>solution</I> is normal L<SUP><SMALL>A</SMALL></SUP>T<SMALL>E</SMALL>X code that
-should be used to typeset the solution, if required. For
-example, the following defines a problem with the label
-<A NAME="quaddiff"></A><TT>quaddiff</TT>:
+3 Showing and Hiding Solutions
+</H1>
+
+<P>
+In addition to the <TT>answers</TT><A NAME="688"></A> and <TT>noanswers</TT><A NAME="691"></A> package
+options, it is also possible to show or suppress the solutions
+using <TT>&#092;showanswers</TT> and
+<TT>&#092;hideanswers</TT>, respectively.
+The boolean variable <TT>showanswers</TT><A NAME="694"></A> determines whether the
+answers should be displayed. You can use this value with the
+<TT>ifthen</TT><A NAME="697"></A> package to specify different text depending on
+whether the solutions should be displayed. For example:
<PRE>
- \newproblem{quaddiff}{%
- %This is the problem
- \begin{displaymath}
- f(x) = x^2 + 3x + 4
- \end{displaymath}
- }{%
- %This is the solution
- \begin{displaymath}
- f'(x) = 2x + 3
- \end{displaymath}
- }
+Assignment 1\ifthenelse{\boolean{showanswers}}{ (Solution Sheet)}{}
</PRE>
-The following is an essay question, so doesn't come with a solution:
+Alternatively you can use <TT>&#092;ifshowanswers</TT><A NAME="700"></A>...<TT>&#092;else</TT>...
+<TT>&#092;fi</TT>:
<PRE>
-\newproblem*{inheritance}{Describe what is meant by the term
-\emph{inheritance} in object-oriented programming. Use examples.}
+Assignment 1\ifshowanswers\space (Solution Sheet)\fi
</PRE>
<P>
-The optional argument <I>nargs</I> specifies the number of
-parameters this problem will take. By default this value is
-0, but any value from 1 to 9 may be used. Each parameter is
-referred to by <code>#1</code>, <code>#2</code>, ..., <code>#9</code>.
-For example, the following problem, labelled <A NAME="sindiff"></A><TT>sindiff</TT>,
-takes one parameter:
+For longer passages, you can use the environments <A NAME="1547"></A><TT>onlyproblem</TT>
+and <A NAME="1551"></A><TT>onlysolution</TT>. For example:
<PRE>
-\newproblem[1]{sindiff}{%
-\(f(x) = \sin(#1x)\)
-}{%
-\(f'(x) = #1\cos(#1x)\)
-}
+\begin{onlyproblem}%
+What is the derivative of $f(x) = x^2$?
+\end{onlyproblem}%
+\begin{onlysolution}%
+$f'(x) = 2x$
+\end{onlysolution}
</PRE>
-
-<P>
-The <A HREF="#quaddiff"><TT>quaddiff</TT></A> problem shown above can be made more
-generic by using parameters<A NAME="diff:quad"></A>:
+The above will only display the question if <TT>showanswers</TT><A NAME="705"></A>
+is false and will only display the solution if <TT>showanswers</TT><A NAME="708"></A>
+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 <TT>onlyproblem</TT> environment:
<PRE>
-\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
-\)
-}
+What is the derivative of $f(x) = x^2$?
+\begin{onlysolution}%
+Solution: $f'(x) = 2x$
+\end{onlysolution}
</PRE>
-The three parameters correspond to the coefficients. Note
-that they must all be integers since T<SMALL>E</SMALL>X only performs
-integer arithmetic.
+<B>NOTE:</B> You can't use verbatim text in the body of the
+<TT>onlyproblem</TT><A NAME="712"></A> or <TT>onlysolution</TT><A NAME="715"></A> environments.
+If you need verbatim-like text, then try packages such as
+<TT>alltt</TT><A NAME="718"></A>. Remember that you also can't use verbatim
+text in command arguments.
<P>
+<A HREF="probsoln-manual.html#top">Top</A>
-<H1><A NAME="SECTION00050000000000000000">
-Creating a Database</A>
+<P>
+
+<H1><A NAME="SECTION00050000000000000000"></A><A NAME="sec:formatting"></A>
+<BR>
+4 General Formatting Commands
</H1>
<P>
-To generate a database, simply create a <TT>.tex</TT> file
-where all the problems are defined using <A HREF="#newproblem"><TT>newproblem</TT><A NAME="407"></A></A> or
-<A HREF="#newproblem_"><TT>newproblem*</TT><A NAME="412"></A></A>,
-and either <TT>&#92;input</TT><A NAME="415"></A> it at the start of your document if
-you want to use <A HREF="#sec:useprob">specific problems</A>, or pass it to
-<A HREF="#sec:selran"><TT>&#92;selectrandomly</TT><A NAME="421"></A></A>. This package
-comes with some sample databases, along with some sample documents
-that use these databases.
+The commands and environments described in this section are
+provided to assist formatting problems and their solutions.
+<A NAME="1556"></A>
+<BR CLEAR="ALL">
+<HR><code>\begin{solution}</code><I>text</I><code>\end{solution}</code>
+<BR CLEAR="ALL">
+<HR>This is equivalent to
+<code>\par\noindent\textbf{\solutionname}:</code><I>text</I>
+where <TT>&#092;solutionname</TT> defaults
+to "Solution". Note that you must place the <TT>solution</TT>
+environment inside the <TT>onlysolution</TT><A NAME="725"></A> environment or
+between <TT>&#092;ifshowanswers</TT><A NAME="728"></A>...<TT>&#092;fi</TT> to ensure that it
+is suppressed when the solutions are not wanted. (See
+<A HREF="probsoln-manual.html#sec:showanswers">Showing and
+Hiding Solutions</A>.)
+
+<P>
+Note that the <TT>probsoln</TT> package will only define the
+<TT>solution</TT> environment if it is not already defined.
+
+<P>
+<A NAME="1560"></A>
+<BR CLEAR="ALL">
+<HR><code>\begin{textenum}</code>...<code>\end{textenum}</code>
+<BR CLEAR="ALL">
+<HR>The <TT>textenum</TT> environment is like the <TT>enumerate</TT><A NAME="734"></A>
+environment but is in-line. It uses the same counter that the
+<TT>enumerate</TT> environment would use at that level so the
+question can be compact but the answer can use <TT>enumerate</TT>
+instead. For example:
+<PRE>
+\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}
+</PRE>
+In this example, the items in the question are brief, so an
+<TT>enumerate</TT><A NAME="739"></A> environment would result in a lot of
+unnecessary white space,
+but the answers require more space, so an <TT>enumerate</TT>
+environment is more appropriate. Since the <TT>textenum</TT><A NAME="743"></A>
+environment uses the same counters as the <TT>enumerate</TT>
+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
+<A NAME="tex2html2"
+ HREF="http://www.tex.ac.uk/tex-archive/help/Catalogue/bytopic.html#enumeration">TeX
+Catalogue</A> for
+further details.
+
+<P>
+
+<BR CLEAR="ALL">
+<HR><TT>&#092;correctitem</TT><A NAME="747"></A>
+<BR><TT>&#092;incorrectitem</TT><A NAME="750"></A>
+<BR CLEAR="ALL">
+<HR>You can use the commands <TT>&#092;correctitem</TT> and <TT>&#092;incorrectitem</TT>
+in place of <TT>&#092;item</TT><A NAME="753"></A>. If the solutions are suppressed, these
+commands behave in the same way as <TT>&#092;item</TT>, otherwise they
+format the item label using one of the commands:
+
+<BR CLEAR="ALL">
+<HR><TT>&#092;correctitemformat</TT><A NAME="756"></A><TT>{</TT><EM>label</EM><TT>}</TT>
+<BR><TT>&#092;incorrectitemformat</TT><A NAME="759"></A><TT>{</TT><EM>label</EM><TT>}</TT>
+<BR CLEAR="ALL">
+<HR>For example:
+<PRE>
+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}
+</PRE>
+
+<P>
+<A HREF="probsoln-manual.html#top">Top</A>
<P>
-<H1><A NAME="SECTION00060000000000000000"></A>
-<A NAME="sec:useprob"></A>
+<H1><A NAME="SECTION00060000000000000000"></A><A NAME="sec:defproblem"></A>
<BR>
-Displaying a Problem
+5 Defining a Problem
</H1>
-
-<A NAME="useproblem"></A><TT>useproblem</TT><A NAME="425"></A><code>{</code><I>label</I><code>}</code>
-<BR>
-<BR>
-Once a problem has been defined using <A HREF="#newproblem"><TT>newproblem</TT><A NAME="430"></A></A>, it
-can be typeset using the command <TT>&#92;useproblem</TT><A NAME="433"></A>. If the
-problem was defined to take arguments, the arguments to the
-problem should come after the label. In the case of the
-<A HREF="#sindiff"><TT>sindiff</TT></A> example above, the command
-<code>\useproblem{sindiff}{2}</code> would produce the following:
-<BR>
-<BR> <I>f</I>(<I>x</I>) = sin(2<I>x</I>)
-
-<H4><A NAME="SECTION00060010000000000000">
-Solution:</A>
-</H4> <I>f'</I>(<I>x</I>) = 2cos(2<I>x</I>)
-<BR>
-<BR>
-whereas the command <code>\useproblem{diff:quad}{3}{0}{-2}</code> would produce:
-<BR>
-<BR> <I>f</I>(<I>x</I>) = 3<I>x</I><SUP>2</SUP> - 2
-
-<H4><A NAME="SECTION00060020000000000000">
-Solution:</A>
-</H4> <I>f'</I>(<I>x</I>) = 6<I>x</I>
-<BR>
-<BR>
<P>
-Suppose all the above problems are defined in the file
-<TT>probs.tex</TT>, then the following code will create a
-problem sheet with four questions in it:
+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
+<TT>probsoln</TT> package has a default data set labelled
+"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 <TT>onlyproblem</TT><A NAME="766"></A>,
+<TT>onlysolution</TT><A NAME="769"></A> or the <TT>showanswers</TT><A NAME="772"></A> boolean variable
+in conjunction with <TT>&#092;showanswers</TT><A NAME="775"></A> and <TT>&#092;hideanswers</TT><A NAME="778"></A>,
+you can print the solutions in a different location to the
+questions (for example in an appendix).
+
+<P>
+<A NAME="1565"></A>
+<BR CLEAR="ALL">
+<HR><code>\begin{defproblem}</code><TT>[</TT><EM>n</EM><TT>]{</TT><EM>label</EM><TT>}</TT><I>definition</I><code>\end{defproblem}</code>
+<BR CLEAR="ALL">
+<HR>This defines the problem whose label is given by <I>label</I>.
+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 <TT>ngerman</TT><A NAME="781"></A> and <TT>babel</TT><A NAME="784"></A>
+packages make certain punctuation active. Check the relevant
+package documentation for details.)
+
+<P>
+If <TT>defproblem</TT> occurs in the document or is included via
+<TT>&#092;input</TT> or <TT>&#092;include</TT>, then the problem will be added to
+the default data set. If <TT>defproblem</TT> occurs in an external
+file that is loaded using one of the commands defined in
+<A HREF="probsoln-manual.html#sec:load">Loading Problems From
+External Files</A> then the problem will be added to
+the specified data set.
+
+<P>
+The contents of the <TT>defproblem</TT> environment should be the
+text that defines the problem. This may include any of the
+commands defined in
+<A HREF="probsoln-manual.html#sec:showanswers">Showing and Hiding
+Solutions</A> and <A HREF="probsoln-manual.html#sec:formatting">General Formatting
+Commands</A>.
+
+<P>
+The problem may optionally take <I>n</I> arguments (where
+<I>n</I> is from 0 to 9). The arguments can be referenced
+in the definition via <TT>#1</TT>,...,<TT>#9</TT>.
+If <I>n</I> is omitted then the problem doesn't take any
+arguments.
+The following example defines a problem with one argument:
<PRE>
-\documentclass{article}
+\begin{defproblem}[1]{diffsin}
+Differentiate $f(x)=\sin(#1x)$.
+\begin{onlysolution}%
+\begin{solution}
+$f'(x) = #1\cos(#1x)$
+\end{solution}
+\end{onlysolution}
+\end{defproblem}
+</PRE>
-\usepackage{probsoln}
-\input{probs}
+<P>
-\begin{document}
-Differentiate the following functions with respect to $x$:
-\begin{enumerate}
-\item \useproblem{quaddiff}
-\item \useproblem{sindiff}{4}
-\item \useproblem{diff:quad}{2}{3}{1}
-\item \useproblem{diff:quad}{0}{1}{2}
-\end{enumerate}
-\end{document}
+<BR CLEAR="ALL">
+<HR><TT>&#092;newproblem</TT><A NAME="790"></A><TT>[</TT><EM>n</EM><TT>]{</TT><EM>label</EM><TT>}{</TT><EM>problem</EM><TT>}{</TT><EM>solution</EM><TT>}</TT>
+<BR CLEAR="ALL">
+<HR>This is a shortcut command for:
+<TT>
+<TT>&#092;begin</TT>{defproblem}<TT>[</TT><EM>n</EM><TT>]{</TT><EM>label</EM><TT>}</TT>%
+<I>problem</I>%
+<TT>&#092;begin</TT>{onlysolution}%
+<TT>&#092;begin</TT>{solution}%
+<I>solution</I>%
+<TT>&#092;end</TT>{solution}%
+<TT>&#092;end</TT>{onlysolution}%
+<TT>&#092;end</TT>{defproblem}
+</TT>
+For example:
+<PRE>
+\newproblem[1]{diffsin}{%
+\(f(x) = \sin(#1x)\)
+}{%
+\(f'(x) = #1\cos(#1x)\)
+}
+</PRE>
+is equivalent to
+<PRE>
+\begin{defproblem}[1]{diffcos}%
+\(f(x) = \cos(#1x)\)
+\begin{onlysolution}%
+\begin{solution}%
+\(f'(x) = -#1\sin(#1x)\)
+\end{solution}%
+\end{onlysolution}%
+\end{defproblem}
</PRE>
-The answer sheet can then be generated by passing the option
-<TT>answers</TT> to the <TT>probsoln</TT> package.
+(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
+<TT>fp</TT><A NAME="793"></A> package.)
<P>
-<H1><A NAME="SECTION00070000000000000000">
-Selecting All Problems</A>
-</H1>
+<BR CLEAR="ALL">
+<HR><TT>&#092;newproblem*</TT><A NAME="796"></A><TT>[</TT><EM>n</EM><TT>]{</TT><EM>label</EM><TT>}{</TT><EM>definition</EM><TT>}</TT>
+<BR CLEAR="ALL">
+<HR>This is a shortcut for:
+<TT>
+<TT>&#092;begin</TT>{defproblem}<TT>[</TT><EM>n</EM><TT>]{</TT><EM>label</EM><TT>}</TT>%
+<I>definition</I>%
+<TT>&#092;end</TT>{defproblem}
+</TT>
<P>
-To select all problems defined in a database, in the order in
-which they were defined, use the command:
+<B>NOTE:</B> Verbatim text must not be used in the contents of <TT>defproblem</TT><A NAME="799"></A>
+or in any of the arguments to <TT>&#092;newproblem</TT> or
+<TT>&#092;newproblem*</TT>. If you need verbatim-like text consider using
+<TT>&#092;texttt</TT> or the <TT>alltt</TT><A NAME="802"></A> package.
-<A NAME="selectallproblems"></A><TT>selectallproblems</TT><A NAME="440"></A><code>{</code><I>filename</I><code>}</code>
-For example, suppose the problems are defined in the file
-<TT>easy.tex</TT>, then the following will create a problem sheet
-which uses all these problems:
-<PRE>
-\documentclass[a4paper]{article}
+<P>
+<A HREF="probsoln-manual.html#top">Top</A>
-\usepackage{probsoln}
+<P>
-\begin{document}
-Differentiate the following functions:
-\begin{enumerate}
-\selectallproblems{easy}
-\end{enumerate}
-\end{document}
+<H1><A NAME="SECTION00070000000000000000"></A><A NAME="sec:useproblem"></A>
+<BR>
+6 Using a Problem
+</H1>
+
+<P>
+Once you have defined a problem using <TT>defproblem</TT><A NAME="808"></A> or
+<TT>&#092;newproblem</TT> (see
+<A HREF="probsoln-manual.html#sec:defproblem">Defining a
+Problem</A>), you can later display the problem
+using:
+
+<BR CLEAR="ALL">
+<HR><TT>&#092;useproblem</TT><A NAME="811"></A><TT>[</TT><EM>data set</EM><TT>]{</TT><EM>label</EM><TT>}{</TT><EM>arg<SUB>1</SUB></EM><TT>}</TT>...
+<TT>{</TT><EM>arg<SUB>N</SUB></EM><TT>}</TT>
+<BR CLEAR="ALL">
+<HR>where <I>data set</I> is the name of the data set that contains
+the problem (the default data set is used if omitted),
+<I>label</I> is the label identifying the required problem and
+<I>arg<SUB>1</SUB></I>, ...,
+<I>arg<SUB>N</SUB></I>
+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).
+
+<P>
+For example, in the previous section the problem <TT>diffcos</TT>
+was defined to have one argument, so it can be used as follows:
+<PRE>
+\useproblem{diffcos}{3}
+</PRE>
+This will be equivalent to:
+<PRE>
+\(f(x) = \cos(3x)\)
+\begin{onlysolution}%
+\begin{solution}%
+\(f'(x) = -3\sin(3x)\)
+\end{solution}%
+\end{onlysolution}%
</PRE>
<P>
+<A HREF="probsoln-manual.html#top">Top</A>
-<H1><A NAME="SECTION00080000000000000000"></A>
-<A NAME="sec:selran"></A>
+<P>
+
+<H1><A NAME="SECTION00080000000000000000"></A><A NAME="sec:load"></A>
<BR>
-Selecting Problems at Random
+7 Loading Problems From External Files
</H1>
-
-<A NAME="selectrandomly"></A><TT>selectrandomly</TT><A NAME="444"></A><code>{</code><I>filename</I><code>}{</code><I>n</I><code>}</code>
-<BR>
-<BR>
-The command <TT>&#92;selectrandomly</TT><A NAME="447"></A> will select <I>n</I>
-problems that are defined in the file <I>filename</I>. Each
-problem is proceeded by
-<A NAME="PSitem"></A><TT>PSitem</TT><A NAME="451"></A> which is
-defined to be <TT>&#92;item</TT><A NAME="454"></A>, so the command
-<TT>&#92;selectrandomly</TT><A NAME="457"></A> should occur within one of the
-list-like environments, such as <TT>enumerate</TT>.
-For example:
+
+<P>
+You can store all your problem definitions (see
+<A HREF="probsoln-manual.html#sec:defproblem">Defining New
+Problems</A>) in an external file.
+These problems can all be appended to the default data set by
+including the file via <TT>&#092;input</TT><A NAME="817"></A> 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 <A HREF="probsoln-manual.html#sec:foreach">Iterating
+Through Datasets</A>. Note that the commands below
+will create a new data set, if the named data set doesn't
+exist.
+
+<P>
+
+<BR CLEAR="ALL">
+<HR><TT>&#092;loadallproblems</TT><A NAME="820"></A><TT>[</TT><EM>data set</EM><TT>]{</TT><EM>filename</EM><TT>}</TT>
+<BR CLEAR="ALL">
+<HR>This will load all problems defined in <I>filename</I> and
+append them to the specified data set, in the order in which
+they are defined in the file. If <I>data set</I> is
+omitted, the default data set will be used. If <I>data set</I>
+doesn't exist, it will be created.
+
+<P>
+
+<BR CLEAR="ALL">
+<HR><TT>&#092;loadselectedproblems</TT><A NAME="823"></A><TT>[</TT><EM>data set</EM><TT>]{</TT><EM>labels</EM><TT>}{</TT><EM>filename</EM><TT>}</TT>
+<BR CLEAR="ALL">
+<HR>This is like <TT>&#092;loadproblems</TT>, but only those problems whose
+label is listed in the comma-separated list <I>labels</I> are
+loaded. For example, if I have some problems defined in the
+file <TT>derivatives.tex</TT>, then
<PRE>
-\begin{enumerate}
-\selectrandomly{easy.tex}{4}
-\end{enumerate}
+\loadselectedproblems{diffsin,diffcos}{derivatives}
</PRE>
-will result in four numbered problems, selected at random
-from the file <TT>easy.tex</TT>. (The <TT>.tex</TT> extension
-may be omitted.) Each problem is followed by the command
-<A NAME="endPSNitem"></A><TT>endPSNitem</TT><A NAME="461"></A> which by default does nothing.
+will only load the problems whose labels are <TT>diffsin</TT>
+and <TT>diffcos</TT>, respectively. All the other problems in
+the file will remain undefined.
<P>
-Multiple <TT>&#92;selectrandomly</TT><A NAME="464"></A> commands may be used, however a
-different file must be used each time. For
-example:
-<PRE>
-\begin{enumerate}
-\item Differentiate the following functions with respect to $x$:
-\begin{enumerate}
-\selectrandomly{samples/easy.tex}{3}
-\selectrandomly{samples/args.tex}{1}
-\end{enumerate}
+<BR CLEAR="ALL">
+<HR><TT>&#092;loadrandomproblems</TT><A NAME="826"></A><TT>[</TT><EM>data set</EM><TT>]{</TT><EM>n</EM><TT>}{</TT><EM>filename</EM><TT>}</TT>
+<BR CLEAR="ALL">
+<HR>This randomly loads <I>n</I> problems from <I>filename</I> and
+adds them to the given data set. If <I>data set</I> 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 <I>n</I> problems
+defined in <I>filename</I>.
-\selectrandomly{samples/implicit.tex}{1}
-\selectrandomly{samples/1stprncpl.tex}{1}
+<P>
+<B>NOTE:</B> It is generally not a good idea to place anything in
+<I>filename</I> that is not inside the body of <TT>defproblem</TT><A NAME="829"></A>
+or in the arguments to <TT>&#092;newproblem</TT><A NAME="832"></A> or <TT>&#092;newproblem*</TT><A NAME="835"></A>.
+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, <TT>&#092;loadrandomproblems</TT>
+has to load each file twice, which means that anything outside
+a problem definition will be parsed twice.
-\end{enumerate}
-</PRE>
-This will result in a total of 6 problems, numbered 1(a),
-1(b), 1(c), 1(d), 2 and 3.
+<P>
<P>
-If a randomly selected problem requires arguments, a message
-similar to the following will be displayed:
-<PRE>
-Problem diff:quad requires 3 argument(s), please specify (e.g. {5}{3}):
-</PRE>
-Enter the required arguments, where each argument is
-enclosed in braces ({ }).
+<A HREF="probsoln-manual.html#top">Top</A>
<P>
-<H1><A NAME="SECTION00090000000000000000">
-Other Commands</A>
+<H1><A NAME="SECTION00090000000000000000"></A><A NAME="sec:foreach"></A>
+<BR>
+8 Iterating Through Datasets
</H1>
-The command <A NAME="PSNrandseed"></A><TT>PSNrandseed</TT><A NAME="468"></A><code>{</code><I>n</I><code>}</code> specifies
-the seed for the random number generator. For example,
-if you are using <A HREF="#selectrandomly"><TT>selectrandomly</TT><A NAME="473"></A></A>,
-<code>\PSNrandseed{\year}</code> will produce a different set of
-problems each year, whereas <code>\PSNrandseed{\time}</code>
-will produce a different set of problems each time you
-L<SUP><SMALL>A</SMALL></SUP>T<SMALL>E</SMALL>X the problem sheet (as long as you leave at least a
-minute between runs.)
-
-<P>
-The command <A NAME="random"></A><TT>random</TT><A NAME="477"></A><code>{</code><I>counter</I><code>}{</code><I>a</I><code>}{</code><I>b</I><code>}</code>
-generates a random number from <I>a</I> to <I>b</I> and
-stores it in the L<SUP><SMALL>A</SMALL></SUP>T<SMALL>E</SMALL>X counter <I>counter</I>. For example,
-to select 2, 3 or 4 problems from the file
-<TT>implicit.tex</TT>:
+<P>
+Once you have defined all your problems for a given data set,
+you can use an individual problem with <TT>&#092;useproblem</TT><A NAME="841"></A>
+(see <A HREF="probsoln-manual.html#sec:useproblem">Using a
+Problem</A>) 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.
+
+<P>
+
+<BR CLEAR="ALL">
+<HR><TT>&#092;foreachproblem</TT><A NAME="844"></A><TT>[</TT><EM>data set</EM><TT>]{</TT><EM>body</EM><TT>}</TT>
+<BR CLEAR="ALL">
+<HR>This does <I>body</I> for each problem in the given data set.
+If <I>data set</I> is omitted, the default data set is used.
+Within <I>body</I> you can use
+<TT>&#092;thisproblem</TT> to use the
+current problem and <TT>&#092;thisproblemlabel</TT>
+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 <TT>&#092;thisproblem</TT>, so you only
+need to use <TT>&#092;thisproblem</TT> without having to specify
+<TT>&#092;useproblem</TT><A NAME="847"></A>. For example, to iterate through all problems
+in the default data set:
<PRE>
-\newcounter{numproblems}
\begin{enumerate}
-\random{numproblems}{2}{4}
-\selectrandomly{implicit.tex}{\value{numproblems}}
+\foreachproblem{\item\thisproblem}
\end{enumerate}
</PRE>
-(Note the use of <TT>&#92;value</TT><A NAME="480"></A>.)
<P>
-This command can also be used to generate random values for
-problems that take arguments. Consider the problem <A HREF="#diff:quad"><TT>diff:quad</TT></A>
-defined earlier. Three counters can be defined to represent the
-three coefficients:
-<PRE>
-\newcounter{A}
-\newcounter{B}
-\newcounter{C}
-</PRE>
-Random values can now be assigned to these counters:
+
+<BR CLEAR="ALL">
+<HR><TT>&#092;foreachdataset</TT><A NAME="850"></A><TT>{</TT><EM>cmd</EM><TT>}{</TT><EM>body</EM><TT>}</TT>
+<BR CLEAR="ALL">
+<HR>This does <I>body</I> for each of the defined data sets. Within
+<I>body</I>, <I>cmd</I> will be set to the name of the current
+data set. For example, to display all problems in all data sets:
<PRE>
-\random{A}{-5}{5}
-\random{B}{-5}{5}
-\random{C}{-5}{5}
+\begin{enumerate}
+\foreachdataset{\thisdataset}{%
+\foreachproblem[\thisdataset]{\item\thisproblem}}
+\end{enumerate}
</PRE>
-Finally, the problem can be used (note the use of <TT>&#92;arabic</TT><A NAME="486"></A>):
-<PRE>
-\useproblem{diff:quad}{\arabic{A}}{\arabic{B}}{\arabic{C}}
-</PRE>
-
-<P>
-The command
-<A NAME="doforrandN"></A><TT>doforrandN</TT><A NAME="490"></A><code>{</code><I>n</I><code>}{</code><I>cmd</I><code>}{</code><I>list</I><code>}{</code><I>text</I><code>}</code> will apply
-<I>text</I> for a random selection of <I>n</I> items in the
-comma separated <I>list</I>. In each iteration the list
-item is denoted by <I>cmd</I>. For example, suppose you
-have three files called <TT>file1.tex</TT>,
-<TT>file2.tex</TT> and <TT>file3.tex</TT>, and you want to
-select 1 problem from two of the three files, then you can
-do:
+
+<P>
+Suppose I have two external files called
+<TT>derivatives.tex</TT> and <TT>probspaces.tex</TT> which
+define problems using both <TT>onlyproblem</TT><A NAME="853"></A> and
+<TT>onlysolution</TT><A NAME="856"></A> for example:
<PRE>
-\doforrandN{2}{\file}{file1,file2,file3}{\selectrandomly{\file}{1}}
+\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}
</PRE>
-Note that it is also possible to do
+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 <TT>&#092;hideanswers</TT><A NAME="859"></A> and
+iterate through the require data set to produce the problems.
+Later, I can use <TT>&#092;showanswers</TT><A NAME="862"></A> 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 <TT>enumerate</TT><A NAME="865"></A> environment,
+and redefined <TT>&#092;theenumi</TT><A NAME="868"></A> 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.
<PRE>
-\newcounter{numproblems}
-\random{numproblems}{1}{3}
-\selectrandomly{file\arabic{numproblems}}{1}
-\random{numproblems}{1}{3}
-\selectrandomly{file\arabic{numproblems}}{1}
+\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}
</PRE>
-however there is a possibility that the same file may be
-selected twice which will cause an error.
<P>
-The command <A NAME="showanswers"></A><TT>showanswers</TT><A NAME="494"></A> will show the solutions from
-that point on. May be localised by placing within a group.
<P>
-The command <A NAME="hideanswers"></A><TT>hideanswers</TT><A NAME="498"></A> will hide the solutions from
-that point on. May be localised by placing within a group.
+<A HREF="probsoln-manual.html#top">Top</A>
<P>
-The solution is placed inside the <TT>solution</TT>
-environment. By default this environment simply does
-<code>\par\noindent\textbf{\solutionname:} </code> at the start, where
-<A NAME="solutionname"></A><TT>solutionname</TT><A NAME="503"></A>
-has the value: Solution. See the file <TT>sample3.tex</TT>, which
-comes with this package, for an illustration of how to
-customise the way in which the randomly selected problems are
-displayed. This sample file randomly selects multiple choice
-problems stored in the file <TT>tabmchoice.tex</TT>, and displays them
-in a longtable <TT>environment</TT>. As from version 2.03, the package
-will not define this environment if another package or class file has
-already defined it.
+
+<H1><A NAME="SECTION000100000000000000000"></A><A NAME="sec:random"></A>
+<BR>
+9 Random Number Generator
+</H1>
<P>
-The boolean variable <TT>showanswers</TT> is defined to be
-true if the answers are shown and false otherwise. You can
-therefore do something like:
-<PRE>
-\ifthenelse{\boolean{showanswers}}{\textbf{Solution Sheet}}{}
-</PRE>
-and <B>Solution Sheet</B> will be printed only if the
-answers are displayed. (For more information on
-<TT>&#92;ifthenelse</TT><A NAME="507"></A> and <TT>&#92;boolean</TT><A NAME="510"></A> see the
-documentation for the <TT>ifthen</TT> package by
-David Carlisle.)
+This package provides a pseudo-random number generator that is used
+by <TT>&#092;loadrandomproblems</TT><A NAME="874"></A>.
<P>
-The <TT>showanswers</TT> switch can also be used within the definition
-of a problem, if you want the question to appear differently if the
-solution is displayed. For example:
+
+<BR CLEAR="ALL">
+<HR><TT>&#092;PSNrandseed</TT><A NAME="877"></A><TT>{</TT><EM>n</EM><TT>}</TT>
+<BR CLEAR="ALL">
+<HR>This sets the seed to <I>n</I> which must be a non-zero integer.
+For example, to generate a different set of random numbers
+every time you LaTeX your document,<A NAME="tex2html3"
+ HREF="#foot462"><SUP>1</SUP></A> put the following in your
+preamble:
<PRE>
-\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}
-}
+\PSNrandseed{\time}
+</PRE>
+or to generate a different set of random numbers every year you
+LaTeX your document:
+<PRE>
+\PSNrandseed{\year}
</PRE>
-If the solutions are not displayed, the question will appear
-as
-<DL>
-<DT></DT>
-<DD>Which of the following is the derivative of
-<I>x</I>sin(<I>x</I>)?
-(Circle the correct answer.)
-<DL>
-<DT><STRONG>A</STRONG></DT>
-<DD>sin(<I>x</I>)
-</DD>
-<DT><STRONG>B</STRONG></DT>
-<DD><I>x</I>cos(<I>x</I>)
-</DD>
-<DT><STRONG>C</STRONG></DT>
-<DD>sin(<I>x</I>)+<I>x</I>cos(<I>x</I>)
-</DD>
-</DL>
-</DD>
-</DL>
-otherwise it will appear as:
-<DL>
-<DT></DT>
-<DD>Which of the following is the derivative of
-<I>x</I>sin(<I>x</I>)?
-(Circle the correct answer.)
-<DL>
-<DT><STRONG>A</STRONG></DT>
-<DD>sin(<I>x</I>)
-</DD>
-<DT><STRONG>B</STRONG></DT>
-<DD><I>x</I>cos(<I>x</I>)
-</DD>
-<DT><STRONG><FONT SIZE="+2">&#169;</FONT></STRONG></DT>
-<DD>sin(<I>x</I>) + <I>x</I>cos(<I>x</I>) (product rule)
-</DD>
-</DL>
-</DD>
-</DL>
<P>
-<H1><A NAME="SECTION000100000000000000000">
-Troubleshooting</A>
-</H1>
+<BR CLEAR="ALL">
+<HR><TT>&#092;PSNgetrandseed</TT><A NAME="880"></A><TT>{</TT><EM>register</EM><TT>}</TT>
+<BR CLEAR="ALL">
+<HR>This stores the current seed in the count register specified by
+<I>register</I>.
+For example:
+<PRE>
+\newcount\myseed
+\PSNgetrandseed{\myseed}
+</PRE>
-<H2><A NAME="SECTION000101000000000000000">
-Unexpected Output</A>
-</H2>
+<P>
-<UL>
-<LI>I have lots of blank space before the first problem when
-using <A HREF="#selectrandomly"><TT>selectrandomly</TT><A NAME="515"></A></A>.
+<BR CLEAR="ALL">
+<HR><TT>&#092;PSNrandom</TT><A NAME="883"></A><TT>{</TT><EM>register</EM><TT>}{</TT><EM>n</EM><TT>}</TT>
+<BR CLEAR="ALL">
+<HR>Generates a random integer from 1 to <I>n</I> and stores in
+the count register specified by <I>register</I>. For example,
+the following generates an integer from 1 to 10 and stores it
+in the register <TT>&#092;myreg</TT>:
+<PRE>
+\newcount\myreg
+\PSNrandom{\myreg}{10}
+</PRE>
<P>
-This is probably because you have lots of extraneous white space
-in your database. <A HREF="#selectrandomly"><TT>selectrandomly</TT><A NAME="520"></A></A> will input the entire
-file, so any extra space will be included. Try commenting out the
-extra space using %.
-</LI>
-</UL>
-<P>
+<BR CLEAR="ALL">
+<HR><TT>&#092;random</TT><A NAME="886"></A><TT>{</TT><EM>counter</EM><TT>}{</TT><EM>min</EM><TT>}{</TT><EM>max</EM><TT>}</TT>
+<BR CLEAR="ALL">
+<HR>Generates a random integer from <I>min</I> to <I>max</I> 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 <TT>myrand</TT>.
+<PRE>
+\newcounter{myrand}
+\random{myrand}{3}{8}
+</PRE>
-<H2><A NAME="SECTION000102000000000000000">
-Error Messages</A>
-</H2>
+<P>
-<UL>
-<LI><TT>! Package probsoln Error: Label ... already used.
-</TT>
+<BR CLEAR="ALL">
+<HR><TT>&#092;doforrandN</TT><A NAME="889"></A><TT>{</TT><EM>n</EM><TT>}{</TT><EM>cmd</EM><TT>}{</TT><EM>list</EM><TT>}{</TT><EM>text</EM><TT>}</TT>
+<BR CLEAR="ALL">
+<HR>Randomly selects <I>n</I> values from the comma-separated list
+given by <I>list</I> and iterates through this subset. On
+each iteration it sets <I>cmd</I> to the current value and
+does <I>text</I>. For example, the following will load a
+randomly selected problem from two of the listed files (where
+<TT>file1.tex</TT>, <TT>file2.tex</TT> and <TT>file3.tex</TT>
+are files containing at least one problem):
+<PRE>
+\doforrandN{2}{\thisfile}{file1,file2,file3}{%
+\loadrandomproblems{1}{\thisfile}}
+</PRE>
<P>
-Each label identifier used in <A HREF="#newproblem"><TT>newproblem</TT><A NAME="525"></A></A> must be
-unique. Check to make sure you haven't used the same label
-more than once. Also check to make sure you haven't
-<TT>&#92;input</TT><A NAME="528"></A>ed or randomly selected from the same file more
-than once. (Or <TT>&#92;input</TT><A NAME="531"></A>ed and randomly selected from
-the same file.)
<P>
-</LI>
-<LI><TT>! Package probsoln Error: Label ... undefined.
-</TT>
+<A HREF="probsoln-manual.html#top">Top</A>
<P>
-You need to define a problem before you can use it. Check to
-make sure you haven't mis-spelt it, and check to make sure you
-have <TT>&#92;input</TT><A NAME="534"></A>ed the file in which it is defined.
-<P>
-</LI>
-<LI><TT>! Package probsoln Error: Requested number too large.
-</TT>
+<H1><A NAME="SECTION000110000000000000000">
+10 Compatibility With Versions Prior to 3.0</A>
+</H1>
<P>
-You have asked for more problems than are defined within the
-specified file. All problems in that file will be selected.
+Version 3.0 of the <TT>probsoln</TT> 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 <TT>&#092;newproblem</TT><A NAME="896"></A> and <TT>&#092;newproblem*</TT><A NAME="899"></A>.
+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.
<P>
-</LI>
-<LI><TT>! Package probsoln Error: Can't randomly select <I>n</I>
-item(s)
-</TT>
+The other likely difference is where the random generator is
+used in a group. This includes commands such as
+<TT>&#092;selectrandomly</TT><A NAME="902"></A>. For example, if your document contained
+something like:
+<PRE>
+\begin{enumerate}
+\selectrandomly{file1}{8}
-<P>
-You have asked to randomly select <I>n</I> items from a list
-that has less than <I>n</I> elements. For example, the
-following will generate this error:
+\item Solve the following:
+\begin{enumerate}
+\selectrandomly{file2}{4}
+\end{enumerate}
+
+\selectrandomly{file3}{2}
+\end{enumerate}
+</PRE>
+Then using versions prior to v3.0 will produce a different
+set of random numbers since the second <TT>&#092;selectrandomly</TT>
+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:
<PRE>
-\doforrandN{10}{\file}{file1,file2,file3}{%
-\selectrandomly{\file}{1}}
+\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}
</PRE>
-In this case the list, <TT>file1,file2,file3</TT> has only 3
-elements, but the user has asked for 10 elements. If you type
-`h' at the L<SUP><SMALL>A</SMALL></SUP>T<SMALL>E</SMALL>X prompt it will tell you how many items it thinks
-there are in the list. Remember that each item must be separated by a
-comma.
<P>
-</LI>
-<LI><TT>! LaTeX Error: Lonely <TT>&#92;item</TT><A NAME="537"></A>-perhaps missing list
-environment.
+
+<BR CLEAR="ALL">
+<HR><TT>&#092;selectrandomly</TT><A NAME="905"></A><TT>{</TT><EM>filename</EM><TT>}{</TT><EM>n</EM><TT>}</TT>
+<BR CLEAR="ALL">
+<HR>This is now equivalent to:
+<TT>
+{<TT>&#092;loadrandomproblems[</TT><EM>filename</EM><TT>]{</TT><EM>n</EM><TT>}{</TT><EM>filename</EM><TT>}</TT>}%
+<TT>&#092;foreachproblem[</TT><EM>filename</EM><TT>]{</TT><EM><TT>&#092;PSNitem&#092;thisproblem&#092;endPSNitem</TT></EM><TT>}</TT>
</TT>
<P>
-Each problem selected using <A HREF="#selectrandomly"><TT>selectrandomly</TT><A NAME="542"></A></A> is
-proceeded by <A HREF="#PSNitem"><TT>PSNitem</TT><A NAME="547"></A></A> which by default is defined
-as <TT>&#92;item</TT><A NAME="550"></A>, and should therefore be
-placed in one of the list environments, such as
-<TT>enumerate</TT>. Alternatively, redefine <A HREF="#PSNitem"><TT>PSNitem</TT><A NAME="555"></A></A>.
+
+<BR CLEAR="ALL">
+<HR><TT>&#092;selectallproblems</TT><A NAME="908"></A><TT>{</TT><EM>filename</EM><TT>}</TT>
+<BR CLEAR="ALL">
+<HR>This is now equivalent to:
+<TT>
+{<TT>&#092;loadallproblems[</TT><EM>filename</EM><TT>]{</TT><EM>filename</EM><TT>}</TT>}%
+<TT>&#092;foreachproblem[</TT><EM>filename</EM><TT>]{</TT><EM><TT>&#092;PSNitem&#092;thisproblem&#092;endPSNitem</TT></EM><TT>}</TT>
+</TT>
<P>
-</LI>
-<LI>I get an error when I put a command definition in my database
-when using <TT>&#92;selectrandomly</TT><A NAME="558"></A>.
+Note that in both the above cases, a new data set is created
+with the same name as the file name.
<P>
-<A HREF="#selectrandomly"><TT>selectrandomly</TT><A NAME="563"></A></A> inputs the database twice, so any
-command definition will be read twice, causing an error. You
-can use the switch <TT>&#92;iffirstpass</TT><A NAME="566"></A> to prevent the error. For
-example:
-<PRE>
-\iffirstpass
-\newcommand{\mycmd}{}
-\fi
-</PRE>
-It is generally not a good idea to put anything other than
-<A HREF="#newproblem"><TT>newproblem</TT><A NAME="571"></A></A> commands within the database.
<P>
-</LI>
-</UL>
+<A HREF="probsoln-manual.html#top">Top</A>
<P>
-<H1><A NAME="SECTION000110000000000000000">
-Contact Details</A>
-</H1>
-Dr Nicola Talbot
-<BR>
-School of Computing Sciences
-<BR>
-University of East Anglia
-<BR>
-Norwich. NR4 7TJ
-<BR><TT><A NAME="tex2html1"
- HREF="http://theoval.cmp.uea.ac.uk/~nlct/">http://theoval.cmp.uea.ac.uk/~nlct/</A></TT>
<P>
<BR>
<H2><A NAME="SECTION000120000000000000000">
Index</A>
</H2><DL COMPACT>
-<DT><STRONG><TT>&#92;arabic</TT></STRONG>
-<DD><A HREF="#486">Other Commands</A>
-<DT><STRONG><TT>&#92;boolean</TT></STRONG>
-<DD><A HREF="#510">Other Commands</A>
-<DT><STRONG><TT>&#92;doforrandN</TT></STRONG>
-<DD><A HREF="#490">Other Commands</A>
-<DT><STRONG><TT>&#92;endPSNitem</TT></STRONG>
-<DD><A HREF="#461">Selecting Problems at Random</A>
-<DT><STRONG><TT>&#92;hideanswers</TT></STRONG>
-<DD><A HREF="#498">Other Commands</A>
-<DT><STRONG><TT>&#92;iffirstpass</TT></STRONG>
-<DD><A HREF="#566">Error Messages</A>
-<DT><STRONG><TT>&#92;ifthenelse</TT></STRONG>
-<DD><A HREF="#507">Other Commands</A>
-<DT><STRONG><TT>&#92;input</TT></STRONG>
-<DD><A HREF="#415">Creating a Database</A>
- | <A HREF="#528">Error Messages</A>
- | <A HREF="#531">Error Messages</A>
- | <A HREF="#534">Error Messages</A>
-<DT><STRONG><TT>&#92;item</TT></STRONG>
-<DD><A HREF="#454">Selecting Problems at Random</A>
- | <A HREF="#537">Error Messages</A>
- | <A HREF="#550">Error Messages</A>
-<DT><STRONG><TT>&#92;newproblem</TT></STRONG>
-<DD><A HREF="#386">Creating a New Problem</A>
- | <A HREF="#389">Creating a New Problem</A>
- | <A HREF="#407">Creating a Database</A>
- | <A HREF="#430">Displaying a Problem</A>
- | <A HREF="#525">Error Messages</A>
- | <A HREF="#571">Error Messages</A>
-<DT><STRONG><TT>&#92;newproblem*</TT></STRONG>
-<DD><A HREF="#393">Creating a New Problem</A>
- | <A HREF="#412">Creating a Database</A>
-<DT><STRONG><TT>&#92;PSitem</TT></STRONG>
-<DD><A HREF="#451">Selecting Problems at Random</A>
-<DT><STRONG><TT>&#92;PSNitem</TT></STRONG>
-<DD><A HREF="#547">Error Messages</A>
- | <A HREF="#555">Error Messages</A>
-<DT><STRONG><TT>&#92;PSNrandseed</TT></STRONG>
-<DD><A HREF="#468">Other Commands</A>
-<DT><STRONG><TT>&#92;random</TT></STRONG>
-<DD><A HREF="#477">Other Commands</A>
-<DT><STRONG><TT>&#92;selectallproblems</TT></STRONG>
-<DD><A HREF="#440">Selecting All Problems</A>
-<DT><STRONG><TT>&#92;selectrandomly</TT></STRONG>
-<DD><A HREF="#418">Creating a Database</A>
- | <A HREF="#421">Creating a Database</A>
- | <A HREF="#444">Selecting Problems at Random</A>
- | <A HREF="#447">Selecting Problems at Random</A>
- | <A HREF="#457">Selecting Problems at Random</A>
- | <A HREF="#464">Selecting Problems at Random</A>
- | <A HREF="#473">Other Commands</A>
- | <A HREF="#515">Unexpected Output</A>
- | <A HREF="#520">Unexpected Output</A>
- | <A HREF="#542">Error Messages</A>
- | <A HREF="#563">Error Messages</A>
- | <A HREF="#558">Error Messages</A>
-<DT><STRONG><TT>&#92;showanswers</TT></STRONG>
-<DD><A HREF="#494">Other Commands</A>
-<DT><STRONG><TT>&#92;solutionname</TT></STRONG>
-<DD><A HREF="#503">Other Commands</A>
-<DT><STRONG><TT>&#92;useproblem</TT></STRONG>
-<DD><A HREF="#425">Displaying a Problem</A>
- | <A HREF="#433">Displaying a Problem</A>
-<DT><STRONG><TT>&#92;value</TT></STRONG>
-<DD><A HREF="#480">Other Commands</A>
+<DT><STRONG><TT>alltt</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#718">3</A>
+ | <A HREF="probsoln-manual.html#802">5</A>
+<DT><STRONG><TT>babel</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#784">5</A>
+<DT><STRONG><TT>&#092;correctitem</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#747">4</A>
+<DT><STRONG><TT>&#092;correctitemformat</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#756">4</A>
+<DT><STRONG><TT>defproblem</TT> environment</STRONG>
+<DD><A HREF="probsoln-manual.html#1565">5</A>
+ | <A HREF="probsoln-manual.html#799">5</A>
+ | <A HREF="probsoln-manual.html#808">6</A>
+ | <A HREF="probsoln-manual.html#829">7</A>
+<DT><STRONG><TT>&#092;doforrandN</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#889">9</A>
+<DT><STRONG><TT>enumerate</TT> environment</STRONG>
+<DD><A HREF="probsoln-manual.html#734">4</A>
+ | <A HREF="probsoln-manual.html#739">4</A>
+ | <A HREF="probsoln-manual.html#865">8</A>
+<DT><STRONG><TT>&#092;foreachdataset</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#850">8</A>
+<DT><STRONG><TT>&#092;foreachproblem</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#844">8</A>
+<DT><STRONG><TT>fp</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#793">5</A>
+<DT><STRONG><TT>&#092;hideanswers</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#778">5</A>
+ | <A HREF="probsoln-manual.html#859">8</A>
+<DT><STRONG><TT>&#092;ifshowanswers</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#700">3</A>
+ | <A HREF="probsoln-manual.html#728">4</A>
+<DT><STRONG><TT>ifthen</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#697">3</A>
+<DT><STRONG><TT>&#092;incorrectitem</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#750">4</A>
+<DT><STRONG><TT>&#092;incorrectitemformat</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#759">4</A>
+<DT><STRONG><TT>&#092;input</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#817">7</A>
+<DT><STRONG><TT>&#092;item</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#753">4</A>
+<DT><STRONG><TT>&#092;loadallproblems</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#820">7</A>
+<DT><STRONG><TT>&#092;loadrandomproblems</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#826">7</A>
+ | <A HREF="probsoln-manual.html#874">9</A>
+<DT><STRONG><TT>&#092;loadselectedproblems</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#823">7</A>
+<DT><STRONG><TT>&#092;newproblem</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#790">5</A>
+ | <A HREF="probsoln-manual.html#832">7</A>
+ | <A HREF="probsoln-manual.html#896">10</A>
+<DT><STRONG><TT>&#092;newproblem*</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#796">5</A>
+ | <A HREF="probsoln-manual.html#835">7</A>
+ | <A HREF="probsoln-manual.html#899">10</A>
+<DT><STRONG><TT>ngerman</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#781">5</A>
+<DT><STRONG><TT>onlyproblem</TT> environment</STRONG>
+<DD><A HREF="probsoln-manual.html#1547">3</A>
+ | <A HREF="probsoln-manual.html#712">3</A>
+ | <A HREF="probsoln-manual.html#766">5</A>
+ | <A HREF="probsoln-manual.html#853">8</A>
+<DT><STRONG><TT>onlysolution</TT> environment</STRONG>
+<DD><A HREF="probsoln-manual.html#1551">3</A>
+ | <A HREF="probsoln-manual.html#715">3</A>
+ | <A HREF="probsoln-manual.html#725">4</A>
+ | <A HREF="probsoln-manual.html#769">5</A>
+ | <A HREF="probsoln-manual.html#856">8</A>
+<DT><STRONG>package options</STRONG>
+<DD><DL COMPACT>
+<DT><STRONG><TT>answers</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#673">2</A>
+ | <A HREF="probsoln-manual.html#688">3</A>
+<DT><STRONG><TT>draft</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#679">2</A>
+<DT><STRONG><TT>final</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#682">2</A>
+<DT><STRONG><TT>noanswers</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#676">2</A>
+ | <A HREF="probsoln-manual.html#691">3</A>
+</DL>
+<DT><STRONG><TT>&#092;PSNgetrandseed</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#880">9</A>
+<DT><STRONG><TT>&#092;PSNrandom</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#883">9</A>
+<DT><STRONG><TT>&#092;PSNrandseed</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#877">9</A>
+<DT><STRONG><TT>&#092;random</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#886">9</A>
+<DT><STRONG><TT>&#092;selectallproblems</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#908">10</A>
+<DT><STRONG><TT>&#092;selectrandomly</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#902">10</A>
+ | <A HREF="probsoln-manual.html#905">10</A>
+<DT><STRONG><TT>&#092;showanswers</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#775">5</A>
+ | <A HREF="probsoln-manual.html#862">8</A>
+<DT><STRONG><TT>showanswers</TT> boolean variable</STRONG>
+<DD><A HREF="probsoln-manual.html#694">3</A>
+ | <A HREF="probsoln-manual.html#705">3</A>
+ | <A HREF="probsoln-manual.html#708">3</A>
+ | <A HREF="probsoln-manual.html#772">5</A>
+<DT><STRONG>\textttsolution environment</STRONG>
+<DD><A HREF="probsoln-manual.html#1556">4</A>
+<DT><STRONG><TT>textenum</TT> environment</STRONG>
+<DD><A HREF="probsoln-manual.html#1560">4</A>
+ | <A HREF="probsoln-manual.html#743">4</A>
+<DT><STRONG><TT>&#092;theenumi</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#868">8</A>
+<DT><STRONG><TT>&#092;useproblem</TT></STRONG>
+<DD><A HREF="probsoln-manual.html#811">6</A>
+ | <A HREF="probsoln-manual.html#841">8</A>
+ | <A HREF="probsoln-manual.html#847">8</A>
</DL>
+<P>
+<A HREF="probsoln-manual.html#top">Top</A>
+<BR><HR><H4>Footnotes</H4>
+<DL>
+<DT><A NAME="foot462">... document,</A><A
+ HREF="probsoln-manual.html#tex2html3"><SUP>1</SUP></A></DT>
+<DD>assuming you
+leave at least a minute between runs.
+
+</DD>
+</DL>
<BR><HR>
-<ADDRESS>
-<A href=http://theoval.cmp.uea.ac.uk/~nlct/>Nicola L. C. Talbot</A>.
-<A HREF=http://www.cmp.uea.ac.uk/>School of Computing Sciences</A>.
-<A HREF=http://www.uea.ac.uk/>University of East Anglia.</A>
-Last Modified: 2007-08-21
-</ADDRESS>
+
</BODY>
</HTML>