summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/probsoln
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2011-08-24 00:09:20 +0000
committerKarl Berry <karl@freefriends.org>2011-08-24 00:09:20 +0000
commit00e6529c140ad1858c21526e6f8044aabb399270 (patch)
tree39e376e2630a9135fa211e3945879224c4c8e83b /Master/texmf-dist/source/latex/probsoln
parent9acea66f478ccf41a96c04350796f74e5e74757e (diff)
probsoln 3.01 (22aug11)
git-svn-id: svn://tug.org/texlive/trunk@23668 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/probsoln')
-rw-r--r--Master/texmf-dist/source/latex/probsoln/probsoln.dtx1881
-rw-r--r--Master/texmf-dist/source/latex/probsoln/probsoln.ins60
2 files changed, 1258 insertions, 683 deletions
diff --git a/Master/texmf-dist/source/latex/probsoln/probsoln.dtx b/Master/texmf-dist/source/latex/probsoln/probsoln.dtx
index a92e37f6598..1baeb9789e3 100644
--- a/Master/texmf-dist/source/latex/probsoln/probsoln.dtx
+++ b/Master/texmf-dist/source/latex/probsoln/probsoln.dtx
@@ -1,16 +1,15 @@
%\iffalse
% probsoln.dtx generated using makedtx version 0.94b (c) Nicola Talbot
% Command line args:
-% -macrocode ".*\.tex"
-% -setambles ".*\.tex=>\nopreamble\nopostamble"
-% -comment ".*\.tex"
-% -src "(.+\.sty)\Z=>\1"
-% -src "(.+\.tex)\Z=>\1"
+% -macrocode ".+\.tex"
+% -comment ".+\.tex"
+% -src "(.+)\.(sty)\Z=>\1.\2"
+% -src "(sample.*)\.(tex)\Z=>\1.\2"
+% -src "(prob-.*)\.(tex)\Z=>\1.\2"
% -doc "probsoln-manual.tex"
% -author "Nicola Talbot"
-% -dir "source"
% probsoln
-% Created on 2008/8/27 14:19
+% Created on 2011/8/22 22:10
%\fi
%\iffalse
%<*package>
@@ -33,86 +32,42 @@
%\fi
% \iffalse
% Doc-Source file to use with LaTeX2e
-% Copyright (C) 2008 Nicola Talbot, all rights reserved.
+% Copyright (C) 2011 Nicola Talbot, all rights reserved.
% \fi
% \iffalse
%<*driver>
-\documentclass[a4paper]{ltxdoc}
+\documentclass[a4paper]{nlctdoc}
+
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage{lmodern}
+\usepackage{color}
+
+\usepackage{probsoln}
+
\usepackage[colorlinks,
bookmarks,
hyperindex=false,
pdfauthor={Nicola L.C. Talbot},
pdftitle={probsoln: creating problem sheets optionally with solutions}]{hyperref}
+\doxitem{Option}{option}{package options}
-\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}}
+\CheckSum{1144}
-\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*{\dq}[1]{``#1''}
-
-\begin{document}\DocInput{probsoln.dtx}
+\begin{document}
+\DocInput{probsoln.dtx}
\end{document}
%</driver>
%\fi
%\MakeShortVerb{"}
%\DeleteShortVerb{\|}
%
-% \title{probsoln v3.0: creating problem sheets optionally with solutions}
+% \title{probsoln v3.01:
+%creating problem sheets optionally with solutions}
% \author{Nicola L.C. Talbot\\[10pt]
%School of Computing Sciences\\
%University of East Anglia\\
@@ -120,27 +75,25 @@
%NR4 7TJ. United Kingdom.\\
%\url{http://theoval.cmp.uea.ac.uk/~nlct/}}
%
-% \date{26th August 2008}
+% \date{2011-08-22}
% \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.
+%The \styfmt{probsoln} package is designed for teachers or lecturers
+%who want to create problem sheets for their students. This package
+%was designed with 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:
@@ -149,17 +102,29 @@
%\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
+%\item[\pkgopt{usedefaultargs}] Make \ics{thisproblem} use the
+%default arguments supplied in the problem definition.
+%\item[\pkgopt{nousedefaultargs}] Make \ics{thisproblem} prompt for
+%problem arguments (default).
%\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.
+%using
+%\begin{definition}[\DescribeMacro{\showanswers}]
+%\cs{showanswers}
+%\end{definition}
+%and
+%\begin{definition}[\DescribeMacro{\hideanswers}]
+%\cs{hideanswers}
+%\end{definition}
+%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
+%\sty{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)}{}
@@ -193,83 +158,85 @@
%\end{verbatim}
%\begin{important}
%You can't use verbatim text in the body of the
-%\ienv{onlyproblem} or \ienv{onlysolution} environments.
+%\envfmt{onlyproblem} or \envfmt{onlysolution} environments.
%If you need verbatim-like text, then try packages such as
-%\isty{alltt}. Remember that you also can't use verbatim
+%\sty{alltt}. Remember that you also can't use verbatim
%text in command arguments.
%\end{important}
%
+%If you use \envfmt{onlysolution} within the \env{defproblem}
+%environment, the problem will be tagged as having a solution
+%and will be added to the list used by \ics{foreachsolution}.
+%
%\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}
+%\begin{definition}[\DescribeEnv{solution}]
%\verb|\begin{solution}|\meta{text}\verb|\end{solution}|
%\end{definition}
-%This is equivalent to
-%\verb|\par\noindent\textbf{\solutionname}:|\meta{text}
+%By default, this is equivalent to
+%\begin{display}
+%\verb|\par\noindent\textbf{\solutionname}: |\meta{text}
+%\end{display}
%where \DescribeMacro{\solutionname}\cs{solutionname} defaults
-%to \dq{Solution}. Note that you must place the \env{solution}
-%environment inside the \ienv{onlysolution} environment or
+%to \dq{\solutionname}. Note that you must place the \env{solution}
+%environment inside the \envfmt{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}.)
+%\sectionref{sec:showanswers}.)
%
%
-%Note that the \sty{probsoln} package will only define the
+%Note that the \styfmt{probsoln} package will only define the
%\env{solution} environment if it is not already defined.
%
-%\DescribeEnv{textenum}
-%\begin{definition}
+%\begin{definition}[\DescribeEnv{textenum}]
%\verb|\begin{textenum}|\ldots\verb|\end{textenum}|
%\end{definition}
-%The \env{textenum} environment is like the \ienv{enumerate}
+%The \envfmt{textenum} environment is like the \env{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}
+%\envfmt{enumerate} environment would use at that level so the
+%question can be compact but the answer can use \envfmt{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}
+% 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}
+% \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
-%\href{http://www.tex.ac.uk/tex-archive/help/Catalogue/bytopic.html\#enumeration}{TeX Catalogue} for
-%further details.
+%\env{enumerate} environment would result in a lot of unnecessary
+%white space, but the answers require more space, so an
+%\envfmt{enumerate} environment is more appropriate. Since the
+%\envfmt{textenum} environment uses the same counters as the
+%\envfmt{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
+%\urlfootref{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}
+%\cs{correctitem}\\
+%\cs{incorrectitem}
%\end{definition}
%You can use the commands \cs{correctitem} and \cs{incorrectitem}
%in place of \ics{item}. If the solutions are suppressed, these
@@ -277,8 +244,8 @@
%format the item label using one of the commands:
%\DescribeMacro{\correctitemformat}\DescribeMacro{\incorrectitemformat}
%\begin{definition}
-%\csdef{correctitemformat}\marg{label}\\
-%\csdef{incorrectitemformat}\marg{label}
+%\cs{correctitemformat}\marg{label}\\
+%\cs{incorrectitemformat}\marg{label}
%\end{definition}
%For example:
%\begin{verbatim}
@@ -291,47 +258,50 @@
%\incorrectitem $P(a_1)=\frac{5}{4}$, $P(a_2)=-\frac{1}{4}$
%\end{enumerate}
%\end{verbatim}
+%The default definition of \cs{correctitemformat} puts a frame around
+%the label.
%
%\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}|
+%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 \styfmt{probsoln}
+%package has a default data set labelled \dq{default} in which you
+%can store problems. Alternatively, 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 \env{onlyproblem}, \env{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).
+%
+%\begin{definition}[\DescribeEnv{defproblem}]
+%\verb|\begin{defproblem}|\oarg{n}\oarg{default args}\marg{label}\newline
+%\meta{definition}\newline
+%\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.)
+%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 or a comma. (Active characters include the special characters
+%such as \$ and \&, but some packages may make other symbols active,
+%such as the colon (:) character. For example, the \sty{ngerman} and
+%\sty{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
+%\ics{input} or \ics{include}, then the problem will be added to
+%the default data set. If \envfmt{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
+%\sectionref{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 contents of the \env{defproblem} environment should be the text
+%that defines the problem. This may include any of the commands
+%defined in \sectionref{sec:showanswers} and
+%\sectionref{sec:formatting}.
%
%The problem may optionally take \meta{n} arguments (where
%\meta{n} is from 0 to 9). The arguments can be referenced
@@ -343,20 +313,35 @@
%\begin{defproblem}[1]{diffsin}
%Differentiate $f(x)=\sin(#1x)$.
%\begin{onlysolution}%
-%\begin{solution}
-%$f'(x) = #1\cos(#1x)$
-%\end{solution}
+% \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}
+%The second optional argument \meta{default args} supplies
+%default problem arguments that will automatically be used within
+%\ics{thisproblem} when used in \ics{foreachproblem} in conjunction
+%with the package option \pkgopt{usedefaultargs}. (See \sectionref{sec:foreach}.)
+%For example:
+%\begin{verbatim}
+%\begin{defproblem}[1][{2}]{diffsin}
+%Differentiate $f(x)=\sin(#1x)$.
+%\begin{onlysolution}%
+% \begin{solution}
+% $f'(x) = #1\cos(#1x)$
+% \end{solution}
+%\end{onlysolution}
+%\end{defproblem}
+%\end{verbatim}
+%
+%\begin{definition}[\DescribeMacro{\newproblem}]
+%\cs{newproblem}\oarg{n}\oarg{default args}\marg{label}\marg{problem}\marg{solution}
%\end{definition}
%This is a shortcut command for:
%\begin{ttfamily}\obeylines
-%\cs{begin}\{defproblem\}\oarg{n}\marg{label}\%
+%\cs{begin}\{defproblem\}\oarg{n}\oarg{default args}\marg{label}\%
%\meta{problem}\%
%\cs{begin}\{onlysolution\}\%
%\cs{begin}\{solution\}\%
@@ -368,59 +353,73 @@
%For example:
%\begin{verbatim}
%\newproblem[1]{diffsin}{%
-%\(f(x) = \sin(#1x)\)
-%}{%
-%\(f'(x) = #1\cos(#1x)\)
+% \(f(x) = \sin(#1x)\)
+%}%
+%{%
+% \(f'(x) = #1\cos(#1x)\)
%}
%\end{verbatim}
%is equivalent to
%\begin{verbatim}
%\begin{defproblem}[1]{diffcos}%
-%\(f(x) = \cos(#1x)\)
+% \(f(x) = \cos(#1x)\)
%\begin{onlysolution}%
-%\begin{solution}%
-%\(f'(x) = -#1\sin(#1x)\)
-%\end{solution}%
+% \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.)
+%\sty{fp} or \sty{pgfmath} packages.)
%
-%\DescribeMacro{\newproblem*}
-%\begin{definition}
-%\csdef{newproblem*}\oarg{n}\marg{label}\marg{definition}
+%Alternatively, if you want to supply default arguments to use when
+%iterating through problems with \ics{foreachproblem}:
+%\begin{verbatim}
+%\newproblem[1][{3}]{diffsin}{%
+% \(f(x) = \sin(#1x)\)
+%}%
+%{%
+% \(f'(x) = #1\cos(#1x)\)
+%}
+%\end{verbatim}
+%
+%
+%\begin{definition}[\DescribeMacro{\newproblem*}]
+%\cs{newproblem*}\oarg{n}\oarg{default args}\marg{label}\marg{definition}
%\end{definition}
%This is a shortcut for:
%\begin{ttfamily}\obeylines
-%\cs{begin}\{defproblem\}\oarg{n}\marg{label}\%
+%\cs{begin}\{defproblem\}\oarg{n}\oarg{default args}\marg{label}\%
%\meta{definition}\%
%\cs{end}\{defproblem\}
%\end{ttfamily}
%
%\begin{important}
-%Verbatim text must not be used in the contents of \ienv{defproblem}
+%Verbatim text must not be used in the contents of \env{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.
+%\cs{texttt} or the \sty{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}
+%Once you have defined a problem using \env{defproblem} or
+%\ics{newproblem} (see \sectionref{sec:defproblem}), you can
+%later display the problem using:
+%\begin{definition}[\DescribeMacro{\useproblem}]
+%\cs{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).
+%\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:
@@ -440,19 +439,18 @@
%\section{Loading Problems From External Files}\label{sec:load}
%
%You can store all your problem definitions (see
-%\autoref{sec:defproblem}) in an external file.
+%\sectionref{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
+%in \sectionref{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}
+%\begin{definition}[\DescribeMacro{\loadallproblems}]
+%\cs{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
@@ -460,11 +458,10 @@
%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}
+%\begin{definition}[\DescribeMacro{\loadselectedproblems}]
+%\cs{loadselectedproblems}\oarg{data set}\marg{labels}\marg{filename}
%\end{definition}
-%This is like \cs{loadproblems}, but only those problems whose
+%This is like \cs{loadallproblems}, 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
@@ -475,9 +472,15 @@
%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}
+%\begin{definition}[\DescribeMacro{\loadexceptproblems}]
+%\cs{loadexceptproblems}\oarg{data set}\marg{exception list}\marg{filename}
+%\end{definition}
+%This is the reverse of \cs{loadselectedproblems}. This loads all
+%problems except those whose labels are listed in \meta{exception
+%list}.
+%
+%\begin{definition}[\DescribeMacro{\loadrandomproblems}]
+%\cs{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,
@@ -486,43 +489,65 @@
%which they were defined. There must be at least \meta{n} problems
%defined in \meta{filename}.
%
+%\begin{definition}[\DescribeMacro{\loadrandomexcept}]
+%\cs{loadrandomexcept}\oarg{data
+%set}\marg{n}\marg{filename}\marg{exception list}
+%\end{definition}
+%This is similar to \cs{loadrandomproblems} except that it won't load
+%those problems whose labels are listed in \meta{exception list}.
+%
+%Note that the random number generator has been modified in version
+%3.01 in order to fix a bug. If you want to ensure that your random
+%numbers are compatible with earlier versions, you can switch to the
+%old generator using
+%\begin{definition}[\DescribeMacro{\PSNuseoldrandom}]
+%\cs{PSNuseoldrandom}
+%\end{definition}
+%
%\begin{important}
%It is generally not a good idea to place anything in
-%\meta{filename} that is not inside the body of \ienv{defproblem}
+%\meta{filename} that is not inside the body of \env{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
+%a local scope, so command 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.
+%Once you have defined all your problems for a given data set, you
+%can use an individual problem with \ics{useproblem} (see
+%\sectionref{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}
+%\begin{definition}[\DescribeMacro{\foreachproblem}]
+%\cs{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}
+%\begin{definition}[\DescribeMacro{\thisproblem}]
+%\cs{thisproblem}
+%\end{definition}
+%to use the current problem and
+%\begin{definition}[\DescribeMacro{\thisproblemlabel}]
+%\cs{thisproblemlabel}
+%\end{definition}
%to access the current label. If the problem requires arguments,
-%you will be prompted for them, so if you want to use this
+%and no default arguments were supplied in the problem definition or
+%the package option \pkgopt{usedefaultargs} was not used, then
+%you will be prompted for arguments, 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
+%\ics{useproblem}.
+%
+%For example, to iterate through all problems
%in the default data set:
%\begin{verbatim}
%\begin{enumerate}
@@ -530,9 +555,17 @@
%\end{enumerate}
%\end{verbatim}
%
-%\DescribeMacro{\foreachdataset}
-%\begin{definition}
-%\csdef{foreachdataset}\marg{cmd}\marg{body}
+%\begin{definition}[\DescribeMacro{\foreachsolution}]
+%\cs{foreachsolution}\oarg{data set}\marg{body}
+%\end{definition}
+%This is equivalent to \cs{foreachsolution}, but only iterates
+%through problems that contain the \env{onlysolution} environment.
+%Note that you still need to use \ics{showanswers} or the
+%\pkgopt{answers} package option for the contents of the
+%\env{onlysolution} environment to appear.
+%
+%\begin{definition}[\DescribeMacro{\foreachdataset}]
+%\cs{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
@@ -546,8 +579,8 @@
%
%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:
+%define problems using both \env{onlyproblem} and
+%\env{onlysolution} for example:
%\begin{verbatim}
%\begin{defproblem}{cosxsqsinx}%
%\begin{onlyproblem}%
@@ -565,7 +598,7 @@
%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,
+%I can cross-reference items within an \env{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
@@ -612,15 +645,19 @@
%\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}.
+%by \ics{loadrandomproblems}. As noted earlier the random number
+%generator has been modified in version 3.01 in order to fix a bug.
+%If you want to ensure that your random numbers are compatible with
+%earlier versions, you can switch to the old generator using
+%\begin{definition}[\DescribeMacro{\PSNuseoldrandom}]
+%\cs{PSNuseoldrandom}
+%\end{definition}
%
-%\DescribeMacro{\PSNrandseed}
-%\begin{definition}
-%\csdef{PSNrandseed}\marg{n}
+%\begin{definition}[\DescribeMacro{\PSNrandseed}]
+%\cs{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
@@ -636,9 +673,8 @@
%\PSNrandseed{\year}
%\end{verbatim}
%
-%\DescribeMacro{\PSNgetrandseed}
-%\begin{definition}
-%\csdef{PSNgetrandseed}\marg{register}
+%\begin{definition}[\DescribeMacro{\PSNgetrandseed}]
+%\cs{PSNgetrandseed}\marg{register}
%\end{definition}
%This stores the current seed in the count register specified by
%\meta{register}.
@@ -648,9 +684,8 @@
%\PSNgetrandseed{\myseed}
%\end{verbatim}
%
-%\DescribeMacro{\PSNrandom}
-%\begin{definition}
-%\csdef{PSNrandom}\marg{register}\marg{n}
+%\begin{definition}[\DescribeMacro{\PSNrandom}]
+%\cs{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,
@@ -661,9 +696,8 @@
%\PSNrandom{\myreg}{10}
%\end{verbatim}
%
-%\DescribeMacro{\random}
-%\begin{definition}
-%\csdef{random}\marg{counter}\marg{min}\marg{max}
+%\begin{definition}[\DescribeMacro{\random}]
+%\cs{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
@@ -674,9 +708,8 @@
%\random{myrand}{3}{8}
%\end{verbatim}
%
-%\DescribeMacro{\doforrandN}
-%\begin{definition}
-%\csdef{doforrandN}\marg{n}\marg{cmd}\marg{list}\marg{text}
+%\begin{definition}[\DescribeMacro{\doforrandN}]
+%\cs{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
@@ -690,7 +723,6 @@
%\loadrandomproblems{1}{\thisfile}}
%\end{verbatim}
%
-%
%\section{Compatibility With Versions Prior to 3.0}
%
%Version 3.0 of the \sty{probsoln} package completely changed the
@@ -744,30 +776,27 @@
%\end{enumerate}
%\end{verbatim}
%
-%\DescribeMacro{\selectrandomly}
-%\begin{definition}
-%\csdef{selectrandomly}\marg{filename}\marg{n}
+%\begin{definition}[\DescribeMacro{\selectrandomly}]
+%\cs{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}}
+%\cs{foreachproblem}\oarg{filename}\{\cs{PSNitem}\cs{thisproblem}\cs{endPSNitem}\}
%\end{ttfamily}
%
-%\DescribeMacro{\selectallproblems}
-%\begin{definition}
-%\csdef{selectallproblems}\marg{filename}
+%\begin{definition}[\DescribeMacro{\selectallproblems}]
+%\cs{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}}
+%\cs{foreachproblem}\oarg{filename}\{\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}
%
%
@@ -785,12 +814,12 @@
% \end{macrocode}
% Identify this package and version:
% \begin{macrocode}
-\ProvidesPackage{probsoln}[2008/08/25 v3.0 (NLCT)]
+\ProvidesPackage{probsoln}[2011/08/22 v3.01 (NLCT)]
% \end{macrocode}
% Required packages:
+%\changes{2011/08/22}{3.01}{substr package no longer required}
% \begin{macrocode}
\RequirePackage{ifthen}
-\RequirePackage{substr}
\RequirePackage{amsmath}
% \end{macrocode}
% \subsection{Package Options}
@@ -823,6 +852,24 @@
% \begin{macrocode}
\DeclareOption{noanswers}{\showanswersfalse}
% \end{macrocode}
+% Determine whether or not to use default arguments for problems.
+%\begin{macro}{\ifusedefaultprobargs}
+% \begin{macrocode}
+\newif\ifusedefaultprobargs
+% \end{macrocode}
+%\end{macro}
+%\begin{option}{usedefaultargs}
+% \begin{macrocode}
+\DeclareOption{usedefaultargs}{\usedefaultprobargstrue}
+% \end{macrocode}
+%\end{option}
+%\begin{option}{usedefaultargs}
+% \begin{macrocode}
+\DeclareOption{nousedefaultargs}{\usedefaultprobargsfalse}
+\usedefaultprobargsfalse
+% \end{macrocode}
+%\end{option}
+%
%\begin{macro}{\prob@showdraftlabel}
%\begin{definition}
%\cs{prob@showdraftlabel}\marg{db name}\marg{label}
@@ -879,6 +926,10 @@
\newcommand*{\prob@databases}{default}
% \end{macrocode}
%\end{macro}
+% Each defined database has a list of undisplayed solutions.
+% \begin{macrocode}
+\newcommand*{\prob@db@default@solutions}{}
+% \end{macrocode}
%
%\begin{macro}{\prob@newdb}
%\begin{definition}
@@ -890,6 +941,7 @@
\@ifundefined{prob@db@#1}{%
\expandafter\gdef\csname prob@db@#1\endcsname{}%
\xdef\prob@databases{\prob@databases,#1}%
+ \expandafter\gdef\csname prob@db@#1@solutions\endcsname{}%
}{%
\PackageError{probsoln}{Data set `#1' is already defined}{}}}
% \end{macrocode}
@@ -992,8 +1044,10 @@
%
%\subsection{Defining New Problems}
%\begin{macro}{\prob@newproblem}
+%\changes{2011/08/22}{3.01}{added extra argument to supply defaults}
%\begin{definition}
-%\cs{prob@newproblem}\marg{n}\marg{db name}\marg{label}\marg{definition}
+%\cs{prob@newproblem}\marg{n}\marg{db
+%name}\marg{label}\marg{definition}\marg{default args}
%\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}
@@ -1004,42 +1058,48 @@
% number of arguments is stored in
% \cs{prob@argN@}\meta{db name}"@"\meta{label}
% \begin{macrocode}
-\newcommand{\prob@newproblem}[4]{%
+\newcommand{\prob@newproblem}[5]{%
% \end{macrocode}
% If the given data base is not defined, create it:
% \begin{macrocode}
-\@ifundefined{prob@db@#2}{\prob@newdb{#2}}{}%
+ \@ifundefined{prob@db@#2}{\prob@newdb{#2}}{}%
% \end{macrocode}
% Check whether this entry has already been defined:
% \begin{macrocode}
-\@ifundefined{prob@data@#2@#3}{%
+ \@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
+ \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
+ \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:
+% If default arguments supplied, set them
% \begin{macrocode}
-\ifnum#1>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}}%
+ \ifx\@empty#5\@empty
+ \else
+ \edef\thisprob@currentdb{#2}%
+ \edef\thisprob@currentlabel{#3}%
+ \expandafter\@setdefaultprobargs\expandafter{#5}%
+ \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}
@@ -1059,11 +1119,20 @@
% \begin{macrocode}
\newcommand{\@prob@getargs}[3]{%
\message{Problem `#3' (in data base `#2') requires #1 argument(s).^^J
-Please specify (e.g. {5}{3}):}%
+Please specify (e.g. \csname @prob@getargs@eg@\romannumeral#1\endcsname):}%
\read-1to\@tmp
\expandafter\global\expandafter\let
\csname prob@args@#2@#3\endcsname=\@tmp
}
+\def\@prob@getargs@eg@i{{12}}
+\def\@prob@getargs@eg@ii{{5}{3}}
+\def\@prob@getargs@eg@iii{{4}{5}{2}}
+\def\@prob@getargs@eg@iv{{5}{3}{10}{8}}
+\def\@prob@getargs@eg@v{{5}{3}{10}{8}{4}}
+\def\@prob@getargs@eg@vi{{5}{3}{10}{8}{4}{24}}
+\def\@prob@getargs@eg@vii{{5}{3}{10}{8}{4}{24}{32}}
+\def\@prob@getargs@eg@viii{{5}{3}{10}{8}{4}{24}{32}{9}}
+\def\@prob@getargs@eg@ix{{5}{3}{10}{8}{4}{24}{32}{9}{2}}
% \end{macrocode}
%\end{macro}
%\begin{macro}{\@prob@do@getargs}
@@ -1072,6 +1141,36 @@ Please specify (e.g. {5}{3}):}%
% \end{macrocode}
%\end{macro}
%
+%\begin{macro}{\setprobargs}
+%\begin{definition}
+%\cs{setprobargs}\oarg{db name}\marg{label}\marg{args}
+%\end{definition}
+% Sets the arguments for the given problem. Each of the arguments
+% within \meta{args} should be grouped, e.g.
+% "\setprobargs{label}{{5}{3}}". Inner braces are still required if
+% there is only one argument, e.g. "\setprobargs{label}{{25}}"
+% \begin{macrocode}
+\newcommand*{\setprobargs}[3][default]{%
+ \expandafter\gdef\csname prob@args@#1@#2\endcsname{#3}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@setdefaultprobargs}
+% Like \cs{setprobargs} but only sets the arguments if
+% \ics{usedefaultprobargstrue}. The database is given
+% by \cs{thisprob@currentdb} (the current database) and
+% the problem label is given by \cs{thisprob@currentlabel}.
+% This command should only be used within \env{defproblem}.
+% \begin{macrocode}
+\newcommand*{\@setdefaultprobargs}[1]{%
+ \ifusedefaultprobargs
+ \setprobargs[\thisprob@currentdb]{\thisprob@currentlabel}{#1}%
+ \fi
+}
+% \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}.
@@ -1088,14 +1187,25 @@ Please specify (e.g. {5}{3}):}%
% \end{macrocode}
%\end{macro}
%\begin{macro}{\long@addto@envbody}
+%\changes{2011/08/22}{3.01}{modified to allow for floats in the body of the
+%environment}
% \begin{macrocode}
-\long\def\long@addto@envbody#1{\global\@envbody\@xp{\the\@envbody#1}}
+\long\def\long@addto@envbody#1{%
+ \toks@{#1}%
+ \edef\@psn@tmp{\the\@envbody\the\toks@}%
+ \global\@envbody\@xp{\@psn@tmp}%
+}
% \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}%
+% \end{macrocode}
+%\changes{2011/08/22}{3.01}{changed \cs{edef} to \cs{protected@edef}}
+% \begin{macrocode}
+ \protected@edef\begin@stack{%
+ \long@push@begins#1\begin\end \@xp\@gobble\begin@stack
+ }%
\ifx\@empty\begin@stack
\endgroup
\@checkend{#2}%
@@ -1116,19 +1226,25 @@ Please specify (e.g. {5}{3}):}%
%\end{macro}
%
%\begin{environment}{defproblem}
+%\changes{2011/08/22}{3.01}{added second optional argument}
%\begin{definition}
-%"\begin{defproblem}"\oarg{n}\marg{label}
+%"\begin{defproblem}"\oarg{n}\oarg{default args}\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}%
+\newenvironment{defproblem}[1][0]{%
+ \edef\@prob@currentargN{\number0#1}%
+ \@defproblem@beginenv
+}{}
+
+\newcommand*{\@defproblem@beginenv}[2][]{%
+ \def\@prob@currentdefaultargs{#1}%
\def\@prob@currentlabel{#2}%
\long@collect@body\prob@do@defproblem
-}{}
+}
% \end{macrocode}
%\end{environment}
%\begin{macro}{\prob@do@newproblem}
@@ -1141,8 +1257,8 @@ Please specify (e.g. {5}{3}):}%
% is given by \cs{prob@currentdb}.
% \begin{macrocode}
\newcommand{\prob@do@newproblem}[1]{%
-\prob@newproblem\@prob@currentargN\prob@currentdb
- \@prob@currentlabel{#1}}
+ \prob@newproblem\@prob@currentargN\prob@currentdb
+ \@prob@currentlabel{#1}{\@prob@currentdefaultargs}}
% \end{macrocode}
%\end{macro}
%
@@ -1166,9 +1282,66 @@ Please specify (e.g. {5}{3}):}%
%\begin{macro}{\do@onlysolution}
% \begin{macrocode}
\newcommand{\do@onlysolution}[1]{%
-\ifshowanswers
- #1%
-\fi}
+ \ifshowanswers
+ #1%
+ \fi
+% \end{macrocode}
+% Add to the list of solutions
+% \begin{macrocode}
+ \@ifundefined{@prob@currentlabel}
+ {}%
+ {%
+ \expandafter
+ \psn@add@unique@label
+ \csname prob@db@\prob@currentdb @solutions\endcsname{%
+ \@prob@currentlabel
+ }%
+ }%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\psn@add@unique@label}
+%\changes{2011/08/22}{3.01}{new}
+%\begin{definition}
+%\cs{psn@add@unique@label}\marg{list cs}\marg{label}
+%\end{definition}
+% Globally adds label to list if not already in list.
+% \begin{macrocode}
+\newcommand*{\psn@add@unique@label}[2]{%
+ \ifx#1\@empty
+ \xdef#1{#2}%
+ \else
+ \edef\@tmp@label{#2}%
+ \expandafter\DTLifinlist\expandafter{\@tmp@label}{#1}%
+ {}% ignore
+ {\xdef#1{#1,\@tmp@label}}%
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTLifinlist}
+% This is defined in \sty{datatool}, but there's no sense loading
+% the entire package just for this, so define if not already
+% defined.
+%\changes{2011/08/22}{3.01}{new}
+% \begin{macrocode}
+\providecommand{\DTLifinlist}[4]{%
+ \def\@dtl@doifinlist##1,#1,##2\end@dtl@doifinlist{%
+ \def\@before{##1}%
+ \def\@after{##2}%
+ }%
+ \expandafter\@dtl@doifinlist\expandafter,#2,#1,\@nil
+ \end@dtl@doifinlist
+ \ifx\@after\@nnil
+% not found
+ #4%
+ \else
+% found
+ #3%
+ \fi
+}
% \end{macrocode}
%\end{macro}
%
@@ -1201,17 +1374,23 @@ Please specify (e.g. {5}{3}):}%
% \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.
+%\changes{2011/08/22}{3.01}{changed \cs{@next} to \cs{@useprob@next}}
% \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}
+ \def\@prob@currentlabel{#2}%
+ \def\prob@currentdb{#1}%
+ \prob@showdraftlabel{#1}{#2}%
+ \let\@useprob@next=\relax
+ \@ifundefined{prob@data@#1@#2}%
+ {%
+ \PackageError{probsoln}%
+ {Problem `#2' is not defined in data set `#1'}{}%
+ }%
+ {%
+ \def\@useprob@next{\csname prob@data@#1@#2\endcsname}%
+ }%
+ \@useprob@next
+}
% \end{macrocode}
%\end{macro}
%\subsection{Loading Problems From Another File}
@@ -1236,10 +1415,15 @@ Please specify (e.g. {5}{3}):}%
% Only define problem if the label is listed in
% \cs{prob@selectedlabels}. (The current label is
% given by \cs{@prob@currentlabel}.)
+%\changes{2011/08/22}{3.01}{replaced \cs{IFSubStringInString} with
+%\cs{DTLifinlist}}
% \begin{macrocode}
\newcommand{\prob@do@selectedproblem}[1]{%
-\IfSubStringInString{,\@prob@currentlabel,}{,\prob@selectedlabels,}{%
-\prob@do@newproblem{#1}}{}%
+ \expandafter\DTLifinlist\expandafter{\@prob@currentlabel}{\prob@selectedlabels}%
+ {%
+ \prob@do@newproblem{#1}%
+ }%
+ {}%
}
% \end{macrocode}
%\end{macro}
@@ -1263,6 +1447,41 @@ Please specify (e.g. {5}{3}):}%
% \end{macrocode}
%\end{macro}
%
+%\begin{macro}{\prob@do@exceptedproblem}
+% Only define problem if the label isn't listed in
+% \cs{prob@selectedlabels}. (The current label is
+% given by \cs{@prob@currentlabel}.)
+% \begin{macrocode}
+\newcommand{\prob@do@exceptedproblem}[1]{%
+ \expandafter\DTLifinlist\expandafter{\@prob@currentlabel}{\prob@selectedlabels}%
+ {}%
+ {%
+ \prob@do@newproblem{#1}%
+ }%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\loadexceptproblems}
+%\begin{definition}
+%\cs{loadexceptproblems}\oarg{db name}\marg{list}\marg{filename}
+%\end{definition}
+% Loads only those problems whose labels are not listed in
+% \meta{list}.
+%\changes{2011/08/22}{3.01}{new}
+% \begin{macrocode}
+\newcommand{\loadexceptproblems}[3][default]{%
+\bgroup
+ \let\par\relax
+ \edef\prob@currentdb{#1}%
+ \edef\prob@selectedlabels{#2}%
+ \let\prob@do@defproblem=\prob@do@exceptedproblem
+ \input{#3}%
+\egroup
+}
+% \end{macrocode}
+%\end{macro}
+%
%\begin{macro}{\prob@add@currentlabel}
% Adds the current label to \cs{prob@selectedlabels} (ignores
% argument.)
@@ -1289,10 +1508,32 @@ Please specify (e.g. {5}{3}):}%
%\cs{loadrandomproblems}\oarg{db name}\marg{n}\marg{filename}
%\end{definition}
% Loads \meta{n} randomly selected problems from \meta{filename}.
+% \begin{macrocode}
+\newcommand{\loadrandomproblems}[3][default]{%
+ \@loadrandomproblems{#1}{#2}{#3}{}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\loadrandomexcept}
+%\begin{definition}
+%\cs{loadrandomexcept}\oarg{db
+%name}\marg{n}\marg{filename}\marg{exception list}
+%\end{definition}
+% Loads \meta{n} randomly selected problems from \meta{filename},
+% excluding labels listed in \meta{exception list}.
+% \begin{macrocode}
+\newcommand{\loadrandomexcept}[4][default]{%
+ \@loadrandomproblems{#1}{#2}{#3}{#4}%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\@loadrandomproblems}
+% Internal workings of \cs{loadrandomproblems} and
+% \cs{loadrandomexcept}.
% 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]{%
+\newcommand{\@loadrandomproblems}[4]{%
\bgroup
\let\par\relax
\def\prob@db@reserved{}%
@@ -1309,17 +1550,23 @@ Please specify (e.g. {5}{3}):}%
% \begin{macrocode}
\@probselN=0\relax
\@for\@thislabel:=\prob@selectedlabels\do{%
- \advance\@probselN by 1\relax
- \expandafter
- \edef\csname @prob@tmp@\romannumeral\@probselN\endcsname{%
- \@thislabel}%
+ \expandafter\DTLifinlist\expandafter
+ {\@thislabel}{#4}{}%
+ {%
+ \advance\@probselN by 1\relax
+ \expandafter
+ \edef\csname @prob@tmp@\romannumeral\@probselN\endcsname{%
+ \@thislabel}%
+ }%
}%
\shuffle{@prob@tmp@}{\@probselN}%
\ifnum\@probselN<#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}%
+% \end{macrocode}
+%\changes{2011/08/22}{3.01}{changed error to warning}
+% \begin{macrocode}
+ \PackageWarning{probsoln}{You have requested
+ \number#2\space\space problem(s) but `#3' only contains
+ \number\@probselN\space problems. All problems will be selected}%
\else
\@probselN=#2\relax
\fi
@@ -1400,6 +1647,46 @@ Please specify (e.g. {5}{3}):}%
% \end{macrocode}
%\end{macro}
%
+%\begin{macro}{\foreachsolution}
+%\begin{definition}
+%\cs{foreachsolution}\oarg{db name}\marg{body}
+%\end{definition}
+% Does \meta{body} for each problem defined in the data base
+% \meta{db name} that has a solution contained within
+% \env{onlysolution}. 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{\foreachsolution}[2][default]{%
+\@ifundefined{prob@db@#1}{%
+ \PackageError{probsoln}{Data base `#1' is not defined}{}%
+}{%
+ \expandafter\let\expandafter\@tmp\csname prob@db@#1@solutions\endcsname
+ \@for\thisproblemlabel:=\@tmp\do{%
+ \ifx\thisproblemlabel\@empty
+ \else
+ \expandafter\ifnum
+ \csname prob@argN@#1@\thisproblemlabel\endcsname>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%
+ \fi
+ }%
+}%
+}
+% \end{macrocode}
+%\end{macro}
+%
%\begin{macro}{\foreachdataset}
%\begin{definition}
%\cs{foreachdataset}\marg{cmd}\marg{body}
@@ -1424,13 +1711,13 @@ Please specify (e.g. {5}{3}):}%
% 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}%
+ \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}
@@ -1443,19 +1730,45 @@ Please specify (e.g. {5}{3}):}%
% 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
+ \@ps@randtmp=\r@ndcur
+ \multiply\@ps@randtmp by 16811\relax
+ \r@ndcur=\@ps@randtmp
+ \global\divide\r@ndcur by 39989\relax
+ \global\multiply\r@ndcur by 39989\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}{\PSN@old@rand}
+% Random generator used in v3.0 and earlier
+% \begin{macrocode}
+\newcommand*{\PSN@old@rand}{%
+ \@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}{\PSNuseoldrandom}
+% Use the old random number generator
+% \begin{macrocode}
+\newcommand*{\PSNuseoldrandom}{%
+ \let\PSNrand\PSN@old@rand
}
% \end{macrocode}
%\end{macro}
+%
%\begin{macro}{\PSNrandom}
%\begin{definition}
%\cs{PSNrandom}\marg{count}\marg{n}
@@ -1467,16 +1780,16 @@ Please specify (e.g. {5}{3}):}%
% \end{macrocode}
% generate new random number.
% \begin{macrocode}
-\PSNrand
-#1=\r@ndcur
-\@ps@randtmp=\r@ndcur
+ \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
+ \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}
@@ -1510,20 +1823,21 @@ Please specify (e.g. {5}{3}):}%
% \begin{macrocode}
\newcount\@shfctr \newcount\@shfA \newcount\@shfB
\newcommand{\shuffle}[2]{%
-\@shfctr=1\relax
-\whiledo{\@shfctr < 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
-}%
+ \@shfctr=1\relax
+ \whiledo{\@shfctr < 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}
@@ -1543,57 +1857,84 @@ Please specify (e.g. {5}{3}):}%
% \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<#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>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<#1\relax
-\repeat
-\fi
-\fi
-}}
+ {%
+ \@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<#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>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<#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}
+%\changes{2011/08/22}{3.01}{added second optional argument}
% Defines a new problem.
% \begin{macrocode}
\newcommand*{\newproblem}{\@ifstar\@snewproblem\@newproblem}
% \end{macrocode}
%\end{macro}
%\begin{macro}{\@snewproblem}
+% Store first optional argument
+% \begin{macrocode}
+\newcommand{\@snewproblem}[1][0]{%
+ \def\@newprob@argN{#1}%
+ \@s@newproblem
+}%
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\@s@newproblem}
+% Define a new problem without a solution
% \begin{macrocode}
-\newcommand{\@snewproblem}[3][0]{%
-\begin{defproblem}[#1]{#2}%
-#3%
-\end{defproblem}}
+\newcommand{\@s@newproblem}[3][]{%
+ \begin{defproblem}[\@newprob@argN][#1]{#2}%
+ #3%
+ \end{defproblem}%
+}
% \end{macrocode}
%\end{macro}
%\begin{macro}{\@newproblem}
+% Store first optional argument
% \begin{macrocode}
-\newcommand{\@newproblem}[4][0]{%
-\begin{defproblem}[#1]{#2}%
-#3%
-\begin{onlysolution}%
-\begin{solution}%
-#4%
-\end{solution}%
-\end{onlysolution}%
-\end{defproblem}}
+\newcommand{\@newproblem}[1][0]{%
+ \def\@newprob@argN{#1}%
+ \@ns@newproblem
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\@ns@newproblsm}
+% Define problem with a solution:
+% \begin{macrocode}
+\newcommand{\@ns@newproblem}[4][]{%
+ \begin{defproblem}[\@newprob@argN][#1]{#2}%
+ #3%
+ \begin{onlysolution}%
+ \begin{solution}%
+ #4%
+ \end{solution}%
+ \end{onlysolution}%
+ \end{defproblem}%
+}
% \end{macrocode}
%\end{macro}
%
@@ -1621,13 +1962,15 @@ are only \number\@ps@forrand item(s) in the list}%
% These commands are provided to format parts of the
% problems/solutions.
%\begin{environment}{solution}
+%\changes{2011/08/22}{3.01}{added space after solution tag}
% \begin{macrocode}
\@ifundefined{solution}{%
-\newenvironment{solution}{\par\noindent\textbf{\solutionname:}}{}%
+ \newenvironment{solution}{\par\noindent\textbf{\solutionname:}\space
+ \ignorespaces}{}%
}{}
% \end{macrocode}
%\end{environment}
-%\begin{macro}{\solutioname}
+%\begin{macro}{\solutionname}
% \begin{macrocode}
\newcommand*{\solutionname}{Solution}
% \end{macrocode}
@@ -1638,17 +1981,23 @@ are only \number\@ps@forrand item(s) in the list}%
%\changes{2007 Oct 6}{2.05}{new}
% \begin{macrocode}
\newenvironment{textenum}{%
-\ifnum\@enumdepth>\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}
+ \ifnum\@enumdepth>\thr@@
+ \@toodeep
+ \else
+ \advance\@enumdepth\@ne\relax
+ \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\relax
+}
% \end{macrocode}
%\end{environment}
%\begin{macro}{\@textitem}
@@ -1725,12 +2074,335 @@ are only \number\@ps@forrand item(s) in the list}%
%\fi
%\iffalse
% \begin{macrocode}
-%<*1stprncp.tex>
+%<*sample.tex>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+ % This file is public domain
+\documentclass[a4paper]{article}
+
+\usepackage{probsoln}
+ %uncomment the following line to display the answers
+\showanswers
+
+ % The following will generate a different set of
+ % problems each year
+ %\PSNrandseed{\year}
+
+ % Load 1 problem randomly selected from the given file
+ % and store in database 'firstprinciples':
+\loadrandomproblems[firstprinciples]{1}{prob-1stprncp}
+
+ % Load 5 problems randomly selected from the given file
+ % and store in database 'easy':
+\loadrandomproblems[easy]{5}{prob-easy}
+
+ % Load 2 problems randomly selected from the given file
+ % and store in database 'implicit':
+\loadrandomproblems[implicit]{2}{prob-implicit}
+
+ % Load 2 problems randomly selected from the given file
+ % and store in database 'probspaces':
+\loadrandomproblems[probspaces]{2}{prob-probspaces}
+
+ % Load 1 problem randomly selected from the given file
+ % and store in database 'mchoice':
+\loadrandomproblems[mchoice]{1}{prob-mchoice}
+
+ % Load 1 problem randomly selected from the given file
+ % and store in database 'nosoln':
+\loadrandomproblems[nosoln]{1}{prob-nosoln}
+
+
+\begin{document}
+\title{Sample Problem Sheet}
+\author{Nicola Talbot}
+\maketitle
+
+\begin{enumerate}
+ % Differentiation from first principles
+ \foreachproblem[firstprinciples]{\item \thisproblem}
+
+\item Differentiate the following functions:
+\begin{enumerate}
+ \foreachproblem[easy]{\item \thisproblem}
+\end{enumerate}
+
+ % Implicit differentiation
+\foreachproblem[implicit]{\item \thisproblem}
+
+ % Finite probability spaces
+\foreachproblem[probspaces]{\item \thisproblem}
+
+ % Multiple choice question
+\foreachproblem[mchoice]{\item \thisproblem}
+
+ % select one essay style question that doesn't come with a solution
+
+\foreachproblem[nosoln]{\item \thisproblem}
+\end{enumerate}
+\end{document}
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%</sample.tex>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*sample2.tex>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+ % This file is public domain
+\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}{prob-1stprncp,prob-implicit}{\selectrandomly{\file}{\value{numproblems}}}
+
+\item Differentiate the following functions:
+\input{prob-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}
+%</sample2.tex>
% \end{macrocode}
%\fi
%\iffalse
% \begin{macrocode}
- % These all involve differentiating from 1st principles
+%<*sample3.tex>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+ % This file is public domain
+\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 & \bfseries A & \bfseries B &
+\bfseries C & \ifshowanswers \bfseries Reason\fi\\
+\selectrandomly{prob-tabmchoice}{2}
+\end{longtable}
+\end{document}
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%</sample3.tex>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*sample4.tex>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+ % This file is public domain
+\documentclass[a4paper]{article}
+
+\usepackage{probsoln}
+
+ % Sample file illustrating use of \loadallproblems
+ % All problems defined in specified file will be used
+ % in order of definition
+
+ \loadallproblems{prob-easy}
+ %\loadselectedproblems{diffeasy:gpowh,diffeasy:arccos}{prob-easy}
+ %\loadexceptproblems{diffeasy:gpowh,diffeasy:arccos}{prob-easy}
+
+ \showanswers
+
+\begin{document}
+Differentiate the following functions:
+\begin{enumerate}
+ \foreachproblem{\item \thisproblem}
+\end{enumerate}
+\end{document}
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%</sample4.tex>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*sample5.tex>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+ % This file is public domain
+\documentclass[a4paper]{report}
+
+\usepackage{probsoln}
+
+\begin{document}
+\hideanswers
+
+\chapter{Easy Problems}
+\loadrandomproblems[easyproblems]{5}{prob-easy2}
+
+\renewcommand{\theenumi}{\thechapter.\arabic{enumi}}
+\begin{enumerate}
+\foreachproblem[easyproblems]{\item\label{prob:\thisproblemlabel}\thisproblem}
+\end{enumerate}
+
+\chapter{Probability Spaces}
+\loadrandomproblems[probspaces]{2}{prob-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}
+%</sample5.tex>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*sample6.tex>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+\documentclass{article}
+
+\usepackage[usedefaultargs]{probsoln}
+
+\loadallproblems{prob-args}
+
+\begin{document}
+\begin{enumerate}
+\foreachproblem{\item \thisproblem}
+\end{enumerate}
+\end{document}
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%</sample6.tex>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*sample7.tex>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+\documentclass{article}
+
+\usepackage{tikz}
+\usepackage{probsoln}
+
+\loadallproblems{prob-mixed}
+
+\begin{document}
+\section{Exercises}
+\begin{enumerate}
+ \foreachproblem{\item\label{q-\thisproblemlabel} \thisproblem}
+\end{enumerate}
+
+\section{Solutions}
+\showanswers
+
+\begin{enumerate}
+ \foreachsolution{\item[\ref{q-\thisproblemlabel}] \thisproblem}
+\end{enumerate}
+\end{document}
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%</sample7.tex>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*prob-1stprncp.tex>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+ % This file is public domain
+ %
+ % These problems all involve differentiating from 1st principles
\newproblem{dfp:xcube}{%
Differentiate $f(x) = x^3$ with respect to $x$ by first principles.}{%
@@ -1795,22 +2467,24 @@ differentiate from first principles $f(x) = \cos x$.}{%
%\fi
%\iffalse
% \begin{macrocode}
-%</1stprncp.tex>
+%</prob-1stprncp.tex>
% \end{macrocode}
%\fi
%\iffalse
% \begin{macrocode}
-%<*args.tex>
+%<*prob-args.tex>
% \end{macrocode}
%\fi
%\iffalse
% \begin{macrocode}
+ % This file is public domain
+ %
% These problems require arguments
-
+%
% Arguments: #1->a_2, #2->a_1 and #3->a_0
% (Arguments must be integers)
\newcount\ctr
-\newproblem[3]{diff:quad}{%
+\newproblem[3][{1}{2}{3}]{diff:quad}{%
\(f(x) =
\ifnum#1=0
\else
@@ -1844,26 +2518,30 @@ differentiate from first principles $f(x) = \cos x$.}{%
\)
}
-\newproblem[1]{diff:sin}{%
-\(f(x) = \sin(#1x)\)
-}{%
-\(f'(x) = #1\cos(#1x)\)
-}
-
+\begin{defproblem}[1][{6}]{diff:sin}
+\begin{onlyproblem}
+ \(f(x) = \sin(#1x)\)
+\end{onlyproblem}
+\begin{onlysolution}
+ \(f'(x) = #1\cos(#1x)\)
+\end{onlysolution}
+\end{defproblem}
% \end{macrocode}
%\fi
%\iffalse
% \begin{macrocode}
-%</args.tex>
+%</prob-args.tex>
% \end{macrocode}
%\fi
%\iffalse
% \begin{macrocode}
-%<*easy.tex>
+%<*prob-easy.tex>
% \end{macrocode}
%\fi
%\iffalse
% \begin{macrocode}
+ % This file is public domain
+ %
% These are all easy differentiation problems
\newproblem{diffeasy:gpowh}{%
@@ -1953,16 +2631,18 @@ $y = \frac{\sin x}{x}$.}{%
%\fi
%\iffalse
% \begin{macrocode}
-%</easy.tex>
+%</prob-easy.tex>
% \end{macrocode}
%\fi
%\iffalse
% \begin{macrocode}
-%<*easy2.tex>
+%<*prob-easy2.tex>
% \end{macrocode}
%\fi
%\iffalse
% \begin{macrocode}
+ % This file is public domain
+ %
% These are all easy differentiation problems
\begin{defproblem}{diffeasy:gpowh}%
@@ -2102,16 +2782,18 @@ $y = \frac{\sin x}{x}$.
%\fi
%\iffalse
% \begin{macrocode}
-%</easy2.tex>
+%</prob-easy2.tex>
% \end{macrocode}
%\fi
%\iffalse
% \begin{macrocode}
-%<*implicit.tex>
+%<*prob-implicit.tex>
% \end{macrocode}
%\fi
%\iffalse
% \begin{macrocode}
+ % This file is public domain
+ %
% These are all implicit differentiation problems
\newproblem{imd:circ}{%
@@ -2157,16 +2839,19 @@ xe^{xy}\frac{dy}{dx} - \frac{dy}{dx} & = & 2 - ye^{xy} \\
%\fi
%\iffalse
% \begin{macrocode}
-%</implicit.tex>
+%</prob-implicit.tex>
% \end{macrocode}
%\fi
%\iffalse
% \begin{macrocode}
-%<*mchoice.tex>
+%<*prob-mchoice.tex>
% \end{macrocode}
%\fi
%\iffalse
% \begin{macrocode}
+ % This file is public domain
+ %
+ % These problems are for multiple choice questions
\newproblem{mc:prod}{%
Which of the following is the derivative of $x\sin(x)$?
(Circle the correct answer.)
@@ -2205,16 +2890,109 @@ Which of the following is the derivative of $\frac{\sin(x)}{x}$?
%\fi
%\iffalse
% \begin{macrocode}
-%</mchoice.tex>
+%</prob-mchoice.tex>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*prob-mixed.tex>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+ % This file is public domain
+ %
+ % These problems are a mixture of essay-style and questions with
+ % answers. One of these problems requires the tikz package
+
+\newproblem*{oop}{Describe what is meant by object-oriented
+programming.}
+
+\begin{defproblem}{inheritance}
+ Describe what is meant by the term \emph{inheritance} in
+ object-oriented programming. Use examples.
+\end{defproblem}
+
+\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}$
+&
+\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$
+&
+\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}
+
+\begin{defproblem}{digraph}\label{ex:digraph}
+ \begin{onlyproblem}
+ Identify, if any, the sinks and sources of the digraph shown in Figure~\ref{fig:digraph}.
+
+ \begin{figure}[tbh]
+ \centering
+ \begin{tikzpicture}[every node/.style={draw,circle}]
+ \path (0,0) node (A) {$A$}
+ (1,0) node (B) {$B$}
+ (0,1) node (C) {$C$};
+ \draw[->] (A) -- (B);
+ \draw[->] (B) -- (C);
+ \draw[->] (A) -- (C);
+ \end{tikzpicture}
+ \par
+ \caption{Digraph for Question~\ref{ex:digraph}}
+ \label{fig:digraph}
+ \end{figure}
+ \end{onlyproblem}
+ \begin{onlysolution}
+ $A$ is a souce and $C$ is a sink.
+ \end{onlysolution}
+\end{defproblem}
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%</prob-mixed.tex>
% \end{macrocode}
%\fi
%\iffalse
% \begin{macrocode}
-%<*newdata.tex>
+%<*prob-newdata.tex>
% \end{macrocode}
%\fi
%\iffalse
% \begin{macrocode}
+ % This file is public domain
\begin{defproblem}{sample}
\begin{onlyproblem}
Differentiate $y=\sin x$
@@ -2245,16 +3023,18 @@ $y' = 2x$
%\fi
%\iffalse
% \begin{macrocode}
-%</newdata.tex>
+%</prob-newdata.tex>
% \end{macrocode}
%\fi
%\iffalse
% \begin{macrocode}
-%<*nosoln.tex>
+%<*prob-nosoln.tex>
% \end{macrocode}
%\fi
%\iffalse
% \begin{macrocode}
+ % This file is public domain
+ %
% these problems don't have solutions
\newproblem*{oop}{Describe what is meant by object-oriented
@@ -2266,16 +3046,18 @@ programming.}
%\fi
%\iffalse
% \begin{macrocode}
-%</nosoln.tex>
+%</prob-nosoln.tex>
% \end{macrocode}
%\fi
%\iffalse
% \begin{macrocode}
-%<*probspaces.tex>
+%<*prob-probspaces.tex>
% \end{macrocode}
%\fi
%\iffalse
% \begin{macrocode}
+ % This file is public domain
+ %
% Finite probability spaces
\newproblem{weightedcoin}{%
A coin is weighted so that heads is four times as likely
@@ -2311,16 +3093,18 @@ $S=\{a_1,a_2\}$ become a probability space?
%\fi
%\iffalse
% \begin{macrocode}
-%</probspaces.tex>
+%</prob-probspaces.tex>
% \end{macrocode}
%\fi
%\iffalse
% \begin{macrocode}
-%<*probspaces2.tex>
+%<*prob-probspaces2.tex>
% \end{macrocode}
%\fi
%\iffalse
% \begin{macrocode}
+ % This file is public domain
+ %
% Finite probability spaces
\begin{defproblem}{weightedcoin}
\begin{onlyproblem}%
@@ -2366,249 +3150,18 @@ $S=\{a_1,a_2\}$ become a probability space?
%\fi
%\iffalse
% \begin{macrocode}
-%</probspaces2.tex>
-% \end{macrocode}
-%\fi
-%\iffalse
-% \begin{macrocode}
-%<*sample.tex>
-% \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}
-%</sample.tex>
-% \end{macrocode}
-%\fi
-%\iffalse
-% \begin{macrocode}
-%<*sample2.tex>
-% \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}
-%</sample2.tex>
-% \end{macrocode}
-%\fi
-%\iffalse
-% \begin{macrocode}
-%<*sample3.tex>
-% \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 & \bfseries A & \bfseries B &
-\bfseries C & \ifshowanswers \bfseries Reason\fi\\
-\selectrandomly{tabmchoice}{2}
-\end{longtable}
-\end{document}
-% \end{macrocode}
-%\fi
-%\iffalse
-% \begin{macrocode}
-%</sample3.tex>
-% \end{macrocode}
-%\fi
-%\iffalse
-% \begin{macrocode}
-%<*sample4.tex>
-% \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}
-%</sample4.tex>
+%</prob-probspaces2.tex>
% \end{macrocode}
%\fi
%\iffalse
% \begin{macrocode}
-%<*sample5.tex>
-% \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}
-%</sample5.tex>
-% \end{macrocode}
-%\fi
-%\iffalse
-% \begin{macrocode}
-%<*tabmchoice.tex>
+%<*prob-tabmchoice.tex>
% \end{macrocode}
%\fi
%\iffalse
% \begin{macrocode}
+ % This file is public domain
+ %
% These problems are designed to be placed in a
% tabular environment
%
@@ -2629,7 +3182,7 @@ What is $-1+2\times3$? &
%\fi
%\iffalse
% \begin{macrocode}
-%</tabmchoice.tex>
+%</prob-tabmchoice.tex>
% \end{macrocode}
%\fi
%\Finale
diff --git a/Master/texmf-dist/source/latex/probsoln/probsoln.ins b/Master/texmf-dist/source/latex/probsoln/probsoln.ins
index f9233c99474..4b5315b74ca 100644
--- a/Master/texmf-dist/source/latex/probsoln/probsoln.ins
+++ b/Master/texmf-dist/source/latex/probsoln/probsoln.ins
@@ -1,10 +1,10 @@
-% probsoln.ins generated using makedtx version 0.94b 2008/8/27 14:19
+% probsoln.ins generated using makedtx version 0.94b 2011/8/22 22:10
\input docstrip
\preamble
probsoln.dtx
- Copyright 2008 Nicola Talbot
+ Copyright 2011 Nicola Talbot
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3
@@ -18,7 +18,7 @@
The Current Maintainer of this work is Nicola Talbot.
- This work consists of the files probsoln.dtx and probsoln.ins and the derived files probsoln.sty, 1stprncp.tex, args.tex, easy.tex, easy2.tex, implicit.tex, mchoice.tex, newdata.tex, nosoln.tex, probspaces.tex, probspaces2.tex, sample.tex, sample2.tex, sample3.tex, sample4.tex, sample5.tex, tabmchoice.tex.
+ This work consists of the files probsoln.dtx and probsoln.ins and the derived files probsoln.sty, sample.tex, sample2.tex, sample3.tex, sample4.tex, sample5.tex, sample6.tex, sample7.tex, prob-1stprncp.tex, prob-args.tex, prob-easy.tex, prob-easy2.tex, prob-implicit.tex, prob-mchoice.tex, prob-mixed.tex, prob-newdata.tex, prob-nosoln.tex, prob-probspaces.tex, prob-probspaces2.tex, prob-tabmchoice.tex.
\endpreamble
@@ -26,22 +26,44 @@
\generate{\file{probsoln.sty}{\usepreamble\defaultpreamble
\usepostamble\defaultpostamble\from{probsoln.dtx}{probsoln.sty,package}}
-\file{1stprncp.tex}{\nopreamble\nopostamble\from{probsoln.dtx}{1stprncp.tex}}
-\file{args.tex}{\nopreamble\nopostamble\from{probsoln.dtx}{args.tex}}
-\file{easy.tex}{\nopreamble\nopostamble\from{probsoln.dtx}{easy.tex}}
-\file{easy2.tex}{\nopreamble\nopostamble\from{probsoln.dtx}{easy2.tex}}
-\file{implicit.tex}{\nopreamble\nopostamble\from{probsoln.dtx}{implicit.tex}}
-\file{mchoice.tex}{\nopreamble\nopostamble\from{probsoln.dtx}{mchoice.tex}}
-\file{newdata.tex}{\nopreamble\nopostamble\from{probsoln.dtx}{newdata.tex}}
-\file{nosoln.tex}{\nopreamble\nopostamble\from{probsoln.dtx}{nosoln.tex}}
-\file{probspaces.tex}{\nopreamble\nopostamble\from{probsoln.dtx}{probspaces.tex}}
-\file{probspaces2.tex}{\nopreamble\nopostamble\from{probsoln.dtx}{probspaces2.tex}}
-\file{sample.tex}{\nopreamble\nopostamble\from{probsoln.dtx}{sample.tex}}
-\file{sample2.tex}{\nopreamble\nopostamble\from{probsoln.dtx}{sample2.tex}}
-\file{sample3.tex}{\nopreamble\nopostamble\from{probsoln.dtx}{sample3.tex}}
-\file{sample4.tex}{\nopreamble\nopostamble\from{probsoln.dtx}{sample4.tex}}
-\file{sample5.tex}{\nopreamble\nopostamble\from{probsoln.dtx}{sample5.tex}}
-\file{tabmchoice.tex}{\nopreamble\nopostamble\from{probsoln.dtx}{tabmchoice.tex}}
+\file{sample.tex}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{probsoln.dtx}{sample.tex,package}}
+\file{sample2.tex}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{probsoln.dtx}{sample2.tex,package}}
+\file{sample3.tex}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{probsoln.dtx}{sample3.tex,package}}
+\file{sample4.tex}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{probsoln.dtx}{sample4.tex,package}}
+\file{sample5.tex}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{probsoln.dtx}{sample5.tex,package}}
+\file{sample6.tex}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{probsoln.dtx}{sample6.tex,package}}
+\file{sample7.tex}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{probsoln.dtx}{sample7.tex,package}}
+\file{prob-1stprncp.tex}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{probsoln.dtx}{prob-1stprncp.tex,package}}
+\file{prob-args.tex}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{probsoln.dtx}{prob-args.tex,package}}
+\file{prob-easy.tex}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{probsoln.dtx}{prob-easy.tex,package}}
+\file{prob-easy2.tex}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{probsoln.dtx}{prob-easy2.tex,package}}
+\file{prob-implicit.tex}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{probsoln.dtx}{prob-implicit.tex,package}}
+\file{prob-mchoice.tex}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{probsoln.dtx}{prob-mchoice.tex,package}}
+\file{prob-mixed.tex}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{probsoln.dtx}{prob-mixed.tex,package}}
+\file{prob-newdata.tex}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{probsoln.dtx}{prob-newdata.tex,package}}
+\file{prob-nosoln.tex}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{probsoln.dtx}{prob-nosoln.tex,package}}
+\file{prob-probspaces.tex}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{probsoln.dtx}{prob-probspaces.tex,package}}
+\file{prob-probspaces2.tex}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{probsoln.dtx}{prob-probspaces2.tex,package}}
+\file{prob-tabmchoice.tex}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{probsoln.dtx}{prob-tabmchoice.tex,package}}
}
\endbatchfile