diff options
author | Karl Berry <karl@freefriends.org> | 2011-08-24 00:09:20 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2011-08-24 00:09:20 +0000 |
commit | 00e6529c140ad1858c21526e6f8044aabb399270 (patch) | |
tree | 39e376e2630a9135fa211e3945879224c4c8e83b /Master/texmf-dist/source | |
parent | 9acea66f478ccf41a96c04350796f74e5e74757e (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')
-rw-r--r-- | Master/texmf-dist/source/latex/probsoln/probsoln.dtx | 1881 | ||||
-rw-r--r-- | Master/texmf-dist/source/latex/probsoln/probsoln.ins | 60 |
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 |