From 95080bc66f5d1022cbcfbe7535a87055d02aa568 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Wed, 13 Mar 2013 22:35:46 +0000 Subject: probsoln (13mar13) git-svn-id: svn://tug.org/texlive/trunk@29371 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/tex/latex/probsoln/probsoln.sty | 264 +++++++++++++++++++--- 1 file changed, 235 insertions(+), 29 deletions(-) (limited to 'Master/texmf-dist/tex/latex/probsoln/probsoln.sty') diff --git a/Master/texmf-dist/tex/latex/probsoln/probsoln.sty b/Master/texmf-dist/tex/latex/probsoln/probsoln.sty index 8144c5e1c22..86e685a1327 100644 --- a/Master/texmf-dist/tex/latex/probsoln/probsoln.sty +++ b/Master/texmf-dist/tex/latex/probsoln/probsoln.sty @@ -7,7 +7,7 @@ %% probsoln.dtx (with options: `probsoln.sty,package') %% %% probsoln.dtx -%% Copyright 2011 Nicola Talbot +%% Copyright 2013 Nicola Talbot %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3 @@ -21,7 +21,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, sample.tex, sample2.tex, sample3.tex, sample4.tex, sample5.tex, sample6.tex, sample7.tex, sample8.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, prob-verb.tex. +%% This work consists of the files probsoln.dtx and probsoln.ins and the derived files probsoln.sty, sample-exclude.tex, sample.tex, sample2.tex, sample3.tex, sample4.tex, sample5.tex, sample6.tex, sample7.tex, sample8.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, prob-verb.tex. %% %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z @@ -47,9 +47,10 @@ %% Display the problems %% You may need to change \theenumi back here \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{probsoln}[2011/12/10 v3.02 (NLCT)] +\ProvidesPackage{probsoln}[2012/08/23 v3.04 (NLCT)] \RequirePackage{ifthen} \RequirePackage{amsmath} +\RequirePackage{etoolbox} \newif\ifshowanswers \showanswersfalse \let\showanswers\showanswerstrue @@ -72,16 +73,195 @@ \newcommand*{\ProbSolnFragileExt}{vrb} \newcommand*{\ProbSolnFragileFile}{\jobname} \newwrite\probsoln@write +\newcount\probsoln@startyear +\newcommand*{\SetStartYear}[1]{% + \probsoln@startyear=#1\relax + \renewcommand\SetStartMonth[1]{% + \PackageError{probsoln}{\string\SetStartMonth\space + can't be used after \string\SetStartYear}{}}% +} +\newcommand*{\GetStartYear}{\probsoln@startyear} +\newcount\probsoln@startmonth +\newcommand*{\SetStartMonth}[1]{% + \probsoln@startmonth=#1\relax + \probsoln@startyear=\year\relax + \ifnum\month<\probsoln@startmonth + \advance\probsoln@startyear by -1\relax + \fi +} +\SetStartMonth{9} +\newwrite\probsoln@prev +\newwrite\probsoln@used +\newcount\probsoln@prev@cutoff +\newcommand*{\@probsoln@usedfilename}{\jobname.prb} +\newcommand*{\SetUsedFileName}[1]{% + \renewcommand*{\@probsoln@usedfilename}{#1}% +} +\newcommand*{\ClearUsedFile}[1]{% + \probsoln@prev@cutoff=0\relax + \@probsoln@readprev{#1}% + \@for\@this@db:=\prob@databases\do{% + {% + \edef\@prev@list{\csname probsoln@prev@list@\@this@db\endcsname}% + \ifdefempty{\@prev@list}% + {}% + {% + \@for\@this@label:=\@prev@list\do{% + \ifcsundef{@used@problem@\@this@db @\@this@label}% + {% + \immediate\write\probsoln@prev{% + \string\previousproblem{\@this@label}{\@this@db}% + {\csname @prev@problem@\@this@db @\@this@label\endcsname}}% + }% + {}% + }% + }% + }% + }% + \immediate\closeout\probsoln@prev + \immediate\closeout\probsoln@used + \@disable@exclude@prev +} +\newcommand*{\ExcludePreviousFile}[2][3]{% + \probsoln@prev@cutoff=\probsoln@startyear\relax + \advance\probsoln@prev@cutoff by -#1\relax + \@probsoln@readprev{#2}% + \@write@prev + \def\ExcludePreviousFile[2][3]{\PackageError{probsoln}{Only one + instance of \string\ExcludePreviousFile\space allowed}{You've + already used this command. You are only allowed to use it once}}% + \def\ClearUsedFile[1]{% + \PackageError{probsoln}% + {\string\ClearUsedFile\space may not be used after + \string\ExcludePreviousFile}{}}% +} +\newcommand*{\@probsoln@readprev}[1]{% + \@enable@exclude@prev + \InputIfFileExists{#1}% + {\PackageInfo{probsoln}% + {Excluded problem file `#1' found}}% + {\PackageInfo{probsoln}% + {Excluded problem file `#1' not found. A new one will be + created}}% + \InputIfFileExists{\@probsoln@usedfilename}% + {\PackageInfo{probsoln}% + {Current problems file `\@probsoln@usedfilename' found}}% + {\PackageInfo{probsoln}% + {No current problem file `\@probsoln@usedfilename' found. A new one will be created}}% + \immediate\openout\probsoln@prev=#1 + \immediate\openout\probsoln@used=\@probsoln@usedfilename +} +\newcommand*{\probsoln@prev@list@default}{} +\newcommand*{\@write@prev}{% + \@for\@this@db:=\prob@databases\do{% + {% + \edef\@prev@list{\csname probsoln@prev@list@\@this@db\endcsname}% + \ifdefempty{\@prev@list}% + {}% + {% + \@for\@this@label:=\@prev@list\do{% + \immediate\write\probsoln@prev{% + \string\previousproblem{\@this@label}{\@this@db}% + {\csname @prev@problem@\@this@db @\@this@label\endcsname}}% + }% + }% + }% + }% +} +\newcommand*{\@enable@exclude@prev}{% + \renewcommand*{\@add@used@problem}[2]{% + \immediate\write\probsoln@used{\string\usedproblem{##1}{##2}{\number\probsoln@startyear}}% + \ifcsundef{@prev@problem@##2@##1}% + {% + \immediate\write\probsoln@prev{% + \string\previousproblem{##1}{##2}{\number\probsoln@startyear}}% + \expandafter\xdef\csname @prev@problem@##2@##1\endcsname{% + \number\probsoln@startyear}% + }% + {% + \expandafter\ifnum\csname @prev@problem@##2@##1\endcsname + <\probsoln@startyear + \immediate\write\probsoln@prev{% + \string\previousproblem{##1}{##2}{\number\probsoln@startyear}}% + \expandafter\xdef\csname @prev@problem@##2@##1\endcsname{% + \number\probsoln@startyear}% + \fi + }% + }% + \renewcommand*{\@fetch@excluded@list}[2]{% + \def##1{}% + \ifcsdef{probsoln@prev@list@##2}% + {% + \edef\@prev@list{\csname probsoln@prev@list@##2\endcsname}% + \@for\@this@label:=\@prev@list\do{% + \ifcsundef{@used@problem@##2@\@this@label}% + {% + \ifcsempty{##1}% + {\edef##1{\@this@label}}% + {\edef##1{##1,\@this@label}}% + }% + {}% + }% + }% + {}% + }% + \renewcommand*{\@add@newprevlist}[1]{% + \expandafter\gdef\csname probsoln@prev@list@##1\endcsname{}% + }% + \renewcommand*{\close@probsoln@prev}{% + \closeout\probsoln@prev + \closeout\probsoln@used + }% +} +\newcommand*{\@disable@exclude@prev}{% + \renewcommand*{\@add@used@problem}[2]{}% + \renewcommand*{\@fetch@excluded@list}[2]{\def##1{}}% + \renewcommand*{\@add@newprevlist}[1]{}% + \renewcommand*{\close@probsoln@prev}{}% +} +\newcommand*{\@add@used@problem}[2]{} +\newcommand*{\@fetch@excluded@list}[2]{% + \def#1{}% +} +\newcommand*{\@add@newprevlist}[1]{} +\newcommand*{\close@probsoln@prev}{} +\AtEndDocument{\close@probsoln@prev} +\newcommand*{\previousproblem}[3]{% + \ifnum#3>\probsoln@prev@cutoff + \ifcsundef{prob@db@#2}{\prob@newdb{#2}}{}% + \expandafter\gdef\csname @prev@problem@#2@#1\endcsname{#3}% + \edef\@prev@list{\csname probsoln@prev@list@#2\endcsname}% + \ifdefempty{\@prev@list}% + {% + \expandafter\xdef\csname probsoln@prev@list@#2\endcsname{#1}% + }% + {% + \expandafter\xdef\csname probsoln@prev@list@#2\endcsname{% + \@prev@list,#1}% + }% + \fi +} +\newcommand*{\usedproblem}[3]{% + \ifnum#3=\probsoln@startyear + \expandafter\def\csname @used@problem@#2@#1\endcsname{#3}% + \fi +} \newcommand*{\prob@db@default}{} \newcommand*{\prob@databases}{default} \newcommand*{\prob@db@default@solutions}{} \newcommand*{\prob@newdb}[1]{% -\@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}{}}} + \ifcsundef{prob@db@#1}% + {% + \expandafter\gdef\csname prob@db@#1\endcsname{}% + \xdef\prob@databases{\prob@databases,#1}% + \expandafter\gdef\csname prob@db@#1@solutions\endcsname{}% + \@add@newprevlist{#1}% + }% + {% + \PackageError{probsoln}{Data set `#1' is already defined}% + {Data set names must be unique}% + }% +} \newcommand*{\prob@currentdb}{default} \newcommand{\moveproblem}[3]{% \@moveproblem{#1}{#2}{#3}% @@ -101,12 +281,14 @@ }% } \newcommand*{\@moveproblem}[3]{% - \expandafter\ifx\csname prob@db@#3\endcsname\@empty + \ifcsempty{prob@db@#3}% + {% \expandafter\xdef\csname prob@db@#3\endcsname{#1}% - \else + }% + {% \expandafter\xdef\csname prob@db@#3\endcsname{% \csname prob@db@#3\endcsname,#1}% - \fi + }% \edef\do@movedata{% \noexpand\global\noexpand\let\expandafter\noexpand \csname prob@data@#3@#1\endcsname=% @@ -402,6 +584,7 @@ Please specify (e.g. \csname @prob@getargs@eg@\romannumeral#1\endcsname):}% \def\@prob@currentlabel{#2}% \def\prob@currentdb{#1}% \prob@showdraftlabel{#1}{#2}% + \@add@used@problem{#2}{#1}% \let\@useprob@next=\relax \@ifundefined{prob@data@#1@#2}% {% @@ -462,7 +645,8 @@ Please specify (e.g. \csname @prob@getargs@eg@\romannumeral#1\endcsname):}% \newif\iffirstpass \firstpasstrue \newcommand{\loadrandomproblems}[3][default]{% - \@loadrandomproblems{#1}{#2}{#3}{}% + \@fetch@excluded@list{\@excl@list}{#1}% + \@loadrandomproblems{#1}{#2}{#3}{\@excl@list}% } \newcommand{\loadrandomexcept}[4][default]{% \@loadrandomproblems{#1}{#2}{#3}{#4}% @@ -478,8 +662,9 @@ Please specify (e.g. \csname @prob@getargs@eg@\romannumeral#1\endcsname):}% \input{#3}% \@probselN=0\relax \@for\@thislabel:=\prob@selectedlabels\do{% - \expandafter\DTLifinlist\expandafter - {\@thislabel}{#4}{}% + \edef\@if@in@list{\noexpand\DTLifinlist{\@thislabel}{#4}}% + \@if@in@list + {}% {% \advance\@probselN by 1\relax \expandafter @@ -487,13 +672,32 @@ Please specify (e.g. \csname @prob@getargs@eg@\romannumeral#1\endcsname):}% \@thislabel}% }% }% - \shuffle{@prob@tmp@}{\@probselN}% - \ifnum\@probselN<#2\relax - \PackageWarning{probsoln}{You have requested - \number#2\space\space problem(s) but `#3' only contains - \number\@probselN\space problems. All problems will be selected}% + \edef\@do@excludedlist{#4}% + \ifdefempty{\@do@excludedlist}% + {}% + {\def\@do@excludedlist{(Excluded list: #4.) }}% + \ifnum\@probselN=0\relax + \PackageWarning{probsoln}{You have requested + \number#2\space\space problem(s) but there are no available + problems in `#3'. \@do@excludedlist No problems will be selected}% \else - \@probselN=#2\relax + \shuffle{@prob@tmp@}{\@probselN}% + \ifnum\@probselN<#2\relax + \ifnum\@probselN=1\relax + \PackageWarning{probsoln}{You have requested + \number#2\space\space problem(s) but there is only + 1 problem available in `#3'. \@do@excludedlist + Only 1 problem will be selected}% + \else + \PackageWarning{probsoln}{You have requested + \number#2\space\space problem(s) but there are only + \number\@probselN\space problems available in `#3'. + \@do@excludedlist + Only \number\@probselN\space problems will be selected}% + \fi + \else + \@probselN=#2\relax + \fi \fi \@probN=0\relax \def\prob@selectedlabels{}% @@ -652,31 +856,34 @@ Please specify (e.g. \csname @prob@getargs@eg@\romannumeral#1\endcsname):}% }% } \newcount\@ps@forrand +\newcount\@ps@forrand@level \newcommand{\doforrandN}[4]{% + \global\advance\@ps@forrand@level by 1\relax {% \@ps@forrand=0\relax \@for#2:=#3\do{% \advance\@ps@forrand by 1\relax \expandafter - \edef\csname @doforrandN@\romannumeral\@ps@forrand\endcsname{#2}% + \edef\csname @doforrandN@\number\@ps@forrand@level @\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}% + \PackageError{probsoln}{Can't randomly select \number#1\space item(s)}{You + have requested \number#1\space item(s), but there + are only \number\@ps@forrand\space item(s) in the list: #3}% \else - \shuffle{@doforrandN@}{\@ps@forrand}% + \shuffle{@doforrandN@\number\@ps@forrand@level @}{\@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}% + \edef#2{\csname @doforrandN@\number\@ps@forrand@level @\romannumeral\@ps@forrand\endcsname}% #4% \ifnum\@ps@forrand<#1\relax \repeat \fi \fi }% + \global\advance\@ps@forrand@level by -1\relax } \newcommand*{\newproblem}{\@ifstar\@snewproblem\@newproblem} \newcommand{\@snewproblem}[1][0]{% @@ -718,7 +925,7 @@ Please specify (e.g. \csname @prob@getargs@eg@\romannumeral#1\endcsname):}% \ifnum\@enumdepth>\thr@@ \@toodeep \else - \advance\@enumdepth\@ne\relax + \advance\@enumdepth by 1\relax \edef\@enumctr{enum\romannumeral\the\@enumdepth}% \let\@item\@textitem \def\@itemlabel{% @@ -730,7 +937,6 @@ Please specify (e.g. \csname @prob@getargs@eg@\romannumeral#1\endcsname):}% \ignorespaces }% {% - \global\advance\@enumdepth\m@ne\relax } \def\@textitem[#1]{#1\space\ignorespaces} \newcommand*{\correctitemformat}[1]{\fbox{#1}} -- cgit v1.2.3