diff options
Diffstat (limited to 'Master/texmf-dist/doc/latex/probsoln/probsoln-manual.tex')
-rw-r--r-- | Master/texmf-dist/doc/latex/probsoln/probsoln-manual.tex | 781 |
1 files changed, 781 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/latex/probsoln/probsoln-manual.tex b/Master/texmf-dist/doc/latex/probsoln/probsoln-manual.tex new file mode 100644 index 00000000000..aae8befbed2 --- /dev/null +++ b/Master/texmf-dist/doc/latex/probsoln/probsoln-manual.tex @@ -0,0 +1,781 @@ +\documentclass[a4paper]{ltxdoc} +\usepackage[colorlinks, + bookmarks, + hyperindex=false, + pdfauthor={Nicola L.C. Talbot}, + pdftitle={probsoln: creating problem sheets optionally with solutions}]{hyperref} + +\usepackage{color} +\usepackage{creatdtx} +\ifmakedtx{ +\usepackage{probsoln} +\RecordChanges +\PageIndex +\CheckSum{886} + +\renewcommand{\usage}[1]{\textit{\hyperpage{#1}}} +\renewcommand{\main}[1]{\hyperpage{#1}} +\newcommand{\see}[2]{\emph{see} #1} +\makeatletter +\def\index@prologue{\section*{Index}} +\makeatother +\CodelineNumbered +\newcommand{\dq}[1]{``#1''} + +\definecolor{defbackground}{rgb}{0.8,1,1} + +\newsavebox\defsbox +\newlength\defwidth +\newenvironment{definition}{% +\setlength{\fboxsep}{4pt}\setlength{\fboxrule}{1.25pt}% +\begin{lrbox}{\defsbox}% +\setlength\defwidth\linewidth +\addtolength\defwidth{-2\fboxrule}% +\addtolength\defwidth{-2\fboxsep}% +\begin{minipage}{\defwidth}\flushleft +}{% +\end{minipage} +\end{lrbox}% +\vskip10pt +\noindent +\fcolorbox{black}{defbackground}{\usebox\defsbox}% +\vskip10pt +} + +\newlength\boxlength +\newsavebox\importantbox +\newenvironment{important}{% +\setlength{\fboxrule}{4pt}% +\setlength\boxlength{\linewidth}% +\addtolength\boxlength{-2\fboxsep}% +\addtolength\boxlength{-2\fboxrule}% +\begin{lrbox}{\importantbox}% +\begin{minipage}{\boxlength}% +}{\end{minipage}\end{lrbox}% +\par\vskip10pt\noindent +\fcolorbox{red}{white}{\usebox{\importantbox}}\par\vskip10pt} +} +{ +\usepackage{html} +\usepackage{makeidx} +\renewcommand{\LaTeX}{LaTeX} +\renewcommand{\LaTeXe}{LaTeX2e} +\newcommand{\dq}[1]{"#1"} +\newenvironment{important}{\textbf{NOTE:} }{} +\newenvironment{definition}{\htmlrule}{\htmlrule} +\html{\newcommand{\SpecialMainIndex}[1]{\index{#1@\cs{#1}}}} +} + +\newcommand*{\ics}[1]{\cs{#1}\SpecialMainIndex{#1}} + +\ifmakedtx{ +\newcommand{\pkgopt}[1]{\textsf{#1}\index{package options>#1=\textsf{#1}|hyperpage}} +\newcommand*{\sty}[1]{\textsf{#1}} +\newcommand*{\isty}[1]{\sty{#1}\index{#1 package=\sty{#1} package|hyperpage}} +\newcommand*{\env}[1]{\textsf{#1}} +\newcommand{\ienv}[1]{\env{#1}\index{#1 environment=\env{#1} environment|hyperpage}} +\newcommand*{\bool}[1]{\textsf{#1}\index{#1 boolean variable=\textsf{#1} boolean variable|hyperpage}} +\newcommand{\csdef}[1]{\cs{#1}} +} +{ +\newcommand{\pkgopt}[1]{\texttt{#1}\index{package options!#1@\texttt{#1}}} +\newcommand{\sty}[1]{\texttt{#1}} +\newcommand{\isty}[1]{\sty{#1}\index{#1@\sty{#1}}} +\newcommand{\env}[1]{\texttt{#1}} +\newcommand{\ienv}[1]{\env{#1}\index{#1 environment@\env{#1} environment}} +\newcommand*{\bool}[1]{\texttt{#1}\index{#1 boolean variable@\texttt{#1} boolean variable}} +\newcommand{\csdef}[1]{\ics{#1}} +\renewcommand{\DescribeEnv}[1]{\index{#1 environment@\env{#1} environment}} +\newcommand{\toTop}{\mbox{}\par\htmlref{Top}{top}} +} + +\begin{document}\ifmakedtx{}{\label{top}} +\MakeShortVerb{"} +\DeleteShortVerb{\|} + + \title{probsoln v3.0: creating problem sheets optionally with solutions} + \author{Nicola L.C. Talbot\\[10pt] +School of Computing Sciences\\ +University of East Anglia\\ +Norwich. Norfolk\\ +NR4 7TJ. United Kingdom.\\ +\url{http://theoval.cmp.uea.ac.uk/~nlct/}} + + \date{26th August 2008} + \maketitle +\tableofcontents + + \section{Introduction} +The \sty{probsoln} package is designed for teachers or +lecturers who want to create problem sheets for their +students. This package was designed with specifically +mathematics problems in mind, but can be used for other +subjects as well. The idea is to create a file containing a +large number of problems with their solutions which can be +read in by \LaTeX, and then select a number of problems to +typeset. This means that once the database has been set up, +each year you can easily create a new problem sheet that is +sufficiently different from the previous year, thus +preventing the temptation of current students seeking out +the previous year's students, and checking out their +answers. There is also an option that can be passed to the +package to determine whether or not the solutions should be +printed. In this way, one file can either produce the +student's version or the teacher's version. +\ifmakedtx{}{\toTop} + +\section{Package Options}\label{sec:pkgopt} +The following options may be passed to this package: +\begin{description} +\item[\pkgopt{answers}] Show the answers +\item[\pkgopt{noanswers}] Don't show the answers (default) +\item[\pkgopt{draft}] Display the label and dataset name when a problem is used +\item[\pkgopt{final}] Don't display label and dataset name when a problem is used +\end{description} +\ifmakedtx{}{\toTop} + +\section{Showing and Hiding Solutions}\label{sec:showanswers} + +In addition to the \pkgopt{answers} and \pkgopt{noanswers} package +options, it is also possible to show or suppress the solutions +using \DescribeMacro{\showanswers}\cs{showanswers} and +\DescribeMacro{\hideanswers}\cs{hideanswers}, respectively. +The boolean variable \bool{showanswers} determines whether the +answers should be displayed. You can use this value with the +\isty{ifthen} package to specify different text depending on +whether the solutions should be displayed. For example: +\begin{verbatim} +Assignment 1\ifthenelse{\boolean{showanswers}}{ (Solution Sheet)}{} +\end{verbatim} +Alternatively you can use \ics{ifshowanswers}\ldots\cs{else}\ldots +\cs{fi}: +\begin{verbatim} +Assignment 1\ifshowanswers\space (Solution Sheet)\fi +\end{verbatim} + +For longer passages, you can use the environments \DescribeEnv{onlyproblem}\env{onlyproblem} +and \DescribeEnv{onlysolution}\env{onlysolution}. For example: +\begin{verbatim} +\begin{onlyproblem}% +What is the derivative of $f(x) = x^2$? +\end{onlyproblem}% +\begin{onlysolution}% +$f'(x) = 2x$ +\end{onlysolution} +\end{verbatim} +The above will only display the question if \bool{showanswers} +is false and will only display the solution if \bool{showanswers} +is true. If you want the question to appear in the answer +sheet as well as the solution, then don't put the question in +the \env{onlyproblem} environment: +\begin{verbatim} +What is the derivative of $f(x) = x^2$? +\begin{onlysolution}% +Solution: $f'(x) = 2x$ +\end{onlysolution} +\end{verbatim} +\begin{important} +You can't use verbatim text in the body of the +\ienv{onlyproblem} or \ienv{onlysolution} environments. +If you need verbatim-like text, then try packages such as +\isty{alltt}. Remember that you also can't use verbatim +text in command arguments. +\end{important} +\ifmakedtx{}{\toTop} + +\section{General Formatting Commands}\label{sec:formatting} + +The commands and environments described in this section are +provided to assist formatting problems and their solutions. +\DescribeEnv{solution} +\begin{definition} +\verb|\begin{solution}|\meta{text}\verb|\end{solution}| +\end{definition} +This is equivalent to +\verb|\par\noindent\textbf{\solutionname}:|\meta{text} +where \DescribeMacro{\solutionname}\cs{solutionname} defaults +to \dq{Solution}. Note that you must place the \env{solution} +environment inside the \ienv{onlysolution} environment or +between \ics{ifshowanswers}\ldots\cs{fi} to ensure that it +is suppressed when the solutions are not wanted. (See +\ifmakedtx{\autoref{sec:showanswers}}{\htmlref{Showing and +Hiding Solutions}{sec:showanswers}}.) + + +Note that the \sty{probsoln} package will only define the +\env{solution} environment if it is not already defined. + +\DescribeEnv{textenum} +\begin{definition} +\verb|\begin{textenum}|\ldots\verb|\end{textenum}| +\end{definition} +The \env{textenum} environment is like the \ienv{enumerate} +environment but is in-line. It uses the same counter that the +\env{enumerate} environment would use at that level so the +question can be compact but the answer can use \env{enumerate} +instead. For example: +\begin{verbatim} +\begin{onlyproblem}% +Differentiate the following: +\begin{textenum} +\item $f(x)=2^x$; +\item $f(x)=\cot(x)$ +\end{textenum} +\end{onlyproblem} +\begin{onlysolution} +\begin{enumerate} +\item +\begin{align*} +f(x) &= 2^x = \exp(\ln(x^2)) =\exp(2\ln(x))\\ +f'(x) &= \exp(2\ln(x))\times \frac{2}{x}\\ + &= f(x)\frac{2}{x} +\end{align*} +\item +\begin{align*} +f(x) &= \cot(x) = (\tan(x))^{-2}\\ +f'(x) &= -(\tan(x))^{-2}\times\sec^2(x)\\ +&=-\csc^2x +\end{align*} +\end{enumerate} +\end{onlysolution} +\end{verbatim} +In this example, the items in the question are brief, so an +\ienv{enumerate} environment would result in a lot of +unnecessary white space, +but the answers require more space, so an \env{enumerate} +environment is more appropriate. Since the \ienv{textenum} +environment uses the same counters as the \env{enumerate} +environment, the question and answer sheets use consistent +labelling. Note that there are other packages available on +CTAN that you can use to create in-line lists. Check the +\ifmakedtx{\href{http://www.tex.ac.uk/tex-archive/help/Catalogue/bytopic.html\#enumeration}{TeX +Catalogue}}{\htmladdnormallink{TeX +Catalogue}{http://www.tex.ac.uk/tex-archive/help/Catalogue/bytopic.html\#enumeration}} for +further details. + +\DescribeMacro{\correctitem}\DescribeMacro{\incorrectitem} +\begin{definition} +\csdef{correctitem}\\ +\csdef{incorrectitem} +\end{definition} +You can use the commands \cs{correctitem} and \cs{incorrectitem} +in place of \ics{item}. If the solutions are suppressed, these +commands behave in the same way as \cs{item}, otherwise they +format the item label using one of the commands: +\DescribeMacro{\correctitemformat}\DescribeMacro{\incorrectitemformat} +\begin{definition} +\csdef{correctitemformat}\marg{label}\\ +\csdef{incorrectitemformat}\marg{label} +\end{definition} +For example: +\begin{verbatim} +Under which of the following functions does $S=\{a_1,a_2\}$ +become a probability space? +\begin{enumerate} +\incorrectitem $P(a_1)=\frac{1}{3}$, $P(a_2)=\frac{1}{2}$ +\correctitem $P(a_1)=\frac{3}{4}$, $P(a_2)=\frac{1}{4}$ +\correctitem $P(a_1)=1$, $P(a_2)=0$ +\incorrectitem $P(a_1)=\frac{5}{4}$, $P(a_2)=-\frac{1}{4}$ +\end{enumerate} +\end{verbatim} +\ifmakedtx{}{\toTop} + +\section{Defining a Problem}\label{sec:defproblem} + +It is possible to construct a problem sheet with solutions using +the commands described in the previous sections, however it is +also possible to define a set of problems for later use. In this +way you can create an external file containing many problems some +or all of which can be loaded and used in a document. The +\sty{probsoln} package has a default data set labelled +\dq{default} in which you can store problems or you can create +multiple data sets. You can then iterate through each problem +in a problem set. You can use a previously defined problem more +than once, which means that by judicious use of \ienv{onlyproblem}, +\ienv{onlysolution} or the \bool{showanswers} boolean variable +in conjunction with \ics{showanswers} and \ics{hideanswers}, +you can print the solutions in a different location to the +questions (for example in an appendix). + +\DescribeEnv{defproblem} +\begin{definition} +\verb|\begin{defproblem}|\oarg{n}\marg{label}\meta{definition}\verb|\end{defproblem}| +\end{definition} +This defines the problem whose label is given by \meta{label}. +The label must be unique for a given data set and should not +contain active characters. (Active characters include the special +characters such as \$ and \&, but some packages may make other +symbols active. For example, the \isty{ngerman} and \isty{babel} +packages make certain punctuation active. Check the relevant +package documentation for details.) + +If \env{defproblem} occurs in the document or is included via +\cs{input} or \cs{include}, then the problem will be added to +the default data set. If \env{defproblem} occurs in an external +file that is loaded using one of the commands defined in +\ifmakedtx{\autoref{sec:load}}{\htmlref{Loading Problems From +External Files}{sec:load}} then the problem will be added to +the specified data set. + +The contents of the \env{defproblem} environment should be the +text that defines the problem. This may include any of the +commands defined in +\ifmakedtx{\autoref{sec:showanswers} and +\autoref{sec:formatting}}{\htmlref{Showing and Hiding +Solutions}{sec:showanswers} and \htmlref{General Formatting +Commands}{sec:formatting}}. + +The problem may optionally take \meta{n} arguments (where +\meta{n} is from 0 to 9). The arguments can be referenced +in the definition via \texttt{\#1},\ldots,\texttt{\#9}. +If \meta{n} is omitted then the problem doesn't take any +arguments. +The following example defines a problem with one argument: +\begin{verbatim} +\begin{defproblem}[1]{diffsin} +Differentiate $f(x)=\sin(#1x)$. +\begin{onlysolution}% +\begin{solution} +$f'(x) = #1\cos(#1x)$ +\end{solution} +\end{onlysolution} +\end{defproblem} +\end{verbatim} + +\DescribeMacro{\newproblem} +\begin{definition} +\csdef{newproblem}\oarg{n}\marg{label}\marg{problem}\marg{solution} +\end{definition} +This is a shortcut command for: +\begin{ttfamily}\obeylines +\cs{begin}\{defproblem\}\oarg{n}\marg{label}\% +\meta{problem}\% +\cs{begin}\{onlysolution\}\% +\cs{begin}\{solution\}\% +\meta{solution}\% +\cs{end}\{solution\}\% +\cs{end}\{onlysolution\}\% +\cs{end}\{defproblem\} +\end{ttfamily} +For example: +\begin{verbatim} +\newproblem[1]{diffsin}{% +\(f(x) = \sin(#1x)\) +}{% +\(f'(x) = #1\cos(#1x)\) +} +\end{verbatim} +is equivalent to +\begin{verbatim} +\begin{defproblem}[1]{diffcos}% +\(f(x) = \cos(#1x)\) +\begin{onlysolution}% +\begin{solution}% +\(f'(x) = -#1\sin(#1x)\) +\end{solution}% +\end{onlysolution}% +\end{defproblem} +\end{verbatim} +(In this example, the argument will need to be a positive number +to avoid a double minus in the answer. If you want to perform +floating point arithmetic on the arguments, then try the +\isty{fp} package.) + +\DescribeMacro{\newproblem*} +\begin{definition} +\csdef{newproblem*}\oarg{n}\marg{label}\marg{definition} +\end{definition} +This is a shortcut for: +\begin{ttfamily}\obeylines +\cs{begin}\{defproblem\}\oarg{n}\marg{label}\% +\meta{definition}\% +\cs{end}\{defproblem\} +\end{ttfamily} + +\begin{important} +Verbatim text must not be used in the contents of \ienv{defproblem} +or in any of the arguments to \cs{newproblem} or +\cs{newproblem*}. If you need verbatim-like text consider using +\cs{texttt} or the \isty{alltt} package. +\end{important} +\ifmakedtx{}{\toTop} + +\section{Using a Problem}\label{sec:useproblem} + +Once you have defined a problem using \ienv{defproblem} or +\cs{newproblem} (see +\ifmakedtx{\autoref{sec:defproblem}}{\htmlref{Defining a +Problem}{sec:defproblem}}), you can later display the problem +using: +\DescribeMacro{\useproblem} +\begin{definition} +\csdef{useproblem}\oarg{data set}\marg{label}\marg{arg\ifmakedtx{$_1$}{\HTMLcode{SUB}{1}}}\ldots +\marg{arg\ifmakedtx{$_N$}{\HTMLcode{SUB}{N}}} +\end{definition} +where \meta{data set} is the name of the data set that contains +the problem (the default data set is used if omitted), +\meta{label} is the label identifying the required problem and +\meta{arg\ifmakedtx{$_1$}{\HTMLcode{SUB}{1}}}, \ldots, +\meta{arg\ifmakedtx{$N$}{\HTMLcode{SUB}{N}}} +are the arguments to pass to the problem, if the problem was +defined to have arguments (where \ifmakedtx{$N$}{N} is the number +of arguments specified when the problem was defined). + +For example, in the previous section the problem \texttt{diffcos} +was defined to have one argument, so it can be used as follows: +\begin{verbatim} +\useproblem{diffcos}{3} +\end{verbatim} +This will be equivalent to: +\begin{verbatim} +\(f(x) = \cos(3x)\) +\begin{onlysolution}% +\begin{solution}% +\(f'(x) = -3\sin(3x)\) +\end{solution}% +\end{onlysolution}% +\end{verbatim} +\ifmakedtx{}{\toTop} + +\section{Loading Problems From External Files}\label{sec:load} + +You can store all your problem definitions (see +\ifmakedtx{\autoref{sec:defproblem}}{\htmlref{Defining New +Problems}{sec:defproblem}}) in an external file. +These problems can all be appended to the default data set by +including the file via \ics{input} or they can be appended +to other data sets using one of the commands described below. +Once you have loaded all the required problems, you can +iterate through the data sets using the commands described +in \ifmakedtx{\autoref{sec:foreach}}{\htmlref{Iterating +Through Datasets}{sec:foreach}}. Note that the commands below +will create a new data set, if the named data set doesn't +exist. + +\DescribeMacro{\loadallproblems} +\begin{definition} +\csdef{loadallproblems}\oarg{data set}\marg{filename} +\end{definition} +This will load all problems defined in \meta{filename} and +append them to the specified data set, in the order in which +they are defined in the file. If \meta{data set} is +omitted, the default data set will be used. If \meta{data set} +doesn't exist, it will be created. + +\DescribeMacro{\loadselectedproblems} +\begin{definition} +\csdef{loadselectedproblems}\oarg{data set}\marg{labels}\marg{filename} +\end{definition} +This is like \cs{loadproblems}, but only those problems whose +label is listed in the comma-separated list \meta{labels} are +loaded. For example, if I have some problems defined in the +file \texttt{derivatives.tex}, then +\begin{verbatim} +\loadselectedproblems{diffsin,diffcos}{derivatives} +\end{verbatim} +will only load the problems whose labels are \texttt{diffsin} +and \texttt{diffcos}, respectively. All the other problems in +the file will remain undefined. + +\DescribeMacro{\loadrandomproblems} +\begin{definition} +\csdef{loadrandomproblems}\oarg{data set}\marg{n}\marg{filename} +\end{definition} +This randomly loads \meta{n} problems from \meta{filename} and +adds them to the given data set. If \meta{data set} is omitted, +the default data set is assumed. Note that the problems will be +added to the data set in a random order, not in the order in +which they were defined. There must be at least \meta{n} problems +defined in \meta{filename}. + +\begin{important} +It is generally not a good idea to place anything in +\meta{filename} that is not inside the body of \ienv{defproblem} +or in the arguments to \ics{newproblem} or \ics{newproblem*}. +All the commands in this section input the external file within +a local scope, so commands definitions would need to be made +global to have any effect. In addition, \cs{loadrandomproblems} +has to load each file twice, which means that anything outside +a problem definition will be parsed twice. +\end{important} + +\ifmakedtx{}{\toTop} + +\section{Iterating Through Datasets}\label{sec:foreach} + +Once you have defined all your problems for a given data set, +you can use an individual problem with \ics{useproblem} +(see \ifmakedtx{\autoref{sec:useproblem}}{\htmlref{Using a +Problem}{sec:useproblem}}) but it is more likely that you will +want to iterate through all the problems so that you don't need +to remember the labels of all the problems you have defined. + +\DescribeMacro{\foreachproblem} +\begin{definition} +\csdef{foreachproblem}\oarg{data set}\marg{body} +\end{definition} +This does \meta{body} for each problem in the given data set. +If \meta{data set} is omitted, the default data set is used. +Within \meta{body} you can use +\DescribeMacro{\thisproblem}\cs{thisproblem} to use the +current problem and \DescribeMacro{\thisproblemlabel}\cs{thisproblemlabel} +to access the current label. If the problem requires arguments, +you will be prompted for them, so if you want to use this +approach you will need to use \LaTeX\ in interactive mode. If +you do provide arguments, they will be stored in the event that +you need to iterate through the data set again. The +arguments will be included in \cs{thisproblem}, so you only +need to use \cs{thisproblem} without having to specify +\ics{useproblem}. For example, to iterate through all problems +in the default data set: +\begin{verbatim} +\begin{enumerate} +\foreachproblem{\item\thisproblem} +\end{enumerate} +\end{verbatim} + +\DescribeMacro{\foreachdataset} +\begin{definition} +\csdef{foreachdataset}\marg{cmd}\marg{body} +\end{definition} +This does \meta{body} for each of the defined data sets. Within +\meta{body}, \meta{cmd} will be set to the name of the current +data set. For example, to display all problems in all data sets: +\begin{verbatim} +\begin{enumerate} +\foreachdataset{\thisdataset}{% +\foreachproblem[\thisdataset]{\item\thisproblem}} +\end{enumerate} +\end{verbatim} + +Suppose I have two external files called +\texttt{derivatives.tex} and \texttt{probspaces.tex} which +define problems using both \ienv{onlyproblem} and +\ienv{onlysolution} for example: +\begin{verbatim} +\begin{defproblem}{cosxsqsinx}% +\begin{onlyproblem}% +$y = \cos(x^2)\sin x$.% +\end{onlyproblem}% +\begin{onlysolution}% +\[\frac{dy}{dx} = -\sin(x^2)2x\sin x + \cos(x^2)\cos x\] +\end{onlysolution}% +\end{defproblem} +\end{verbatim} +I can write a document that creates two data sets, one for +the derivative problems and one for the problems about +probability spaces. I can then use \ics{hideanswers} and +iterate through the require data set to produce the problems. +Later, I can use \ics{showanswers} and iterate over all problems defined in both data +sets to produce the chapter containing all the answers. When +displaying the questions, I have taken advantage of the fact that +I can cross-reference items within an \ienv{enumerate} environment, +and redefined \ics{theenumi} to label the questions according to +the chapter. The cross-reference label is constructed from +the problem label and is referenced in the answer section to +ensure that the answers have the same label as the questions. +\begin{verbatim} +\documentclass{report} +\usepackage{probsoln} +\begin{document} +\hideanswers +\chapter{Differentiation} +% randomly select 25 problems from derivatives.tex and add to +% the data set called 'deriv' +\loadrandomproblems[deriv]{25}{derivatives} + +% Display the problems +\renewcommand{\theenumi}{\thechapter.\arabic{enumi}} +\begin{enumerate} +\foreachproblem[deriv]{\item\label{prob:\thisproblemlabel}\thisproblem} +\end{enumerate} +% You may need to change \theenumi back here + +\chapter{Probability Spaces} +% randomly select 25 problems from probspaces.tex and add to +% the data set called 'spaces' +\loadrandomproblems[spaces]{25}{probspaces} + +% Display the problems +\renewcommand{\theenumi}{\thechapter.\arabic{enumi}} +\begin{enumerate} +\foreachproblem[spaces]{\item\label{prob:\thisproblemlabel}\thisproblem} +\end{enumerate} +% You may need to change \theenumi back here + +\appendix + +\chapter{Solutions} +\showanswers +\begin{itemize} +\foreachdataset{\thisdataset}{% +\foreachproblem[\thisdataset]{\item[\ref{prob:\thisproblemlabel}]\thisproblem} +} +\end{itemize} + +\end{document} +\end{verbatim} + +\ifmakedtx{}{\toTop} + +\section{Random Number Generator}\label{sec:random} + +This package provides a pseudo-random number generator that is used +by \ics{loadrandomproblems}. + +\DescribeMacro{\PSNrandseed} +\begin{definition} +\csdef{PSNrandseed}\marg{n} +\end{definition} +This sets the seed to \meta{n} which must be a non-zero integer. +For example, to generate a different set of random numbers +every time you \LaTeX\ your document,\footnote{assuming you +leave at least a minute between runs.} put the following in your +preamble: +\begin{verbatim} +\PSNrandseed{\time} +\end{verbatim} +or to generate a different set of random numbers every year you +\LaTeX\ your document: +\begin{verbatim} +\PSNrandseed{\year} +\end{verbatim} + +\DescribeMacro{\PSNgetrandseed} +\begin{definition} +\csdef{PSNgetrandseed}\marg{register} +\end{definition} +This stores the current seed in the count register specified by +\meta{register}. +For example: +\begin{verbatim} +\newcount\myseed +\PSNgetrandseed{\myseed} +\end{verbatim} + +\DescribeMacro{\PSNrandom} +\begin{definition} +\csdef{PSNrandom}\marg{register}\marg{n} +\end{definition} +Generates a random integer from 1 to \meta{n} and stores in +the count register specified by \meta{register}. For example, +the following generates an integer from 1 to 10 and stores it +in the register \cs{myreg}: +\begin{verbatim} +\newcount\myreg +\PSNrandom{\myreg}{10} +\end{verbatim} + +\DescribeMacro{\random} +\begin{definition} +\csdef{random}\marg{counter}\marg{min}\marg{max} +\end{definition} +Generates a random integer from \meta{min} to \meta{max} and +stores in the given counter. For example, the following generates +a random number between 3 and 8 (inclusive) and stores it in +the counter \texttt{myrand}. +\begin{verbatim} +\newcounter{myrand} +\random{myrand}{3}{8} +\end{verbatim} + +\DescribeMacro{\doforrandN} +\begin{definition} +\csdef{doforrandN}\marg{n}\marg{cmd}\marg{list}\marg{text} +\end{definition} +Randomly selects \meta{n} values from the comma-separated list +given by \meta{list} and iterates through this subset. On +each iteration it sets \meta{cmd} to the current value and +does \meta{text}. For example, the following will load a +randomly selected problem from two of the listed files (where +\texttt{file1.tex}, \texttt{file2.tex} and \texttt{file3.tex} +are files containing at least one problem): +\begin{verbatim} +\doforrandN{2}{\thisfile}{file1,file2,file3}{% +\loadrandomproblems{1}{\thisfile}} +\end{verbatim} + +\ifmakedtx{}{\toTop} + +\section{Compatibility With Versions Prior to 3.0} + +Version 3.0 of the \sty{probsoln} package completely changed the +structure of the package, but the commands described in this +section have been provided to maintain compatibility with +earlier versions. The only problems that are likely to occur are +those where commands are contained within groups. This will +effect any commands that are contained in external files that are +outside of the arguments to \ics{newproblem} and \ics{newproblem*}. +However, since the external files had to be parsed twice in +order to load the problems, this shouldn't be an issue as adding +anything other than problem definitions in those files would +be problematic anyway. + +The other likely difference is where the random generator is +used in a group. This includes commands such as +\ics{selectrandomly}. For example, if your document contained +something like: +\begin{verbatim} +\begin{enumerate} +\selectrandomly{file1}{8} + +\item Solve the following: +\begin{enumerate} +\selectrandomly{file2}{4} +\end{enumerate} + +\selectrandomly{file3}{2} +\end{enumerate} +\end{verbatim} +Then using versions prior to v3.0 will produce a different +set of random numbers since the second \cs{selectrandomly} +is in a different level of grouping. If you want to ensure +that the document produces exactly the same random set with +the new version as with the old version, you will need to +get and set the random number seed. For example, the above +would need to be modified so that it becomes: +\begin{verbatim} +\begin{enumerate} +\selectrandomly{file1}{8} + +\item Solve the following: +\newcount\oldseed +\PSNgetrandseed{\oldseed} +\begin{enumerate} +\selectrandomly{file2}{4} +\end{enumerate} +\PSNrandseed{\oldseed} + +\selectrandomly{file3}{2} +\end{enumerate} +\end{verbatim} + +\DescribeMacro{\selectrandomly} +\begin{definition} +\csdef{selectrandomly}\marg{filename}\marg{n} +\end{definition} +This is now equivalent to: +\begin{ttfamily}\obeylines +\{\cs{loadrandomproblems}\oarg{filename}\marg{n}\marg{filename}\}\% +\cs{foreachproblem}\oarg{filename}\marg{\cs{PSNitem}\cs{thisproblem}\cs{endPSNitem}} +\end{ttfamily} + +\DescribeMacro{\selectallproblems} +\begin{definition} +\csdef{selectallproblems}\marg{filename} +\end{definition} +This is now equivalent to: +\begin{ttfamily}\obeylines +\{\cs{loadallproblems}\oarg{filename}\marg{filename}\}\% +\cs{foreachproblem}\oarg{filename}\marg{\cs{PSNitem}\cs{thisproblem}\cs{endPSNitem}} +\end{ttfamily} + +Note that in both the above cases, a new data set is created +with the same name as the file name. + +\ifmakedtx{}{\toTop} + + \StopEventually{\clearpage\phantomsection\addcontentsline{toc}{section}{Index}\PrintIndex} + +\ifmakedtx{}{\printindex\toTop} +\end{document} |