summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/probsoln/probsoln.sty
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-13 00:03:21 +0000
committerKarl Berry <karl@freefriends.org>2006-01-13 00:03:21 +0000
commitf4682599c070206bce19e8af5933e6de4006360a (patch)
tree38e2ce3d9a29d11cd5039e8b638024ad56b152cf /Master/texmf-dist/tex/latex/probsoln/probsoln.sty
parent4cb2eacefe14600f0e45a1bc5f4f6545346c50ec (diff)
probsoln
git-svn-id: svn://tug.org/texlive/trunk@1217 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/probsoln/probsoln.sty')
-rw-r--r--Master/texmf-dist/tex/latex/probsoln/probsoln.sty170
1 files changed, 170 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/probsoln/probsoln.sty b/Master/texmf-dist/tex/latex/probsoln/probsoln.sty
new file mode 100644
index 00000000000..5b5aa7d27a3
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/probsoln/probsoln.sty
@@ -0,0 +1,170 @@
+%%
+%% This is file `probsoln.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% probsoln.dtx
+%% Copyright (C) 2000 Nicola Talbot, all rights reserved.
+%% If you modify this file, you must change its name first.
+%% You are NOT ALLOWED to distribute this file alone. You are NOT
+%% ALLOWED to take money for the distribution or use of either this
+%% file or a changed version, except for a nominal charge for copying
+%% etc.
+%%This is the problem
+%%This is the solution
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{probsoln}[2004/03/21 Problems and their Solutions Package]
+\RequirePackage{ifthen}
+\provideboolean{showanswers}
+\newcommand{\showanswers}{\showanswerstrue}
+\newcommand{\hideanswers}{\showanswersfalse}
+\DeclareOption{answers}{\showanswerstrue}
+\DeclareOption{noanswers}{\showanswersfalse}
+\ExecuteOptions{noanswers}
+\ProcessOptions
+\newif\ifdefined
+\def\checkdefined#1{\ifx#1\relax \definedfalse \else \definedtrue \fi}
+\newif\ifselectrandom \selectrandomfalse
+\newif\iffirstpass
+\newif\ifselected
+\newcommand{\solutionname}{Solution:}
+\newcommand{\newproblem}[4][0]{%
+\ifselectrandom
+\iffirstpass
+\global\advance\@probN by 1
+\expandafter\gdef\csname @problabel\romannumeral\@probN\endcsname{#2}
+\else
+\checkselected{#2}
+\ifselected
+\expandafter\checkdefined\csname @prob@#2\endcsname
+\ifdefined
+\PackageError{probsoln}{Label #2 already used}%
+{Each problem must have a unique label identifier}
+\else
+\ifnum#1=0
+\expandafter\newcommand\csname @prob@#2\endcsname[#1]{%
+#3 \ifshowanswers\paragraph{\solutionname} #4\fi}
+\else
+\message{Problem #2 requires #1 argument(s), please specify (e.g. {5}{3}):}
+\read-1to\@tmp
+\expandafter\let\csname @prob@#2@arg\endcsname=\@tmp
+\expandafter\newcommand\csname @prob@#2\endcsname[#1]{%
+#3 \ifshowanswers\paragraph{\solutionname} #4\fi}
+\fi
+\fi
+\fi
+\fi
+\else
+\expandafter\checkdefined\csname @prob@#2\endcsname
+\ifdefined
+\PackageError{probsoln}{Label #2 already used}%
+{Each problem must have a unique label identifier}
+\else
+\expandafter\newcommand\csname @prob@#2\endcsname[#1]{%
+#3 \ifshowanswers\paragraph{\solutionname} #4\fi}
+\fi
+\fi
+}
+\newcommand{\useproblem}[1]{%
+\expandafter\checkdefined\csname @prob@#1\endcsname
+\ifdefined
+\def\doprob{\csname @prob@#1\endcsname}
+\else
+\PackageError{probsoln}{Label #1 undefined}%
+{Can't find problem defined with label identifier '#1'}
+\def\doprob{\relax}
+\fi
+\doprob
+}
+\newcount\@probN \newcount\@probselN \newcount\@rndselctr
+
+\newcount\r@ndcur
+\r@ndcur=1\relax
+\newcommand{\PSNrandseed}[1]{%
+\ifnum#1=0
+\typeout{Can't have 0 as random seed, changing to 1}
+\r@ndcur=1\relax
+\else
+\r@ndcur=#1\relax
+\fi
+\typeout{Random Seed = \the\r@ndcur}
+}
+
+\newcount\@ps@randtmp
+\newcommand{\PSNrand}{
+\@ps@randtmp=\r@ndcur
+\multiply\@ps@randtmp by 16807\relax
+\r@ndcur=\@ps@randtmp
+\divide\r@ndcur by 120001
+\multiply\r@ndcur by 120001
+\advance\@ps@randtmp by -\r@ndcur
+\r@ndcur = \@ps@randtmp
+\ifnum\r@ndcur=0\relax\r@ndcur=1\fi
+}
+
+\newcommand{\PSNrandom}[2]{%
+\PSNrand
+#1=\r@ndcur
+\@ps@randtmp=\r@ndcur
+\divide\@ps@randtmp by #2\relax
+\multiply\@ps@randtmp by #2\relax
+\advance#1 by -\@ps@randtmp
+\advance#1 by 1\relax
+}
+
+\newcommand{\selectrandomly}[2]{%
+\global\@probselN=#2
+\global\@probN=0
+\selectrandomtrue
+\firstpasstrue
+\input{#1}
+\ifnum\@probselN>\@probN
+\PackageError{probsoln}{Requested number too large}%
+{You have asked for \the\@probselN \space problems, but there are only
+\the\@probN \space problems defined in the file #1. I will only select \the\@probN \space
+problems.}
+\global\@probselN=\@probN
+\fi
+\shuffle{@problabel}{\@probN}
+\firstpassfalse
+\input{#1}
+\selectrandomfalse
+\@rndselctr=1\relax
+\whiledo{\@rndselctr < \@probselN \TE@or \@rndselctr = \@probselN}{%
+\edef\@tmp{\csname @problabel\romannumeral\@rndselctr\endcsname}
+\edef\@probargs{{\@tmp}\csname @prob@\@tmp @arg\endcsname}
+\item \expandafter\useproblem\@probargs
+\advance\@rndselctr by 1\relax
+}
+}
+\newcount\@ckselctr
+\newcommand{\checkselected}[1]{%
+\selectedfalse
+\@ckselctr=1\relax
+\whiledo{\@ckselctr < \@probselN \TE@or \@ckselctr = \@probselN}{%
+\ifthenelse{\equal{#1}{\csname @problabel\romannumeral\@ckselctr\endcsname}}%
+{\global\selectedtrue \global\@ckselctr=\@probselN}{}
+\advance\@ckselctr by 1\relax
+}
+}
+\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
+}
+}
+\endinput
+%%
+%% End of file `probsoln.sty'.