summaryrefslogtreecommitdiff
path: root/texmf-dist/doc/latex/rangen/rangen_man.tex
diff options
context:
space:
mode:
Diffstat (limited to 'texmf-dist/doc/latex/rangen/rangen_man.tex')
-rw-r--r--texmf-dist/doc/latex/rangen/rangen_man.tex1563
1 files changed, 1563 insertions, 0 deletions
diff --git a/texmf-dist/doc/latex/rangen/rangen_man.tex b/texmf-dist/doc/latex/rangen/rangen_man.tex
new file mode 100644
index 00000000..cfecd31e
--- /dev/null
+++ b/texmf-dist/doc/latex/rangen/rangen_man.tex
@@ -0,0 +1,1563 @@
+% makeindex < aebpro_man.idx > aebpro_man.ind
+\documentclass[12pt]{article}
+\usepackage[fleqn]{amsmath}
+\usepackage[
+ web={centertitlepage,designv,tight*,forcolorpaper,
+% usesf,
+ latextoc,pro},
+ aebxmp,exerquiz,
+ dljslib={equations,ImplMulti,indefIntegral,limitArith,nodec}
+]{aeb_pro}
+\usepackage{multicol}
+\usepackage{array}
+%\usepackage{myriadpro} %[usecmtt]
+\usepackage[altbullet]{lucidbry}
+\usepackage[quiet,testmode]{rangen} % testmode
+%\usepackage[quiet,seed=98]{rangen} % 128
+%\usepackage[quiet,seed=135]{rangen} %
+
+\DeclareInitView
+{%
+ layoutmag={mag=100},
+% windowoptions={fit}
+}
+
+
+%\usepackage{makeidx}\makeindex
+
+\usepackage{acroman}
+
+\usepackage[active]{srcltx}
+
+\def\expath{../examples}
+
+\urlstyle{tt}
+
+%\def\tutpath{doc/tutorial}
+%\def\tutpathi{tutorial}
+
+\DeclareDocInfo
+{
+ university={\AcroTeX.Net},
+ title={The \texorpdfstring{\pkg{rangen} Package\\[1em]}{: }
+ Random Generation of Integer, Rational, and Real Numbers with
+ Applications to the \texttt{exercise}, \texttt{quiz}, and \texttt{shortquiz} Environments of \textsf{Exerquiz}},
+ author={D. P. Story},
+ email={dpstory@acrotex.net},
+ subject={Documentation for annot\textunderscore pro from AcroTeX},
+ talksite={\url{www.acrotex.net}},
+ version={1.4},
+ copyrightStatus=True,
+ copyrightNotice={Copyright (C) \the\year, D. P. Story},
+ copyrightInfoURL={http://www.acrotex.net}
+}
+
+\def\anglemeta#1{\ensuremath{\langle\textit{\texttt{#1}}\rangle}}
+\def\meta#1{\textit{\texttt{#1}}}
+\let\meta\anglemeta
+\def\darg#1{\texttt{\{#1\}}}
+\def\takeMeasure{\bgroup\obeyspaces\takeMeasurei}
+\def\takeMeasurei#1{\global\setbox\webtempboxi\hbox{\ttfamily#1}\egroup}
+\def\bxSize{\wd\webtempboxi+2\fboxsep+2\fboxrule}
+\let\pkg\textsf
+\let\env\texttt
+\let\opt\texttt
+\let\app\textsf
+
+\let\amtIndent\leftmargini
+\def\SUB#1{${}_{\text{#1}}$}
+
+\newdimen\aebdimen \aebdimen 0pt %\advance\aebdimen\partopsep
+\newcommand\bVerb[1][]{\begingroup#1\vskip\aebdimen\parindent0pt}%
+\def\eVerb{\vskip\aebdimen\endgroup\noindent}
+
+\makeatletter
+\renewcommand{\paragraph}
+ {\@startsection{paragraph}{4}{0pt}{6pt}{-3pt}{\bfseries}}
+\renewcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.5em}}
+\renewcommand*\descriptionlabel[1]{\hspace\labelsep
+ \normalfont #1}
+\newcommand{\aebDescriptionlabel}[1]{%
+ \setlength\dimen@{\amtIndent+\labelsep}%
+ {\hspace*{\dimen@}#1}}
+\makeatother
+\newenvironment{aebDescript}
+ {\begin{list}{}{\setlength{\labelwidth}{0pt}%
+ \setlength{\leftmargin}{\leftmargin}%
+ \setlength{\leftmargin}{\leftmargin+\amtIndent}%
+ \setlength\itemindent{-\leftmargin}%
+ \let\makelabel\aebDescriptionlabel
+ }}{\end{list}}
+
+
+\def\dps{$\hbox{$\mathfrak D$\kern-.3em\hbox{$\mathfrak P$}%
+ \kern-.6em \hbox{$\mathcal S$}}$}
+
+\universityLayout{fontsize=Large}
+\titleLayout{fontsize=LARGE}
+\authorLayout{fontsize=Large}
+\tocLayout{fontsize=Large,color=aeb}
+\sectionLayout{indent=-62.5pt,fontsize=large,color=aeb}
+\subsectionLayout{indent=-31.25pt,color=aeb}
+\subsubsectionLayout{indent=0pt,color=aeb}
+\subsubDefaultDing{\texorpdfstring{$\bullet$}{\textrm\textbullet}}
+
+\newenvironment{eqComments}[1][\strut]{\smallskip\leftskip-\labelwidth
+\item[]\textbf{\textcolor{blue}{#1}}}{\par\smallskip}
+
+\renewcommand\nodecAlertMsg{%
+ "A decimal answer is not acceptable here.
+ Please express your answer using a fraction."}
+
+%\previewtrue
+
+%\pagestyle{empty}
+%\parindent0pt\parskip\medskipamount
+
+\definePath\bgPath{"C:/Users/Public/Documents/%
+ ManualBGs/Manual_BG_Print_AeB.pdf"}
+\begin{docassembly}
+\addWatermarkFromFile({%
+ bOnTop: false,
+ cDIPath: \bgPath
+})
+\executeSave()
+\end{docassembly}
+
+\begin{document}
+
+\maketitle
+
+\selectColors{linkColor=black}
+\tableofcontents
+\selectColors{linkColor=webgreen}
+
+\section{Introduction}\label{s:intro}
+
+This is a package that I began back in the year 2000 AD; at that
+time, I managed to obtain a working version up and running with many
+bugs, then forgot about it. Now, in my retirement, I stumbled across
+the work and decided to give it another go.
+
+The \pkg{rangen} package, as the title implies, can (pseudo-)randomly generate
+integers, rationals, and real numbers. Generate said numbers using the
+\cs{RandomZ}, \cs{RandomQ}, and \cs{RandomR} commands, respectively; in addition
+to these, there is \cs{RandomL} for creating a list of numbers, from which one number
+is selected at random, and \cs{RandomI} for generating a random index value that can
+be used in conjunction with \cs{RandomL}.
+
+The \AcroTeX{} eDucation Bundle (AeB) contains a package called \textsf{exerquiz}
+that is used to create exercises and quizzes. My goal in writing the
+\pkg{rangen} package was to integrate it with the quiz system of \textsf{exerquiz}
+so that quiz questions could be composed using the ``natural'' syntax of \pkg{rangen},
+each time the source file is {\LaTeX}ed, new random numbers populate the question. To get your
+interest, here is an example,
+
+
+
+\begingroup\parskip0pt %\previewtrue
+
+\def\aftershortquizskip{}
+\setlength{\multicolsep}{0pt}
+
+\begin{shortquiz}*[answer] \textbf{\textcolor{blue}{Arithmetic.}}
+A simple arithmetic problem, I've created one problem, then copied it to make
+two problems.
+
+\vskip6pt
+
+\begin{multicols}{2}
+\begin{questions}
+
+% subtraction
+\RandomQ{\a}[16]{1/8}{15/16}\RandomQ[ne=\a]{\b}[16]{1/8}{15/16}
+
+\item $\displaystyle \ds\a - \ds\b =
+ \RespBoxMath[\rectW{.5in}]{ (\nOf\a * \dOf\b - \nOf\b * \dOf\a )/( \dOf\a * \dOf\b ) }{2}{.0001}{[0,2]}[{priorParse: \Array(nodec,NoAddOrSub)}]$\hfill
+ \CorrAnsButton{rFrac( rEval( \nOf\a * \dOf\b - \nOf\b * \dOf\a )/rEval( \dOf\a * \dOf\b ) )}*{rngCorrAnsButton}\kern1bp\sqTallyBox
+
+% subtraction
+\RandomQ{\a}[16]{1/8}{15/16}\RandomQ[ne=\a]{\b}[16]{1/8}{15/16}
+
+\item $\displaystyle \ds\a - \ds\b =
+ \RespBoxMath[\rectW{.5in}]{ (\nOf\a * \dOf\b - \nOf\b * \dOf\a )/( \dOf\a * \dOf\b ) }{2}{.0001}{[0,2]}[{priorParse: \Array(nodec,NoAddOrSub)}]$\hfill
+ \CorrAnsButton{rFrac( rEval( \nOf\a * \dOf\b - \nOf\b * \dOf\a )/rEval( \dOf\a * \dOf\b ) )}*{rngCorrAnsButton}\kern1bp\sqTallyBox
+\pushquestions
+\end{multicols}
+\popquestions
+
+\vskip-6pt
+
+\begin{eqComments}[Indefinite Integration.]
+There are two integration problems, again, the second question is a copy and paste of the first.
+The parameters of the problem were, of course, populated by different random numbers.
+\end{eqComments}
+
+\RandomQ{\a}{1/6}{3/2}
+\RandomQ{\b}{1/6}{3/2}
+\RandomZ{\c}{1}{3}
+
+\item $\displaystyle\int \cds\a x^2 + \cds\b x + \ds\c\,dx =
+ \RespBoxMath{(\a/3)x^3+(\b/2) x^2 + \c x}{3}{.0001}{[0,2]}$\hfill
+ \CorrAnsButton{(rFrac(rEval(\nOf\a)/rEval(3*\dOf\a))) x^3
+ + (rFrac(rEval(\nOf\b)/rEval(2*\dOf\b))) x^2
+ + \c x + C}*{rngCorrAnsButton}\kern1bp\sqTallyBox
+
+\RandomQ{\a}{1/6}{3/2}
+\RandomQ{\b}{1/6}{3/2}
+\RandomZ{\c}{1}{3}
+
+\item $\displaystyle\int \cds\a x^2 + \cds\b x + \ds\c\,dx =
+ \RespBoxMath{(\a/3)x^3+(\b/2) x^2 + \c x}{3}{.0001}{[0,2]}$\hfill
+ \CorrAnsButton{(rFrac(rEval(\nOf\a)/rEval(3*\dOf\a))) x^3
+ + (rFrac(rEval(\nOf\b)/rEval(2*\dOf\b))) x^2
+ + \c x + C}*{rngCorrAnsButton}\kern1bp\sqTallyBox
+
+%\vskip-6pt
+\vskip-6pt
+
+\begin{eqComments}
+Definite integration can also be posed, but is not illustrated here.
+\end{eqComments}
+
+\vskip-6pt
+
+\begin{eqComments}[Analytic Geometry.]
+Find the equation of the line that passes through $P$ and $Q$.
+\end{eqComments}
+
+\RandomZ{\a}{-10}{9}
+\RandomZ{\b}{-10}{9}
+\RandomZ{\c}{\a*}{10}
+\RandomZ{\d}{\b*}{10}
+\defineDepQJS{\m}{\d - \b}{\c - \a}{rFrac(rEval(\nOf\m)/rEval(\dOf\m))}
+
+\item $P(\,\a, \b\,)$, $Q(\,\c, \d\,)$:
+ \RespBoxMath{y = \m*x + (\b - \a*\m) }(xy){3}{.0001}{[0,2]x[0,2]}*{ProcRespEq}\hfill
+ \CorrAnsButton{y = \js\m\space x + rFrac((rEval( \b * \dOf\m - \a*\nOf\m ))/(rEval(\dOf\m)))}*{rngCorrAnsButton}%
+ \kern1bp\sqTallyBox
+
+\RandomZ{\a}{-10}{9}
+\RandomZ{\b}{-10}{9}
+\RandomZ{\c}{\a*}{10}
+\RandomZ{\d}{\b*}{10}
+\defineDepQJS{\m} {\d - \b} {\c - \a} {rFrac(rEval(\nOf\m)/rEval(\dOf\m))}
+
+\item $P(\,\a, \b\,)$, $Q(\,\c, \d\,)$:
+ \RespBoxMath{y = \m*x + (\b - \a*\m) }(xy){3}{.0001}{[0,2]x[0,2]}*{ProcRespEq}\hfill
+ \CorrAnsButton{y = \js\m\space x + rFrac((rEval( \b * \dOf\m - \a*\nOf\m ))/(rEval(\dOf\m)))}*{rngCorrAnsButton}%
+ \kern1bp\sqTallyBox\par\kern2pt
+\end{questions}
+\end{shortquiz}\hfill\sqClearButton\kern1bp\sqTallyTotal
+\par\endgroup
+\newtopic\noindent
+Each time the manual is compiled, a new set of problems of the same type is generated.
+This package is pretty impressive, I'm sure you'll agree. \dps
+
+These examples were taken from the demo file \texttt{rangen\_tst.tex}.
+
+\section{Requirements}
+
+The requirements for your {\LaTeX} system, and well as any other
+software, is highlighted in this section.
+
+\subsection{{\LaTeX} Package Requirements}
+
+The following packages, in addition to the standard {\LaTeX}
+distribution, are required:
+\begin{enumerate}
+ \item The \textsf{lcg} package (2008/09/10 v1.2) by Erich Janka.
+ \item The \textsf{hyperref} package, a recent version.
+ \item If you want to use \pkg{rangen} to create quizzes, then
+ \textsf{exerquiz} of \textcolor{blue}{AeB} is required.\footnote{AeB: \url{http://www.math.uakron.edu/~dpstory/webeq.html}}
+\end{enumerate}
+
+\subsection{PDF Creator Requirements}
+
+The package works for all PDF creators: Acrobat Distiller, pdftex, and dvipdfm.
+
+\section{Installation}
+
+Unzip \texttt{rangen.zip} into your {\LaTeX} tree, the folder \texttt{rangen} is constructed
+with to contain the installation.
+
+\section{Package Options}
+
+Currently, there is only one option, \opt{testmode}. Then this option is used,
+each time the file is run, the random number generator of \pkg{lcd} is re-seeded
+Normally, the seed is based on the time, the date and other factors; the clock
+of the {\TeX} compiler gives the time to the nearest minute, so one must wait at least
+a minute before getting a new seed, this is not acceptable when testing a package.
+When \opt{testmode} is used, the initial seed is \texttt{seed=1}, and increments
+by one thereafter; after the increment, this value is saved to the file
+\cs{jobname.seed} and input back in on the next compile.
+
+Any other options that are passed to \pkg{rangen}, are passed on to the \textsf{lcg} package.
+Useful options for \pkg{lcg} are \texttt{quiet} and \texttt{seed=\meta{number}}.
+
+
+\section{Basic Commands}
+
+This package defines the commands \cs{RandomZ},
+\cs{RandomQ}, and \cs{RandomR}, \cs{RandomL}, and \cs{RandomI}. We describe
+these commands in this section.
+
+For convenience of terminology, a number created by one of the above commands
+will be referred to as a RV (random variable).
+
+\cs{RandomZ} and \cs{RandomQ} use the count registers, so there is a restriction
+on the size of any RV generated by these two commands, we must have
+\begin{equation*}
+ -2^{31}+1 \leq \text{RV} \leq 2^{31}-1\implies
+ -2147483647 \leq \text{RV} \leq 2147483647
+\end{equation*}
+For simple applications envisioned for \pkg{rangen}, this range should be plenty
+enough.
+
+The \cs{RandomR} command uses the dimension registers, so a RV generated by
+\cs{RandomR} is restricted to
+\begin{equation*}
+ -2^{14} < \text{RV} < 2^{14}\implies
+ -16384 < \text{RV} < 16384
+\end{equation*}
+Again, this is not a package for making floating point calculations, it is a package
+for generating integers, rationals, and decimal numbers with an eye towards application
+to academic problem generation. Floating point arithmetic can be accomplished using
+the \textsf{fp} package; \pkg{rangen} and \textsf{fp} seem to be compatible.
+
+\subsection{\texorpdfstring{\protect\cs{RandomZ}}{\CMD{RandomZ}}}
+
+The command \Com{RandomZ} defines a random integer, the syntax is
+
+\takeMeasure{\string\RandomZ[\meta{key-values}]\darg{\cs{\meta{name}}}\darg{\meta{zLEP}}\darg{\meta{zUEP}}}
+\begin{dCmd*}[commandchars=!()]{\bxSize}
+\RandomZ[!meta(key-values)]{!cs(!meta(name))}{!meta(zLEP)}{!meta(zUEP)}
+\end{dCmd*}
+\PD
+\begin{description}
+\item [\texttt{\meta{key-values}}] The key-value pairs that modify the choice of
+the variable. The key-value pairs recognize are
+\begin{description}
+ \item [\texttt{ne=\meta{value}}] Restrict the choice of the random integer by requiring
+ it \emph{not be equal} to another number, for example, \texttt{ne=0} or \texttt{ne=\cs{b}}.
+ In the latter case, \cs{b} is a number defined already by either an earlier
+ \cs{RandomZ} call, or by \Com{defineZ}, discussed later. Multiple restrictions can
+ be placed as well, for example, if \verb!ne={0,-1}!, \pkg{rangen} selects an integer
+ different from 0 or -1.
+% \item \texttt{formatOne}: A Boolean formatting key for formatting the number 1;
+% for example, instead of typesetting \texttt{1x} the correct syntax is to typeset \texttt{x}.
+% To obtain this special formatting, you must use
+% \cs{fmt} or \cs{ds}, for example \verb!\fmt\a!. Details are described below.
+% \item \texttt{formatPMOne}: A Boolean formatting key for formatting the numbers 1 and -1;
+% in addition to formatting of the number 1, if the random integer is -1 we want to
+% typeset \texttt{-x} not \texttt{-1x}. To obtain this special formatting, you must use
+% \cs{fmt} or \cs{ds}, for example \verb!\fmt\a!. Details are described below.
+\end{description}
+\item[\cs{\meta{name}}] The name of the random integer. For example,
+ \cs{a}, \cs{b}, etc.
+\item [\meta{zLEP}] An integer that is the lower endpoint of the interval
+ from which the number is randomly selected. The lower endpoint may be
+ an integer previously calculated by an earlier \cs{RandomZ} call, for
+ example, \verb!\RandomZ{\b}{\a}{5}!, this will generate an integer
+ \cs{b} such that $\cs{a}\le\cs{b}\le5$. To get strict inequality,
+ append an asterisk (\texttt{*}), for example, if the syntax
+ \verb!\RandomZ{\b}{\a*}{5}! is used, then \pkg{rangen} attempts to
+ satisfy $\cs{a}<\cs{b}\le5$. The range of \cs{a} should be such that
+ the upper limit for \cs{a} is less than the upper limit of \cs{b}. When
+ the endpoint is a number, the \texttt{*} is ignored.\smallskip
+
+ When the lower endpoint is a command created by the commands
+ \cs{Random\meta{\upshape{Z|Q|R|L}}} or by
+ \cs{define\meta{\upshape{Z|Q|R}}}, the endpoint is converted to a real
+ number.
+
+\item [\meta{zUEP}] An integer that is the upper endpoint of the interval
+ from which the number is randomly selected. The upper endpoint may be
+ an integer previously calculated by an earlier \cs{RandomZ} call, for
+ example, \verb!\RandomZ{\b}{-5}{\a}!, this will generate an integer
+ \cs{b} such that $-5\le\cs{b}\le\cs{a}$. To get strict inequality, use
+ the syntax $-5\le\cs{b}\le\cs{a}*$, then \pkg{rangen} attempts to
+ satisfy $-5\le\cs{b}<\cs{a}$. The range of \cs{a} should be such that
+ the lower limit for \cs{a} is greater than the lower limit of \cs{b}.
+ When the endpoint is a number, the \texttt{*} is ignored.\smallskip
+
+ When the upper endpoint is a command created by the commands
+ \cs{Random\meta{\upshape{Z|Q|R|L}}} or by
+ \cs{define\meta{\upshape{Z|Q|R}}}, the endpoint is converted to a real
+ number.
+
+\end{description}
+
+\noindent
+\textbf{Examples:}
+\begin{enumerate}
+ \item \verb!\RandomZ{\a}{-5}{5}!: \RandomZ{\a}{-5}{5}\cs{a}=\a. To get another
+ random integer, we repeatedly execute \verb!\RandomZ{\a}{-5}{5}! followed by
+ \cs{a}, for example, we copy and paste \verb!\RandomZ{\a}{-5}{5}\a! three times to get
+ \RandomZ{\a}{-5}{5}\a, \RandomZ{\a}{-5}{5}\a, \RandomZ{\a}{-5}{5}\a.
+
+ \item Illustrate \texttt{ne}: Consider
+ \verb!\RandomZ[ne={0,-1}]{\a}{-5}{5}\a!, copy and paste
+ repeatedly: \RandomZ[ne={0,-1}]{\a}{-5}{5}\a,
+ \RandomZ[ne={0,-1}]{\a}{-5}{5}\a, \RandomZ[ne={0,-1}]{\a}{-5}{5}\a,
+ \RandomZ[ne={0,-1}]{\a}{-5}{5}\a, and
+ \RandomZ[ne={0,-1}]{\a}{-5}{5}\a. If \pkg{rangen} worked as it
+ should, the list of five number should not contain a 0 or a -1,
+ does it?
+ \item Illustrate $\cs{a}\le\cs{b}$: We use the code
+\begin{Verbatim}
+\RandomZ{\a}{-5}{5}\RandomZ{\b}{\a}{10}$\a \le \b$
+\end{Verbatim}
+ We now copy and paste this code: \RandomZ{\a}{-5}{5}\RandomZ{\b}{\a}{10}$\a \le \b$,
+ \RandomZ{\a}{-5}{5}\RandomZ{\b}{\a}{10}$\a \le \b$. To get strict inequality we execute
+\begin{Verbatim}
+\RandomZ{\a}{-5}{5}\RandomZ{\b}{\a*}{10}$\a < \b$
+\end{Verbatim}
+ We now copy and paste this code: \RandomZ{\a}{-5}{5}\RandomZ{\b}{\a*}{10}$\a < \b$,
+ \RandomZ{\a}{-5}{5}\RandomZ{\b}{\a*}{10}$\a < \b$
+%\item\texttt{formatOne}: We execute the code
+%\begin{Verbatim}
+%\RandomZ[formatOne]{\a}{1}{3}$\fmt\a x$
+%\end{Verbatim}
+% to get \RandomZ[formatOne]{\a}{1}{3}$\fmt\a x$, \RandomZ[formatOne]{\a}{1}{3}$\fmt\a x$,
+% \RandomZ[formatOne]{\a}{1}{3}$\fmt\a x$, \RandomZ[formatOne]{\a}{1}{3}$\fmt\a x$.
+% Notice the use of the command \cs{fmt}. When \cs{fmt} is present, the special formatting
+% is used; there are times when you want the formatting, and other times when you don't it. For example,
+% suppose we want \cs{a} to be a constant term, we want $ 1 + x $ not $\phantom{1}+x$, to get this
+% we use create \cs{a} as before \verb!\RandomZ[formatOne]{\a}{1}{3}$\a+\fmt\a x$!, but do not use
+% the \cs{fmt} on the first term. This gets us \RandomZ[formatOne]{\a}{1}{3}$\a+\fmt\a x$,
+% \RandomZ[formatOne]{\a}{1}{3}$\a+\fmt\a x$, \RandomZ[formatOne]{\a}{1}{3}$\a+\fmt\a x$.
+%
+%\item\texttt{formatPMOne}: We execute the code
+%\begin{Verbatim}
+%\RandomZ[ne=0,formatPMOne]{\a}{-2}{2}$\fmt\a x$
+%\end{Verbatim}
+%to obtain \RandomZ[ne=0,formatPMOne]{\a}{-2}{2}$\fmt\a x$, \RandomZ[ne=0,formatPMOne]{\a}{-2}{2}$\fmt\a x$,
+%\RandomZ[ne=0,formatPMOne]{\a}{-2}{2}$\fmt\a x$, \RandomZ[ne=0,formatPMOne]{\a}{-2}{2}$\fmt\a x$. Let us hope
+%we get a -1 in one of those generations.
+\end{enumerate}
+
+\paragraph*{Data Type Properties.}\label{dtProperties}When a random number is created, there are several auxiliary commands that are defined.
+
+\takeMeasure{\string\nOf\darg{\cs{\meta{name}}}\quad\string\dOf\darg{\cs{\meta{name}}}}
+\begin{dCmd*}[commandchars=!()]{\bxSize}
+\nOf{!cs(!meta(name))}!quad\dOf{!cs(!meta(name))}
+\fmt{!cs(!meta(name))}!quad\ds{!cs(!meta(name))}
+\end{dCmd*}
+\CmdDescription
+\begin{description}\def\1{\hspace{-\labelsep}}
+ \item\1 \cs{nOf\darg{\cs{\meta{name}}}} is the numerator for the number
+ \cs{\meta{name}}. For an integer this is just \cs{\meta{name}}. This
+ function becomes important for rational numbers. If \cs{a} is the
+ rational number 2/3, then \verb!\nOf{\a}=2!.
+
+ \item\1 \cs{dOf\darg{\cs{\meta{name}}}} is the denominator for the number
+ \cs{\meta{name}}. For an integer this is just \texttt{1}. This
+ function becomes important for rational numbers. If \cs{a} is the
+ rational number 2/3, then \verb!\dOf{\a}=3!.
+
+ \item\1 \cs{fmt\darg{\cs{\meta{name}}}} allows for special formatting for
+ in-line numbers. Without one of the special formatting options,
+ \cs{fmt}\cs{a} is the same as \cs{a}.
+
+ \item\1 \cs{ds\darg{\cs{\meta{name}}}} allows for special formatting for
+ display style number. \cs{ds} is relevant for rational numbers. If
+ \cs{a} represents the rational 1/2, the \cs{a} expanded is 1/2, while
+ \cs{ds}\cs{a} expanded is $\frac{1}{2}$. The \cs{ds} command also
+ obeys the formatting options.
+\end{description}
+
+
+\subsection{\texorpdfstring{\protect\cs{RandomQ}}{\CMD{RandomQ}}}
+
+The command \Com{RandomQ} defines a random rational, the syntax is
+
+\takeMeasure{\small\string\RandomQ[\meta{key-values}]\darg{\cs{\meta{name}}}%
+[\meta{max\_denom}]\darg{\meta{qLEP}}\darg{\meta{qUEP}}}
+\begin{dCmd*}[commandchars=!(),fontsize=\small]{\bxSize}
+\RandomQ[!meta(key-values)]{!cs(!meta(name))}[!meta(max_denom)]{!meta(qLEP)}{!meta(qUEP)}
+\end{dCmd*}
+\PD
+\begin{description}\def\1{\hspace{-\labelsep}}
+\item [\meta{key-values}] The key-value pairs that modify the choice of
+the variable. The key-value pairs recognize are
+\begin{description}
+ \item [\texttt{ne=\meta{value}}] Restrict the choice of the random rational by requiring
+ it \emph{not be equal} to another number, for example, \texttt{ne=0} or \texttt{ne=\cs{b}}.
+ In the latter case, \cs{b} is a number defined already by either an earlier
+ \cs{RandomQ} call, or by \Com{defineQ}, discussed later. Multiple restrictions can
+ be placed as well, for example, if \verb!ne={0,-1}!, \pkg{rangen} selects an integer
+ different from 0 or -1.
+% \item \texttt{formatOne}: A Boolean formatting key for formatting the number 1;
+% for example, instead of typesetting \texttt{1x} the correct syntax is to typeset \texttt{x}.
+% To obtain this special formatting, you must use
+% \cs{fmt} or \cs{ds}, for example \verb!\fmt\a!. Details are described below.
+% \item \texttt{formatPMOne}: A Boolean formatting key for formatting the numbers 1 and -1;
+% in addition to formatting of the number 1, if the random integer is -1 we want to
+% typeset \texttt{-x} not \texttt{-1x}. To obtain this special formatting, you must use
+% \cs{fmt} or \cs{ds}, for example \verb!\fmt\a!. Details are described below.
+\end{description}
+\item\1\cs{\meta{name}} is the name of the random rational. For example,
+\cs{a}, \cs{b}, etc.
+
+\item\1\meta{max\_denom} is the largest denominator you want your random
+ rational to have. For example, \verb!\RandomQ{\a}[9]{1/2}{7/2}!: The
+ value of \cs{a} is a rational number between 1/2 and 7/2 having a
+ maximum denominator of 9. If this parameter is not specified, the least
+ common denominator is used; for the example, that would be 2. To
+ contrast the two, consider the following examples:
+\begin{enumerate}
+ \item \verb!\RandomQ{\a}[9]{1/2}{7/2}\a!: \RandomQ{\a}[9]{1/2}{7/2}\a, \RandomQ{\a}[9]{1/2}{7/2}\a,
+ \RandomQ{\a}[9]{1/2}{7/2}\a, and \RandomQ{\a}[9]{1/2}{7/2}\a.
+ \item \verb!\RandomQ{\a}{1/2}{7/2}\a!: \RandomQ{\a}{1/2}{7/2}\a, \RandomQ{\a}{1/2}{7/2}\a,
+ \RandomQ{\a}{1/2}{7/2}\a, \RandomQ{\a}{1/2}{7/2}\a.
+\end{enumerate}
+The fractions are reduced to lowest terms, and represented as an integer if needed.
+
+Here is more detail on the algorithm used to generate a rational: We illustrate
+using the example, \verb!\RandomQ{\a}[9]{1/2}{7/2}!, the details are simplified slightly.
+\begin{enumerate}
+ \item Convert the range so that the endpoints have a denominator of~9.
+\begin{alignat*}{2}
+ &\texttt{LEP}: \frac{1}{2}= \frac{9/2}{9}=\frac{4.5}{9}< \frac{5}{9}&&\quad\text{round up} \\[1em]
+ &\texttt{UEP}: \frac{7}{2}= \frac{63/2}{9}=\frac{31.5}{9}>\frac{31}{9}&&\quad\text{round down}
+\end{alignat*}
+\item We randomly choose an integer between 5 and 31, call it \cs{z}; our random
+rational is then \texttt{\cs{z}/9}, unless there is an \texttt{*} affixed to one of
+both endpoints.
+\item If one or both endpoints is itself a random rational (or integer) and the \texttt{*}
+character is used, then the lower end of the range is incremented (from 5 to 6) and/or
+the upper end is decremented (from 31 to 30).
+\item Reduce the fraction obtained in the previous step.
+\end{enumerate}
+
+You can see from this example, there are a lot of choices for the random
+integer, there are 27 possibilities between 5 and 32.
+
+\item\1 \meta{qLEP} is a rational (of the form a/b) that is the lower
+ endpoint of the interval from which the number is randomly selected.
+ The lower endpoint may be a rational (or integer) previously calculated
+ by an earlier \cs{RandomQ} call, for example,
+ \verb!\RandomQ{\b}{\a}{4/3}!, this will generate an integer \cs{b} such
+ that $\cs{a}\le\cs{b}\le4/3$. To get strict inequality, use the syntax
+ \verb!\RandomZ{\b}{\a*}{4/3}!, then \pkg{rangen} attempts to satisfy
+ $\cs{a}<\cs{b}\le4/3$. The range of \cs{a} should be such that the
+ upper limit for \cs{a} is less than the upper limit of \cs{b}. When the
+ endpoint is a number, the \texttt{*} is ignored.\smallskip
+
+ When the lower endpoint is a command created by any of the commands
+ \cs{Random\meta{\upshape{Z|Q|R|L}}} or \cs{define\meta{\upshape{Z|Q|R}}},
+ the endpoint is converted to a real number.
+
+\item\1\meta{qUEP} is a rational that is the upper endpoint of the interval
+ from which the number is randomly selected. The upper endpoint may be a
+ rational (or integer) previously calculated by an earlier \cs{RandomQ}
+ call, for example, \verb!\RandomQ{\b}{-4/3}{\a}!, this will generate an
+ integer \cs{b} such that $-4/3\le\cs{b}\le\cs{a}$. To get strict
+ inequality, use the syntax $-4/3\le\cs{b}\le\cs{a}*$, then \pkg{rangen}
+ attempts to satisfy $-4/3\le\cs{b}<\cs{a}$. The range of \cs{a} should
+ be such that the lower limit for \cs{a} is greater than the lower limit
+ of \cs{b}. When the endpoint is a number, the \texttt{*} is
+ ignored.\smallskip
+
+ When the upper endpoint is a command created by any of the commands
+ \cs{Random\meta{\upshape{Z|Q|R|L}}} or \cs{define\meta{\upshape{Z|Q|R}}},
+ the endpoint is converted to a real number.
+\end{description}
+
+\paragraph*{Examples}
+\begin{enumerate}
+ \item \verb!\RandomZ{\a}{-5}{5}!: \RandomZ{\a}{-5}{5}\cs{a}=\a. To get
+ another random integer, we repeatedly execute
+ \verb!\RandomZ{\a}{-5}{5}! followed by \cs{a}, for example, we copy
+ and paste \verb!\RandomZ{\a}{-5}{5}\a! three times to get
+ \RandomZ{\a}{-5}{5}\a, \RandomZ{\a}{-5}{5}\a,
+ \RandomZ{\a}{-5}{5}\a.
+
+ \item Illustrate \texttt{ne}: Copy and paste
+\begin{Verbatim}
+\RandomZ[ne={0,-1}]{\a}{-5}{5}\a
+\end{Verbatim}
+ repeatedly to obtain:
+ \RandomZ[ne={0,-1}]{\a}{-5}{5}\a, \RandomZ[ne={0,-1}]{\a}{-5}{5}\a,
+ \RandomZ[ne={0,-1}]{\a}{-5}{5}\a, \RandomZ[ne={0,-1}]{\a}{-5}{5}\a,
+ and \RandomZ[ne={0,-1}]{\a}{-5}{5}\a. If \pkg{rangen} worked as it
+ should, the list of five number should not contain a 0 or a -1,
+ does it?
+ \item Illustrate $\cs{a}\le\cs{b}$: We use the code
+\begin{Verbatim}
+\RandomZ{\a}{-5}{5}\RandomZ{\b}{\a}{10}$\a \le \b$
+\end{Verbatim}
+ We now copy and paste this code: \RandomZ{\a}{-5}{5}\RandomZ{\b}{\a}{10}$\a \le \b$,
+ \RandomZ{\a}{-5}{5}\RandomZ{\b}{\a}{10}$\a \le \b$. To get strict inequality we execute
+\begin{Verbatim}
+\RandomZ{\a}{-5}{5}\RandomZ{\b}{\a*}{10}$\a < \b$
+\end{Verbatim}
+ We now copy and paste this code:
+ \RandomZ{\a}{-5}{5}\RandomZ{\b}{\a*}{10}$\a < \b$,
+ \RandomZ{\a}{-5}{5}\RandomZ{\b}{\a*}{10}$\a < \b$
+%\item\texttt{formatOne}: We execute the code
+%\begin{Verbatim}
+%\RandomZ[formatOne]{\a}{1}{3}$\fmt\a x$
+%\end{Verbatim}
+% to get \RandomZ[formatOne]{\a}{1}{3}$\fmt\a x$, \RandomZ[formatOne]{\a}{1}{3}$\fmt\a x$,
+% \RandomZ[formatOne]{\a}{1}{3}$\fmt\a x$, \RandomZ[formatOne]{\a}{1}{3}$\fmt\a x$.
+% Notice the use of the command \cs{fmt}. When \cs{fmt} is present, the special formatting
+% is used; there are times when you want the formatting, and other times when you don't it. For example,
+% suppose we want \cs{a} to be a constant term, we want $ 1 + x $ not $\phantom{1}+x$, to get this
+% we use create \cs{a} as before \verb!\RandomZ[formatOne]{\a}{1}{3}$\a+\fmt\a x$!, but do not use
+% the \cs{fmt} on the first term. This gets us \RandomZ[formatOne]{\a}{1}{3}$\a+\fmt\a x$,
+% \RandomZ[formatOne]{\a}{1}{3}$\a+\fmt\a x$, \RandomZ[formatOne]{\a}{1}{3}$\a+\fmt\a x$.
+%
+%\item\texttt{formatPMOne}: We execute the code
+%\begin{Verbatim}
+%\RandomZ[ne=0,formatPMOne]{\a}{-2}{2}$\fmt\a x$
+%\end{Verbatim}
+%to obtain \RandomZ[ne=0,formatPMOne]{\a}{-2}{2}$\fmt\a x$, \RandomZ[ne=0,formatPMOne]{\a}{-2}{2}$\fmt\a x$,
+%\RandomZ[ne=0,formatPMOne]{\a}{-2}{2}$\fmt\a x$, \RandomZ[ne=0,formatPMOne]{\a}{-2}{2}$\fmt\a x$. Let us hope
+%we get a -1 in one of those generations.
+
+ \item \verb!\RandomQ{\a}{-5/2}{5/2}!: \RandomQ{\a}{-5/2}{5/2}\cs{a}=\a.
+ We repeatedly copy and paste \verb!\RandomQ{\a}{-5/2}{5/2}\a! three
+ times to get \RandomQ{\a}{-5/2}{5/2}\a, \RandomQ{\a}{-5/2}{5/2}\a,
+ \RandomQ{\a}{-5/2}{5/2}\a.
+
+ \item Illustrate \texttt{ne}:
+ \verb!\RandomQ[ne={0,-1}]{\a}{-5/2}{5/2}\a!, copy and paste this
+ code repeatedly: \RandomQ[ne={0,-1}]{\a}{-5/2}{5/2}\a,
+ \RandomQ[ne={0,-1}]{\a}{-5/2}{5/2}\a,
+ \RandomQ[ne={0,-1}]{\a}{-5/2}{5/2}\a,
+ \RandomQ[ne={0,-1}]{\a}{-5/2}{5/2}\a, and
+ \RandomQ[ne={0,-1}]{\a}{-5/2}{5/2}\a. If \pkg{rangen} worked as it
+ should, the list of five number should not contain a 0 or a -1,
+ does it?
+
+ \item Illustrate $\cs{a}\le\cs{b}$: We use the code
+\begin{Verbatim}[fontsize=\small]
+\RandomQ{\a}{-5/2}{5/2}\RandomQ{\b}[4]{\a}{10}$\a \le \b$
+\end{Verbatim}
+ and copy and paste: \RandomQ{\a}{-5/2}{5/2}\RandomQ{\b}[4]{\a}{10}$\a \le \b$,
+ \RandomQ{\a}{-5/2}{5/2}\RandomQ{\b}[4]{\a}{10}$\a \le \b$. To get strict inequality we execute
+\begin{Verbatim}[fontsize=\small]
+\RandomQ{\a}{-5/2}{5/2}\RandomQ{\b}[4]{\a*}{10}$\a < \b$
+\end{Verbatim}
+ to get \RandomQ{\a}{-5/2}{5/2}\RandomQ{\b}[4]{\a*}{10}$\a < \b$,
+ \RandomQ{\a}{-5/2}{5/2}\RandomQ{\b}[4]{\a*}{10}$\a < \b$
+%\item\texttt{formatOne}: We execute the code
+%\begin{Verbatim}
+%\RandomQ[formatOne]{\a}{2/3}{4/3}$\ds\a x$
+%\end{Verbatim}
+% to get \RandomQ[formatOne]{\a}{2/3}{4/3}$\ds\a x$, \RandomQ[formatOne]{\a}{2/3}{4/3}$\ds\a x$,
+% \RandomQ[formatOne]{\a}{2/3}{4/3}$\ds\a x$, \RandomQ[formatOne]{\a}{2/3}{4/3}$\ds\a x$.
+% Notice the use of the command \cs{ds}. When \cs{ds} is present, the special formatting
+% is used; there are times when you want the formatting, and other times when you don't it. For example,
+% suppose we want \cs{a} to be a constant term, we want $ 1 + x $ not $\phantom{1}+x$, to get this
+% we use create \cs{a} as before\\[3pt]
+% \verb!\RandomQ[formatOne]{\a}{2/3}{4/3}$\a+\ds\a x$!,\\[3pt]
+% but do not use
+% the \cs{ds} on the first term. This gets us \RandomQ[formatOne]{\a}{2/3}{4/3}$\a+\ds\a x$,
+% \RandomQ[formatOne]{\a}{2/3}{4/3}$\a+\ds\a x$, \RandomQ[formatOne]{\a}{2/3}{4/3}$\a+\ds\a x$.
+%
+%\item\texttt{formatPMOne}: We execute the code
+%\begin{Verbatim}
+%\RandomQ[formatPMOne]{\a}{-6/5}{-4/5}$\ds\a x$
+%\end{Verbatim}
+%to obtain \RandomQ[formatPMOne]{\a}{-6/5}{-4/5}$\ds\a x$, \RandomQ[formatPMOne]{\a}{-6/5}{-4/5}$\ds\a x$,
+%\RandomQ[formatPMOne]{\a}{-6/5}{-4/5}$\ds\a x$, \RandomQ[formatPMOne]{\a}{-6/5}{-4/5}$\ds\a x$. Let us hope
+%we get a -1 in one of those generations.
+\end{enumerate}
+For a rational number, the commands \cs{nOf}, \cs{dOf}, \cs{fmt}, and \cs{ds} are
+also defined, see \Nameref{dtProperties}.
+
+\subsection{\texorpdfstring{\protect\cs{RandomR}}{\CMD{RandomR}}}
+
+The command \Com{RandomR} defines a random real number, the syntax is
+
+\takeMeasure{\string\RandomR[\meta{key-values}]\darg{\cs{\meta{name}}}%
+\darg{\meta{rLEP}}\darg{\meta{rUEP}}}
+\begin{dCmd*}[commandchars=!()]{\bxSize}
+\RandomR[!meta(key-values)]{!cs(!meta(name))}{!meta(rLEP)}{!meta(rUEP)}
+\end{dCmd*}
+\PD
+\begin{description}\def\1{\hspace{-\labelsep}}
+\item [\meta{key-values}] The key-value pairs that modify the choice of
+the variable. The key-value pairs recognize are
+\begin{description}
+ \item [\texttt{round=\meta{value}}] Round the generated real number so
+ that number of decimal places equals the \meta{value}, the value of
+ the \texttt{round} key; for example, \texttt{round=2} rounds the
+ result to 2 decimal places.
+
+ \item [\texttt{showzeros=\meta{\upshape{true|false}}}] Show trailing
+ zeros, only valid when the \texttt{round} key is used. For example,
+ \texttt{round=4,showzeros} might yield a result of 3.2300, whereas
+ without the \texttt{showzeros} key (or with
+ \texttt{showzeros=false}), the same result would be 3.23.
+
+ \item [\texttt{ne=\meta{value}}] Restrict the choice of the random real
+ by requiring it \emph{not be equal} to another number real, for
+ example, \texttt{ne=-1} or \texttt{ne=\cs{b}}. In the latter case,
+ \cs{b} is a number defined already by either an earlier
+ \cs{RandomR} call, or by \Com{defineR}, discussed later. Multiple
+ restrictions can be placed as well, for example, if
+ \verb!ne={0,-1}!, \pkg{rangen} selects an integer different from 0
+ or -1.\smallskip
+
+ Note, comparisons are made \emph{after} rounding.
+
+\end{description}
+
+\item\1\cs{\meta{name}} is the name of the random rational. For example,
+\cs{a}, \cs{b}, etc.
+
+\item\1 \meta{rLEP} is a real number (or integer) that is the lower
+ endpoint of the interval from which the number is randomly selected.
+ The lower endpoint may be a number previously calculated by an earlier
+ \cs{RandomR} call, for example, \verb!\RandomR{\b}{\a}{1.3}!, this will
+ generate an integer \cs{b} such that $\cs{a}\le\cs{b}\le1.3$. To get
+ strict inequality, use the syntax \verb!\RandomZ{\b}{\a*}{1.3}!, then
+ \pkg{rangen} attempts to satisfy $\cs{a}<\cs{b}\le4/3$. The range of
+ \cs{a} should be such that the upper limit for \cs{a} is less than the
+ upper limit of \cs{b}. When the endpoint is a number, the \texttt{*} is
+ ignored.\smallskip
+
+ When the lower endpoint is a command created by ant if the command
+ \cs{Random\meta{\upshape{Z|Q|R|L}}}, or by
+ \cs{define\meta{\upshape{Z|Q|R}}}, the endpoint is converted to a real
+ number.
+
+\item\1 \meta{rUEP} is a real number that is the upper endpoint of the
+ interval from which the number is randomly selected. The upper endpoint
+ may be a number previously calculated by an earlier \cs{RandomR} call,
+ for example, \verb!\RandomR{\b}{-1.3}{\a}!, this will generate an
+ integer \cs{b} such that $-1.3\le\cs{b}\le\cs{a}$. To get strict
+ inequality, use the syntax $-1.3\le\cs{b}\le\cs{a}*$, then \pkg{rangen}
+ attempts to satisfy $-1.3\le\cs{b}<\cs{a}$. The range of \cs{a} should
+ be such that the lower limit for \cs{a} is greater than the lower limit
+ of \cs{b}. When the endpoint is a number, the \texttt{*} is
+ ignored.\smallskip
+
+ When the upper endpoint is a command created by ant if the command
+ \cs{Random\meta{\upshape{Z|Q|R|L}}}, or by
+ \cs{define\meta{\upshape{Z|Q|R}}}, the endpoint is converted to a real
+ number.
+\end{description}
+The \cs{RandomR} command divides range ($\meta{rUEP}-\meta{rLEP}$) into equal
+sub-intervals, and randomly chooses node (an endpoint of one of the
+sub-intervals). The number of subdivisions is determined by
+\cs{RNGpowerOfTen}, and can be set by \cs{nDivisionsPowerOfTen}. This latter
+command takes an integer argument, $n$, $1\le n\le 4$, the number of
+subdivisions is then $10^n$. Strictly speaking \cs{RNGpowerOfTen} does not
+have to be a power of 10, you can make the definition
+\verb!\def\RNGpowerOfTen{16}!, and that should work as well. The default is
+\verb!\nDivisionsPowerOfTen{2}!, that is, divide the range into 100 equal
+subdivisions.
+
+\paragraph*{Examples:}
+
+\begin{enumerate}
+ \item \verb!\RandomR{\a}{-2.3}{2.3}!: \RandomR{\a}{-2.3}{2.3}\cs{a}=\a.
+ To obtain more random real numbers, repeatedly execute
+ \verb!\RandomR{\a}{-2.3}{2.3}! followed by \cs{a}; for example,
+ \verb!\RandomR{\a}{-2.3}{2.3}\a! repeated three times yields the following:
+\begin{equation*}
+ \RandomR{\a}{-2.3}{2.3}\a,\ \RandomR{\a}{-2.3}{2.3}\a,\ \RandomR{\a}{-2.3}{2.3}\a
+\end{equation*}
+
+ \item \texttt{round}: We use \verb!\RandomR[round=4]{\a}{-2}{2}\a! to get
+\begin{equation*}
+ \RandomR[round=4]{\a}{-2}{2}\a,\ \RandomR[round=4]{\a}{-2}{2}\a,\
+ \RandomR[round=4]{\a}{-2}{2}\a
+\end{equation*}
+
+ \item \texttt{showzeros}: \verb!\RandomR[round=4,showzeros]{\a}{-2}{2}\a!:
+\begin{equation*}
+ \RandomR[round=4,showzeros]{\a}{-2}{2}\a,\ \RandomR[round=4,showzeros]{\a}{-2}{2}\a,\
+ \RandomR[round=4,showzeros]{\a}{-2}{2}\a,\ \RandomR[round=4,showzeros]{\a}{-2}{2}\a,\
+ \RandomR[round=4,showzeros]{\a}{-2}{2}\a
+\end{equation*}
+
+ \item Illustrate $\cs{a}\le\cs{b}$: We use the code
+\begin{Verbatim}
+\RandomR{\a}{-5}{5}\RandomR{\b}{\a}{10}$\a \le \b$
+\end{Verbatim}
+ We now copy and paste this code twice:
+\begin{equation*}
+ \RandomR{\a}{-5}{5}\RandomR{\b}{\a}{10}\a \le \b,\
+ \RandomR{\a}{-5}{5}\RandomR{\b}{\a}{10}\a \le \b
+\end{equation*}
+To get strict inequality we execute
+\begin{Verbatim}
+\RandomR{\a}{-5}{5}\RandomR{\b}{\a*}{10}$\a < \b$
+\end{Verbatim}
+ We now copy and paste this code a couple of times:
+\begin{equation*}
+ \RandomR{\a}{-5}{5}\RandomR{\b}{\a*}{10} \a < \b,\
+ \RandomR{\a}{-5}{5}\RandomR{\b}{\a*}{10} \a < \b
+\end{equation*}
+For real numbers, there is little chance the two values are equal, but just in case, strict
+inequality may be specified in this way.
+\end{enumerate}
+
+\subsection{\texorpdfstring{\protect\cs{RandomL}}{\CMD{RandomL}}}
+
+The command \Com{RandomL} defines a list of numbers (integer, rational, decimal),
+and randomly selects a number from the list.
+
+\takeMeasure{\string\RandomR[\meta{key-values}]\darg{\cs{\meta{name}}}%
+\darg{\meta{n\SUB{1},n\SUB{2},n\SUB{3},...}}}%
+\begin{dCmd*}[commandchars=!()]{\bxSize}
+\RandomL[!meta(key-values)]{!cs(!meta(name))}{!meta(n!SUB(1),n!SUB(2),n!SUB(3),...)}
+\end{dCmd*}
+
+\PD
+\begin{description}\def\1{\hspace{-\labelsep}}
+\item [\texttt{\meta{key-values}}] The only key-value pairs recognized is
+ \texttt{index=\meta{posZ}}. The index is a base-1 index, thus \texttt{index=1}
+ references the first number in the list.
+
+ The \texttt{index} key can be used to retrieve a particular number from
+ this list; for example, declaring
+ \verb!\RandomL[index=2]{\a}{17,1/2,1.3}!, the value of \cs{a} is 1/2.
+
+ The value of \texttt{index} can be any positive integer, even one generated
+ using \cs{RandomI}. If the value of \texttt{index} is greater than the
+ number of items in the list, modular arithmetic is performed to put the
+ index back into the proper range.
+
+ When the \texttt{index} key is not present, a number is randomly selected
+ from the list.
+
+\item\1\cs{\meta{name}} is the name of the number generated. The number
+ generated will be defined as integer, rational, or real; consequently
+ \cs{nOf}, \cs{dOf}, \cs{fmt}, and \cs{ds} are defined.
+
+\item \meta{n\SUB{1},n\SUB{2},n\SUB{3},...} A (possibly mixed) list of
+ numbers. The numbers can be literal (12, 1.2, 3/4), or control
+ sequences of numbers (commands) defined earlier by \cs{Random\meta{\upshape{Z|Q|R|L}}}
+ or by \cs{define\meta{\upshape{Z|Q|R}}}.
+\end{description}
+
+\paragraph*{Examples}
+
+\begin{enumerate}
+ \item After declaring \verb!\RandomL{\a}{17,3.14,88,3/4,1/2}!, the value
+ of \cs{a} is \RandomL{\a}{17,3.14,88,3/4,1/2}\texttt{\cs{a} = \a},
+ Select a number from this list at random
+ \RandomL{\a}{17,3.14,88,3/4,1/2}\texttt{\string\a=\a}, again
+ \RandomL{\a}{17,3.14,88,3/4,1/2}\texttt{\string\a=\a}, and again
+ \RandomL{\a}{17,3.14,88,3/4,1/2}\texttt{\string\a=\a}.
+ \item \verb!\RandomL[index=3]{\a}{17,3.14,88,3/4,1/2}\a!,
+ \RandomL[index=3]{\a}{17,3.14,88,3/4,1/2}\texttt{\string\a=\a}.
+\end{enumerate}
+
+\subsection{\texorpdfstring{\protect\cs{RandomI}}{\CMD{RandomI}}}
+
+The command \Com{RandomI} defines a list of integers, \verb!{1,2,3...n}!
+and randomly selects an integer, thought of as an index value, from the list.
+
+\takeMeasure{\string\RandomI\darg{\cs{\meta{name}}}\darg{\meta{n}}}%
+\begin{dCmd*}[commandchars=!()]{\bxSize}
+\RandomI{!cs(!meta(name))}{!meta(n)}
+\end{dCmd*}
+\PD
+\begin{description}\def\1{\hspace{-\labelsep}}
+
+\item\1\cs{\meta{name}} is the name of the number generated, the number
+will be defined as an integer number.
+
+\item\1 \meta{n} is a positive number greater than 1. The list
+ \verb!{1,2,3...n}! is implicitly created.
+\end{description}
+
+\paragraph*{Example:} \verb!\RandomI{\indx}{20}\indx! yields \RandomI{\indx}{20}\indx,
+\RandomI{\indx}{20}\indx, \RandomI{\indx}{20}\indx, \RandomI{\indx}{20}\indx, when copied
+and pasted four times.
+
+\newtopic\noindent
+My thought in creating \cs{RandomI} is to use it in conjunction with
+\cs{RandomL} (using the \texttt{index} key). For example,
+\begin{Verbatim}
+ \RandomI{\indx}{4}
+ \RandomL[index=\indx]{\a}{1/2,1/3,1/4,1/5}
+ \RandomL[index=\indx]{\b}{5/3,6/5,7/2,5/6}
+\begin{equation*}
+ (\a)+(\b) =
+\end{equation*}
+\end{Verbatim}
+
+ \RandomI{\indx}{4}
+ \RandomL[index=\indx]{\a}{1/2,1/3,1/4,1/5}
+ \RandomL[index=\indx]{\b}{5/3,6/5,7/2,5/6}
+
+\noindent
+This code results in the following arithmetic problem:
+\begin{equation*}
+ (\a)+(\b) =
+\end{equation*}
+This is probably not a good example of the usage of \cs{RandomI}. See the next section
+on \cs{RandomP}.
+
+\subsection{\texorpdfstring{\protect\cs{RandomP}}{\CMD{RandomP}}}
+
+The command \Com{RandomP} defines a list of strings (literal expressions),
+and randomly selects one from the list. (The ``P'' in \cs{RandomP} stands
+for ``Problem.'')
+
+\takeMeasure{\string\RandomP[\meta{key-values}]\darg{\cs{\meta{name}}}\darg{\meta{list of literals}}}%
+\begin{dCmd*}[commandchars=!()]{\bxSize}
+\RandomP[!meta(key-values)]{!cs(!meta(name))}{!meta(list of literals)}
+\end{dCmd*}
+
+\PD
+\begin{description}\def\1{\hspace{-\labelsep}}
+
+\item [\texttt{\meta{key-values}}] The only key-value pairs recognized is
+ \texttt{index=\meta{posZ}}. The index is a base-1 index, thus index=1
+ references the first number in the list.
+
+ The \texttt{index} key can be used to retrieve a particular literal from
+ this list; for example, by executing \verb!\RandomP[index=2]{\a}{d,p,s}!,
+ the value of \cs{a} is \texttt{p}.
+
+ The value of \texttt{index} can be any positive integer, even one generated
+ using \cs{RandomI}, or by another list. If the value of \texttt{index} is
+ greater than the number of items in the list, modular arithmetic is
+ performed to put the index back into the proper range.
+
+ When the \texttt{index} key is not present, a number is randomly selected
+ from the list.
+
+\item\1\cs{\meta{name}} is the name of the literal generated.
+
+\item\1\meta{list of literals} is a comma-delimited list of literal
+ strings, selected literal is not interpreted as a number, but is passed
+ into the definition of \cs{\meta{name}}.
+\end{description}
+
+\paragraph*{Examples}
+
+\begin{enumerate}
+ \item Executing \verb!\RandomP{\a}{1+16,\cos(\pi),%!\\
+ \verb! \frac{d}{dx}\frac{1}{2}x^2,{\int \cos(x)\,dx}}!\\
+ \verb!$\texttt{\string\a} = \a$!, we get
+ \RandomP[index=5]{\a}{1+16,\cos(\pi),\frac{d}{dx}\frac{1}{2}x^2}%
+ $\texttt{\string\a} = \a $, and then again,
+ \RandomP{\a}{1+16,\cos(\pi),\frac{d}{dx}\frac{1}{2}x^2}%
+ $ \texttt{\string\a} = \a $.
+ \item Use \cs{RandomI} with \cs{RandomP}. You can create a series
+ of questions and answers using these two:
+\begin{Verbatim}[fontsize=\small]
+\RandomI{\indx}{5}
+\RandomP[index=\indx]{\q}{1+16,\cos(\pi),\pi\sin(\pi),%
+ \frac{d}{dx}\frac{1}{2}x^2,{\int \cos(x)\,dx}}
+\RandomP[index=\indx]{\a}{17,-1,0,x,\sin(x)+C}
+\begin{equation*}
+ \q = \a
+\end{equation*}
+\end{Verbatim}
+
+\RandomI{\indx}{5}
+%\typeout{index=\iOf{\indx}}%
+\RandomP[index=\indx]{\q}{1+16,\cos(\pi),\pi\sin(\pi),\frac{d}{dx}\frac{1}{2}x^2,{\int \cos(x)\,dx}}
+\RandomP[index=\indx]{\a}{17,-1,0,x,\sin(x)+C}
+
+The execution of these lines becomes
+\begin{equation*}
+ \q = \a
+\end{equation*}
+You can create a switch to include the answer or not.
+
+\item There is an alternate approach to this previous example.
+Random lists (\cs{RandomL} and \cs{RandomP}) define a macro \cs{iOf},
+the value of which is the index of the item selected (at random).
+We can use \cs{iOf} in the above problem as follows:
+\begin{Verbatim}[fontsize=\small]
+\RandomP{\q}{1+16,\cos(\pi),\pi\sin(\pi),%
+ \displaystyle\frac{d}{dx}\frac{1}{2}x^2,%
+ {\int \cos(x)\,dx}}
+\RandomP[index=\iOf{\q}]{\a}{17,-1,0,x,\sin(x)+C}
+\begin{equation*}
+ \q = \a
+\end{equation*}
+\end{Verbatim}
+The execution of these lines gives the output\dots
+\RandomP{\q}{1+16,\cos(\pi),\pi\sin(\pi),%
+ \displaystyle\frac{d}{dx}\frac{1}{2}x^2,{\int \cos(x)\,dx}}
+\RandomP[index=\iOf{\q}]{\a}{17,-1,0,x,\sin(x)+C}
+\begin{equation*}
+ \q = \a
+\end{equation*}
+Here, we select the answer to the randomly chosen question.
+\end{enumerate}
+
+\subsection{\texorpdfstring{\protect\cs{RandomS}}{\CMD{RandomS}}}
+
+The command \cs{RandomS} generates a random sign, either \texttt{+}
+or \texttt{-}. This may be useful for creating addition/subtraction
+problems.
+
+\takeMeasure{\string\RandomS[\meta{dec}]\darg{\cs{\meta{name}}}}%
+\begin{dCmd*}[commandchars=!()]{\bxSize}
+\RandomS[!meta(dec)]{!cs(!meta(name))}
+\end{dCmd*}
+
+\PD
+\begin{description}\def\1{\hspace{-\labelsep}}
+
+\item\1\meta{dec} is a number between 0 and 1. This command generates a
+ \texttt{+} sign with probability \meta{dec}. The default value is
+ 0.5.
+
+\item\1\cs{\meta{name}} is the name that references the generated random sign.
+
+\end{description}
+
+\paragraph*{Examples}
+
+\begin{enumerate}
+ \item Random addition problem:
+\begin{Verbatim}
+\RandomZ{\a}{1}{20}\RandomZ{\b}{1}{20}\RandomS{\s}
+\begin{equation*}
+ \a \s \b
+\end{equation*}
+\end{Verbatim}
+
+\RandomZ{\a}{1}{20}\RandomZ{\b}{1}{20}\RandomS{\s}
+
+This code expands to
+\begin{equation*}
+ \a \s \b
+\end{equation*}
+Whether we add or subtract the summands is determined by the command \cs{s}.
+
+\item Random Differentiation problem:
+\begin{Verbatim}
+\RandomQ{\a}[8]{1}{2}\RandomQ{\b}[8]{2}{3}
+\RandomZ{\n}{1}{6}\RandomS{\si}\RandomS{\sii}
+
+Differentiate
+\begin{equation*}
+ \frac{d}{dx}(\bigl (\a) \si (\b) x^{\sii\n}\bigr)
+\end{equation*}
+\end{Verbatim}
+
+\RandomQ{\a}[8]{1}{2}\RandomQ{\b}[8]{2}{3}
+\RandomZ{\n}{1}{6}\RandomS{\si}\RandomS{\sii}
+
+Differentiate
+\begin{equation*}
+ \frac{d}{dx}\bigl( (\a) \si (\b) x^{\sii\n}\bigr)
+\end{equation*}
+\end{enumerate}
+
+\subsection{Commands that Operate on Numbers}
+
+Associated with each data type (integer, rational, and real) are several
+useful commands \cs{nOf}, \cs{dOf}, \cs{iOf}, \cs{fmt}, and \cs{ds}.
+
+\subsubsection{\texorpdfstring{\protect\cs{nOf} and \protect\cs{dOf}}{\CMD{nOf} and \CMD{dOf}}}
+
+For integer, rational, and real numbers \cs{nOf} and \cs{dOf} are
+the numerator and denominator, respectively.
+\begin{itemize}
+ \item Integer: \cs{nOf} is the integer, and \cs{dOf} is 1; for example,
+ define an integer by \verb!\RandomZ{\a}{-5}{5}!,\RandomZ{\a}{-5}{5} \cs{a}=\a,
+ \verb!\nOf{\a}!=\nOf{\a}, \verb!\dOf{\a}!=\dOf{\a}, as advertised.
+
+ \item Rational: \cs{nOf} is the numerator (an integer), and \cs{dOf} is the
+ denominator (an integer) of the reduced fraction. For example, define \cs{a} by
+ \verb!\RandomQ[ne=0]{\a}[9]{-3/2}{3/2}!,\RandomQ[ne=0]{\a}[9]{-3/2}{3/2} then
+ \begin{equation*}
+ \cs{a}=\a,\ \verb!\nOf{\a}!=\nOf{\a},\ \text{and}\ \verb!\dOf{\a}!=\dOf{\a}.
+ \end{equation*}
+ \item Real: \cs{nOf} is the numerator (an integer), and \cs{dOf} is the
+ denominator (an integer) of the reduced fraction, after the real is converted
+ into a rational number. For example, \verb!\RandomR{\a}{.25}{.75}!,\RandomR{\a}{.25}{.75}
+ then
+ \begin{equation*}
+ \cs{a}=\a,\ \verb!\nOf{\a}!=\nOf{\a},\ \text{and}\ \verb!\dOf{\a}!=\dOf{\a}
+ \end{equation*}
+ If we round using with \verb!\RandomR[round=2]{\a}{.25}{.75}!, we get
+ \begin{equation*}
+ \RandomR[round=2]{\a}{.25}{.75}\cs{a}=\a,\ \verb!\nOf{\a}!=\nOf{\a},\ \text{and}\ \verb!\dOf{\a}!=\dOf{\a}
+ \end{equation*}
+% \cs{a}=\a, \verb!\nOf{\a}!=\nOf{\a}, and \verb!\dOf{\a}!=\dOf{\a}
+\end{itemize}
+
+
+\subsubsection{Special Formatting Commands: The \texorpdfstring{\protect\cs{ds}}{\CMD{ds}}
+and \texorpdfstring{\protect\cs{fmt}}{\CMD{fmt}} families}
+
+When a RV, such as \cs{a}, is a rational number type, say \cs{a}=1/3, the command \cs{a} expands
+to 1/3. To get a display style formatting of the rational use the \Com{ds} command.
+The expansion of \texttt{\$\cs{ds}\cs{a}\$} is $\frac13$.
+
+We have seen in several examples in which the formatting was not always what we'd like.
+Expressions like $x^{1}$ should be $x$, $1x$ should be $x$, $-1x$ should be $-x$.
+The formatting commands \cs{cfmt} and \cs{efmt} (and their display style counterparts
+\cs{cds} and \cs{eds}) attempt to format the special cases of 1 and -1, as they appear
+in an exponent (the `e' variations) and as they appear as a coefficient (the `c' variations).
+
+All the formatting commands \cs{cfmt}, \cs{efmt}, \cs{ds}, \cs{cds}, and
+\cs{eds} take a RV as its argument.
+\cs{\meta{\upshape{c|e}}fmt}|\cs{\meta{\upshape{c|e}}ds}\cs{a} expands to
+\cs{a} when \cs{a} is not 1 or -1. These cases are covered below.
+
+\begin{itemize}
+ \item For \cs{a}=1,
+ \cs{cfmt}\cs{a}=\cs{efmt}\cs{a}=\cs{cds}\cs{a}=\cs{eds}\cs{a}=\darg{},
+ the empty string. Thus, \defineZ{\a}{1}if \cs{a}=\a, and we typeset
+ \verb!$\a x^{\a}$!, we get $\a x^{\a}$, which is not the standard
+ way of writing this expression, but if we typeset \verb!$\cfmt\a x^{\efmt\a}$! we get $\cfmt\a x^{\efmt\a}$, which is correct.
+ Notice that we used \cs{cfmt} on the baseline, and \cs{efmt} in the
+ exponent. It does not make any difference here, but it does if
+ \cs{a}=-1, see the next bullet point.
+
+ \item \cs{a}=-1, then
+ \begin{align*}
+ &\cs{cfmt}\cs{a}=\cs{cds}\cs{a}=\texttt{-}\quad\text{(minus sign)}\\
+ &\cs{efmt}\cs{a}=\cs{eds}\cs{a}=\texttt{-1}\quad\text{(minus one)}
+ \end{align*}
+ Returning to the same expression in the previous bullet, if
+ \defineZ{\a}{-1}\cs{a}=\a, and we typeset
+ \verb!$\a x^{\a}$!, we get $\a x^{\a}$, which is not the standard way
+ of writing this expression, but, on the other hand, if we typeset
+ \verb!$\cfmt\ax^{\efmt\a}$! we get $\cfmt\a x^{\efmt\a}$, which is correct. Notice
+ the difference cases if I had typeset \verb!$\cfmt\a x^{\cfmt\a}$!, I
+ would have gotten $\cfmt\a x^{\cfmt\a}$, not good.
+
+ The `c'-variation is used for unitary signs, not binary signs. For example,
+ \defineZ{\a}{-1}, if \cs{a}=\a, and we typeset \verb!$2 + \cfmt\a x$!, we get
+ $2 + \cfmt\a x$, which may be fine is some situations, but most of the time
+ it is not. As a work around, make coefficients positive, and generate a random sign
+ using \cs{RandomS}; for example, after declaring
+\begin{Verbatim}
+\RandomS{\s}\RandomZ{\a}{1}{3}
+\end{Verbatim}
+ and typeseting \verb!$2 \s \cfmt\a x$!, we get an addition half the
+ time and subtraction the other half: \RandomS{\s}\RandomZ{\a}{1}{3}$2
+ \s \cfmt\a x$, \RandomS{\s}\RandomZ{\a}{1}{3}$2 \s \cfmt\a x$,
+ \RandomS{\s}\RandomZ{\a}{1}{3}$2 \s \cfmt\a x$,
+ \RandomS{\s}\RandomZ{\a}{1}{3}$2 \s \cfmt\a x$,
+ \RandomS{\s}\RandomZ{\a}{1}{3}$2 \s \cfmt\a x$,
+ \RandomS{\s}\RandomZ{\a}{1}{3}$2 \s \cfmt\a x$.
+
+ Similarly, the `e'-variation is for unitary sign in the exponent, and
+ should be used when there is a need for these special format rules.
+
+ \item Random Sign: The formatting commands are defined for a random sign
+ created by \cs{RandomS} and following the same definitions outline
+ above. These are of marginal value in this context.
+% \item[] \verb!\RandomL{\a}{-1,1}\RandomS{\s}$\a \s x^{\efmt\s x}$! yields the
+% expression \RandomL{\a}{-1,1}\RandomS{\s}$\a \s e^{\efmt\a x}$
+\end{itemize}
+
+\subsubsection{Getting the Data type with \texorpdfstring{\protect\cs{typeOf}}{\CMD{typeOf}}}
+
+There may be occasions where you want to know the data type of a RV. The \pkg{rangen}
+does change the data type in special cases. For example, if \cs{a} is created by
+\verb~\cs{RandomQ}{\a}[2]{1}{3}~, and its value happens to be an integer, \pkg{rangen}
+changes its type of integer. You can determine the type of a RV with the \cs{typeOf}
+command, which takes a RV as its argument, the value of \cs{typeOf} is a nonnegative integer. The following table gives
+the values of \cs{typeOf}, and associated data types.
+\begin{flushleft}
+\hspace{\amtIndent}\begin{tabular}{lc}
+Data type & \cs{typeOf}\\\hline
+Integer & 0 \\
+Rational & 1 \\
+Real & 2 \\
+Literal & 3
+\end{tabular}
+\end{flushleft}
+
+\paragraph*{A suggested application to \cs{typeOf}.} Suppose, \cs{a} is a rational RV
+(for example, \verb!\RandomQ{\a}[2]{1}{3}!), and we want to typeset the
+expression \verb!$\cfmt\a x$!. One instance might be
+\defineQ{\a}{3}{2}$\cfmt\a x$, this is not good syntax; so we typeset
+\verb!$(\cfmt\a) x$! to get $(\cfmt\a) x$, that's good. But if \cs{a} is an
+integer, such as 1, 2, or 3, we get \defineQ{\a}{2}{1}$(\cfmt\a) x$, which
+contains redundant parentheses. Now we come to the use of \cs{typeof}. We now
+typeset the expression
+\begin{Verbatim}
+$ \ifnum\typeOf\a=0\relax\cfmt\a\else(\cfmt\a)\fi x $
+\end{Verbatim}
+If \cs{a} is \emph{not an integer} we get, \defineQ{\a}{3}{2}for \cs{a}=\a, we obtain
+$\ifnum\typeOf\a=0\relax\cfmt\a\else(\cfmt\a)\fi x$, but for
+\defineQ{\a}{2}{1}for \cs{a}=\a, we get
+$\ifnum\typeOf\a=0\relax\cfmt\a\else(\cfmt\a)\fi x$.
+
+\subsection{\texorpdfstring{\protect\cs{defineZ}}{\CMD{defineZ}},
+\texorpdfstring{\protect\cs{defineQ}}{\CMD{defineQ}}, and
+\texorpdfstring{\protect\cs{defineR}}{\CMD{defineR}}}
+
+The \pkg{rangen} package internally uses \cs{defineZ}, \cs{defineQ},
+and \cs{defineR} to define an integer, a rational number, and a real (decimal) number.
+These command may be used by the document author as well to create non-random variables.
+
+\takeMeasure{\string\defineQ\darg{\cs{\meta{name}}}\darg{\meta{zNumer}}\darg{\meta{zDenom}}}%
+\begin{dCmd*}[commandchars=!()]{\bxSize}
+\defineZ{!cs(!meta(name))}{!meta(zValue)}
+\defineQ{!cs(!meta(name))}{!meta(zNumer)}{!meta(zDenom)}
+\defineR{!cs(!meta(name))}{!meta(rValue)}
+\end{dCmd*}
+Thus, \verb!\defineZ{\a}{17}!\defineZ{\a}{17} defines \cs{a}=\a, \verb!\defineQ{\a}{-3}{2}!
+\defineQ{\a}{-3}{2} defines \cs{a}=\a, and \verb!\defineR{\a}{17.88}!\defineR{\a}{17.88} defines
+\cs{a}=\a.
+
+The various properties data types are created by \cs{defineZ}, \cs{defineQ},
+and \cs{defineR}; these are \cs{nOf}, \cs{dOf}, \cs{typeOf}, \cs{ds}, \cs{eds},
+\cs{cds}, \cs{efmt}, and \cs{cfmt}.
+
+\newtopic\noindent
+The following are other important points to remember.
+\begin{itemize}
+\item \textbf{Positive Denominators.} Notice that if \verb!\defineQ{\a}{3}{-2}!,\defineQ{\a}{3}{-2} then \cs{a}=\a, and
+\cs{nOf}\cs{a}=\nOf\a, and \cs{dOf}\cs{a}=\dOf\a. Thus, \pkg{rangen} does not allow a
+negative denominator.
+
+\item \textbf{Automatic Reduction.} If we declare
+ \verb!\defineQ{\a}{6}{4}!,\defineQ{\a}{6}{4} then \cs{a}=\a, a rational
+ number is automatically reduced to lowest terms.
+
+\item \textbf{Re-classification.} If we make the definition \verb!\defineQ{\a}{6}{2}!,\defineQ{\a}{6}{2} then \cs{a}={\a} is reduced
+to lowest terms and re-classified as an integer \cs{typeOf}\cs{a}=\typeOf\a~(an integer).
+\end{itemize}
+
+\section{\textsf{rangen} and \textsf{fp}}
+
+After a little bit of testing, it appears that \textsf{fp} can work with the \texttt{rangen} package.
+The \texttt{rangen} package does not provide any command for combining RVs using such operations
+as addition, subtraction, multiplication, division, etc.
+
+The \texttt{rangen} package package does provide several useful commands that \textsf{fp} does not,
+these are \cs{reduceFrac}, \cs{gcd}, and \cs{lcm}.
+
+\Com{reduceFrac} takes two arguments (numerator and denominator), both integers, and attempts to reduce the implied fraction
+to lowest terms, and returns the result in two macros \cs{rfNumer} and \cs{rfDenom}. For example,
+to reduce the fraction $4/12$, we execute \verb!\reduceFrac{4}{12}!, which returns\reduceFrac{4}{12} \cs{rfNumer}=\rfNumer, and
+\cs{rfDenom}=\rfDenom, forming the reduced fraction $\rfNumer/\rfDenom$; thus,
+$4/12 = \rfNumer/\rfDenom$.
+
+The \emph{greatest common divisor} command \cs{gcd} takes two integers as its arguments
+and returns its result in the macro \cs{thegcd}. For example, the \verb!\gcd{4,8}! is
+\gcd{4}{8}\thegcd, while the \verb!\gcd{4}{6}! is \gcd{4}{6}\thegcd.
+
+The \emph{least common multiple} command \cs{lcd} takes two integers as its arguments,
+and returns its result in the macro \cs{thelcd}. For example, \verb!\lcm{4}{5}! is
+\lcm{4}{5}\cs{thelcm}=\thelcm, while, \verb!\lcm{4}{6}! is \lcm{4}{6}\cs{thelcm}=\thelcm.
+
+The following example illustrates the use of the \texttt{rangen} and \texttt{fp} packages to pose a random
+arithmetic problem, and present a detailed solution.
+\begin{Verbatim}[fontsize=\footnotesize]
+\RandomQ{\a}[6]{2}{4}\RandomQ{\b}[6]{2}{4}
+\gcd{\dOf\a}{\dOf\b}
+\FPeval\lcd{clip((\dOf\a)*(\dOf\b)/\thegcd)}
+\FPeval\si{clip(\lcd/(\dOf\a))}
+\FPeval\sii{clip(\lcd/(\dOf\b))}
+\FPeval\finalnum{clip((\si)*(\nOf\a)+(\sii)*(\nOf\b))}
+\defineQ{\ans}{\finalnum}{\lcd}
+$$
+ \ds\a \thisop \ds\b = \frac{(\si)(\nOf\a)+(\sii)(\nOf\b)}{\lcd}
+ = \frac{\finalnum}{\lcd}\ifnum\lcd=\dOf\ans\else =\ds\ans\fi
+$$
+\end{Verbatim}
+An instance of this code might look like this:
+$$
+ \frac{8}{3}+\frac{17}{6}=\frac{(2)(8)+(1)(17)}{6}=\frac{33}{6}=\frac{11}{2}
+$$
+If there is any reduction of the fraction (brought on by the \cs{defineQ} command),
+this additional expression is included.
+
+\paragraph*{Demo file.}
+See the demo file \texttt{rangen\_fp.tex} for a complete example.
+
+\section{\textsf{rangen} and \textsf{exerquiz}}
+
+Developing a package for randomly generating numbers that could be
+used as a basis for creating random quizzes (see the example back in
+\hyperref[s:intro]{Section~\ref*{s:intro}}, page~\pageref*{s:intro})
+was my original motivation for writing the original package back in
+the year 2000 AD. In this section, we introduce the techniques that
+I've developed for creating random quizzes, and, more importantly,
+how to grade them and to exhibit to the user the correct answer.
+This system is not a computer algebra system, so, it is difficult,
+but not impossible to also supply a solution (a opposed to just the
+answer) to the problem as well.
+
+\paragraph*{Demo file.} Now, let's see how its done! Examples of this section were taken from the
+demo file \texttt{rangen\_tst.tex}.
+
+\subsection{Creating Quizzes using \textsf{rangen}}
+
+
+The \pkg{rangen} package provides three JavaScript functions that are used with \textsf{exerquiz}
+quizzes, these are
+\begin{itemize}
+ \item \texttt{rEval(str)}: The function \texttt{rEval} evaluates its
+ argument. The \texttt{rEval} function searches its argument for
+ \texttt{rEval} and \texttt{rFrac}, and executes any inner nested
+ functions first.
+ \item \texttt{rFrac(str)}: Evaluates a rational number by evaluating
+ the value of the numerator and denominator separately. The function
+ \texttt{rFrac} searches its argument for \texttt{rEval} and
+ \texttt{rFrac}, and executes any inner nested functions first.
+ \item \texttt{rngCorrAnsButton}: A function that is used to represent
+ the correct answer to the user.
+\end{itemize}
+The best way of illustrating these function is by discussing an example or two.
+
+\renewcommand\titleQuizfmt{\bfseries\color{red}}
+\titleQuiz*{Example~1. }
+\begin{shortquiz}*[sq1] We create two RVs, \cs{a} and \cs{b} that are rational numbers. We want to
+add them, and present the answer as a rational number.
+\begin{Verbatim}[fontsize=\small]
+\RandomQ{\a}[16]{1/8}{15/16}\RandomQ[ne=\a]{\b}[16]{1/8}{15/16}
+\end{Verbatim}
+\begin{questions}
+\RandomQ{\a}[16]{1/8}{15/16}\RandomQ[ne=\a]{\b}[16]{1/8}{15/16}
+
+\item $\displaystyle\ds\a - \ds\b =
+ \RespBoxMath[\rectW{.5in}]{ (\nOf\a * \dOf\b - \nOf\b * \dOf\a )/( \dOf\a * \dOf\b ) }{2}{.0001}{[0,2]}[{priorParse: \Array(nodec,NoAddOrSub)}]$\hfill
+ \CorrAnsButton{rFrac( rEval( \nOf\a * \dOf\b - \nOf\b * \dOf\a )/rEval( \dOf\a * \dOf\b ) )}*{rngCorrAnsButton}\kern1bp\sqClearButton
+\end{questions}
+\end{shortquiz}
+\vskip-.5\baselineskip
+The question is posed using \cs{RespBoxMath}.
+\begin{Verbatim}[xleftmargin=20pt,numbers=left,fontsize=\small]
+$\displaystyle\ds\a - \ds\b =
+\RespBoxMath[\rectW{.5in}]{
+ (\nOf\a*\dOf\b-\nOf\b*\dOf\a)/(\dOf\a*\dOf\b)}
+ {2}{.0001}{[0,2]}
+ [{priorParse: \Array(nodec,NoAddOrSub)}]$
+\end{Verbatim}
+\textsf{Exerquiz} determines whether the user's answer is correct, it by evaluating
+the author's answer at randomly selected points. Exerquiz uses the floating point arithmetic
+of JavaScript to evaluate the user's answer. The author's correct answer is given
+in line (1), and it is just the formula for combining two fractions \cs{a} and \cs{b};
+note the use of \cs{nOf} and \cs{dOf}. Line~(2) is standard parameters for \cs{RespBoxMath},
+the number of random points to use, the precision, and the interval from which to select the
+points. Line~(3) specifies a couple of routines from the \textsf{dljslib} package, these
+prevent the user from using decimals and rational arithmetic to answer the question. (The latter
+function would, for example, prevent the user from copying the question and pasting it into the
+answer.)
+
+Now comes the most interesting part, at least to me: The presentation of the correct
+answer to the user. These is where the JavaScript functions \texttt{rEval} and \texttt{rFrac} are used.
+The code for the answer button is shown below.
+\begin{Verbatim}[xleftmargin=20pt,numbers=left,fontsize=\small]
+\CorrAnsButton{rFrac(
+ rEval(\nOf\a*\dOf\b-\nOf\b*\dOf\a)/rEval(\dOf\a*\dOf\b)
+)}*{rngCorrAnsButton}
+\end{Verbatim}
+Here, this code is broken across several lines to fit on the page. We direct the \cs{CorrAnsButton}
+to use the function \texttt{rngCorrAnsButton}, as seen in line~(3). This is a special function
+define by \pkg{rangen} to help in the presentation of the answer to the user.
+
+Keep in mind, the inner-most \texttt{rEval} and \texttt{rFrac}
+functions are evaluated first; consequently, the two \texttt{rEval}
+functions in line~(2) are evaluated first. These two evaluations
+calculate the numerator and denominator separately, this results in
+a numerical numerator and denominator. The function \texttt{rFrac}
+is then executed on the resulting rational number, this function
+reduces the fraction to lowers terms. This final calculation is what
+the user sees when the correct answer button is pressed.
+
+The next example will illustrate a decimal presentation of the answer, and introduces
+a new command, \Com{RNGprintf}.
+
+\titleQuiz*{Example~2. }
+\begin{shortquiz}*[sq2] We create four RVs, \cs{a}, \cs{b}, \cs{c}, and \cs{n}, three rational and one integer.
+The exponent of the power is rational, hence, we represent a decimal answer to the user.
+\begin{Verbatim}[fontsize=\small]
+\RandomQ{\a}[8]{1/4}{7/6}\RandomZ{\b}{1}{3}
+\RandomQ{\n}[8]{1/2}{3/2}\RandomZ[ne=\zZero]{\c}{-3}{3}
+\end{Verbatim}
+\begin{questions}\setcounter{eqquestionnoi}{1}
+\RandomQ{\a}[8]{1/4}{7/6}
+\RandomZ{\b}{1}{3}
+\RandomQ{\n}[8]{1/2}{3/2}
+\RandomZ[ne=\zZero]{\c}{-3}{3}
+
+\item $\displaystyle\int_{\a}^{\b} \cfmt\c x^{\efmt\n}\,dx =
+ \RespBoxMath{\c((\b)^(\n+1)-(\a)^(\n+1))/(\n+1)}{3}{.0001}{[0,2]}$\hfill
+ \CorrAnsButton{rEval(\c((\b)^(\n+1)-(\a)^(\n+1))/(\n+1))}*{rngCorrAnsButton\RNGprintf{\%.4f}}\kern1bp\sqClearButton
+\end{questions}
+\end{shortquiz}
+\vskip-.5\baselineskip
+The question is posed using \cs{RespBoxMath}.
+\begin{Verbatim}[xleftmargin=20pt,numbers=left,fontsize=\small]
+$\displaystyle\int_{\a}^{\b} \cfmt\c x^{\efmt\n}\,dx =
+ \RespBoxMath{\c((\b)^(\n+1)-(\a)^(\n+1))/(\n+1)}
+ {3}{.0001}{[0,2]}$
+\end{Verbatim}
+The correct answer is given on line~(2), and is based on the known form of the integrand; here,
+we use standard integration formulas.
+
+The code for the correct answer button has a new element in it
+\begin{Verbatim}[xleftmargin=20pt,numbers=left,fontsize=\small]
+\CorrAnsButton{rEval(
+ \c((\b)^(\n+1)-(\a)^(\n+1))/(\n+1)
+)}*{rngCorrAnsButton\RNGprintf{\%.4f}}}\kern1bp\sqTallyBox
+\end{Verbatim}
+The \texttt{rEval} function evaluates the expression on line~(2), the result
+is a decimal number. As before, we use the \texttt{rngCorrAnsButton}, but we've
+added the \Com{RNGprintf} command to the end of the function name. This is a kludge
+that I've developed to be able to format a numerical answer. The \cs{RNGprintf} command
+uses the Acrobat JavaScript function \texttt{util.printf}. The argument of \cs{RNGprintf}
+is passed to \texttt{util.printf} as its formatting string. Here, we use
+\verb!\%.4f!, so the number is presented as a floating point number with four decimal places.
+See the documentation of \texttt{util.printf} in the \textsl{JavaScript for Acrobat API Reference.}\footnote
+{\url{{http://livedocs.adobe.com/acrobat_sdk/9/Acrobat9_HTMLHelp}}}
+
+
+The final example it the one seen in \Nameref{s:intro}, it uses another new command,
+\Com{defineDepQJS}. This command is used to define a new RV as a rational function of other RVs,
+and to define special JavaScript formatting, \cs{js}. The results of this command are used
+exclusively for JavaScript, and are not meant to be typeset.
+
+\takeMeasure{\string\defineDepQJS\darg{\cs{\meta{name}}}%
+\darg{\meta{numer}}\darg{\meta{denom}}\darg{\meta{script}}}%
+\begin{dCmd*}[commandchars=!()]{\bxSize}
+\defineDepQJS{!cs(!meta(name))}{!meta(numer)}{!meta(denom)}{!meta(script)}
+\end{dCmd*}
+\noindent This function defines \cs{\meta{name}} to be
+\texttt{(\meta{numer})/(\meta{denom})}. The expression \meta{numer} and
+\meta{denom} can be functions of RV defined earlier. The $4^{\text{th}}$
+argument is JavaScript for evaluating \cs{\meta{name}}; \meta{script} is
+accessed by \cs{js\cs{\meta{name}}} and is used from within a
+\cs{CorrAnsButton}. The $4^{\text{th}}$ argument can include such
+commands as \cs{\meta{name}}, \cs{nOf}\cs{\meta{name}}, and
+\cs{dOf}\cs{\meta{name}}. An example will perhaps illustrate.
+
+\titleQuiz*{Example~3. }
+\begin{shortquiz}*[sq3] Find the equation of the line that passes through $P$ and $Q$.
+
+We begin by defining our variables:
+\begin{Verbatim}[xleftmargin=20pt,numbers=left,fontsize=\small]
+\RandomZ{\a}{-10}{9}\RandomZ{\b}{-10}{9}
+\RandomZ{\c}{\a*}{10}\RandomZ{\d}{\b*}{10}
+\defineDepQJS{\m}{\d - \b}{\c - \a}
+ {rFrac(rEval(\nOf\m)/rEval(\dOf\m))}
+\defineDepQJS{\yIntercept}{\b - \a*\m}{1}
+ {rFrac((rEval(\b*\dOf\m-\a*\nOf\m))/(rEval(\dOf\m)))}
+\end{Verbatim}
+Our big problem is to compute the slope of the line, \cs{m}. I define \cs{m}
+as using \cs{defineDepQJS}. The numerator and denominator are those in the
+slope calculation, given two points. The expansion of \cs{m} is
+\verb!(\d-\b)/(\c-\a)!, and the JavaScript will perform the arithmetic
+operations. The expression that is accessed with the \cs{js} is the fourth
+argument, line~(4); here, we calculate slope as a rational number. We make a
+similar definition for the \cs{yIntercept} of the line.
+
+Below are the two points \verb!$P(\a, \b)$! and \verb!$Q(\c, \d)$!.
+\begin{questions}\setcounter{eqquestionnoi}{2}
+\RandomZ{\a}{-10}{9}\RandomZ{\b}{-10}{9}
+\RandomZ{\c}{\a*}{10}\RandomZ{\d}{\b*}{10}
+\defineDepQJS{\m}{\d - \b}{\c - \a}{rFrac(rEval(\nOf\m)/rEval(\dOf\m))}
+\defineDepQJS{\yIntercept}{\b - \a*\m}{1}{rFrac((rEval( \b * \dOf\m - \a*\nOf\m ))/(rEval(\dOf\m)))}
+
+\item $P(\,\a, \b\,)$, $Q(\,\c, \d\,)$:
+ \RespBoxMath{y = \m*x + \yIntercept}(xy){3}{.0001}{[0,2]x[0,2]}*{ProcRespEq}\hfill
+ \CorrAnsButton{y = \js\m\space x + \js\yIntercept}*{rngCorrAnsButton}%
+ \kern1bp\sqClearButton
+\end{questions}
+\end{shortquiz}
+\vskip-.5\baselineskip
+The question is posed using \cs{RespBoxMath}.
+\begin{Verbatim}[xleftmargin=20pt,numbers=left,fontsize=\small]
+$P(\,\a, \b\,)$, $Q(\,\c, \d\,)$:
+ \RespBoxMath{y=\m*x + \yIntercept}(xy)
+ {3}{.0001}{[0,2]x[0,2]}*{ProcRespEq}
+\end{Verbatim}
+The answer is given in line~(2), and will be evaluated numerically, and compared numerically
+with the user's response.
+
+The code for the correct answer button has a new element in it
+\begin{Verbatim}[xleftmargin=20pt,numbers=left,fontsize=\small]
+\CorrAnsButton{y = \js\m\space x + \js\yIntercept}
+ *{rngCorrAnsButton}
+\end{Verbatim}
+The display of the answer is done using \cs{js}\cs{m} and
+\cs{js}\cs{yIntercept} to represent the slope and intercept as a rational
+number.
+
+Think of \cs{defineDepQJS} a convenient way of defining (JavaScript) expressions
+that will appear in \cs{RespBoxMath} and for \cs{CorrAnsButton}.
+
+\subsection{Creating Solutions to Random Quizzes}
+
+Writing a solution to a question that is based on a formula or template can be difficult.
+{\LaTeX} is not a computer algebra system, so the possibilities are limited. Still,
+\pkg{rangen} supplies the \texttt{writeRVsTo} environment to support a solution.
+
+\titleQuiz*{Example~4. }
+\begin{shortquiz}*[sq1] We create two RVs, \cs{a} and \cs{b} that are rational numbers. We want to
+add them, and present the answer as a rational number.
+\begin{Verbatim}[fontsize=\small]
+\begin{writeRVsTo}{quizzes}
+\RandomQ{\a}[16]{1/8}{15/16}\RandomQ[ne=\a]{\b}[16]{1/8}{15/16}
+\end{writeRVsTo}
+\end{Verbatim}
+We make that same definitions as in \textbf{\textcolor{red}{Example~1}}, but we enclose
+these definitions within the \texttt{writeRVsTo}. This environment writes its contents
+to the quiz solutions file, and also executes its contents. This way, the definitions are
+make both here, and just before the solution to this problem in the solutions file.
+\begin{questions}\setcounter{eqquestionnoi}{3}
+\begin{writeRVsTo}{quizzes}
+\RandomQ{\a}[16]{1/8}{15/16}\RandomQ[ne=\a]{\b}[16]{1/8}{15/16}
+\end{writeRVsTo}
+
+\item $\displaystyle\ds\a + \ds\b =
+ \RespBoxMath[\rectW{.5in}]{ (\nOf\a * \dOf\b + \nOf\b * \dOf\a )/( \dOf\a * \dOf\b ) }*{2}{.0001}{[0,2]}[{priorParse: \Array(nodec,NoAddOrSub)}]$\hfill
+ \CorrAnsButton{rFrac( rEval( \nOf\a * \dOf\b + \nOf\b * \dOf\a )/rEval( \dOf\a * \dOf\b ) )}*{rngCorrAnsButton}\kern1bp\sqClearButton
+\begin{solution}\relax\RNGadd\a\b\defineQ{\ans}{\rfNumer}{\rfDenom}%
+The solution to this problem is
+\begin{equation*}
+ \boxed{\ds\a + \ds\b = \ds\ans}
+\end{equation*}
+Did I forget to tell you that a simple command \cs{RNGadd} for adding two rational numbers
+is defined by \pkg{rangen}. Sorry about that! \dps
+\end{solution}
+\end{questions}
+\end{shortquiz}
+\vskip-.5\baselineskip
+The verbatim listing of this quiz is
+\begin{Verbatim}[fontsize=\footnotesize]
+\item $\displaystyle\ds\a + \ds\b =
+\RespBoxMath[\rectW{.5in}]{
+ (\nOf\a*\dOf\b+\nOf\b*\dOf\a)/(\dOf\a*\dOf\b)}*{2}
+ {.0001}{[0,2]}[{priorParse: \Array(nodec,NoAddOrSub)}]$\hfill
+\CorrAnsButton{rFrac(rEval(
+ \nOf\a * \dOf\b + \nOf\b * \dOf\a)/rEval(\dOf\a * \dOf\b))
+}*{rngCorrAnsButton}\kern1bp\sqClearButton
+\begin{solution}\relax\RNGadd\a\b\defineQ{\ans}{\rfNumer}{\rfDenom}%
+The solution to this problem is
+\begin{equation*}
+ \boxed{\ds\a - \ds\b = \ds\ans}
+\end{equation*}
+Did I forget to tell you that a simple command \cs{RNGadd}
+for adding two rational numbers is defined by
+\pkg{rangen}. Sorry about that! \dps
+\end{solution}
+\end{Verbatim}
+
+\newtopic\noindent
+The \texttt{writeRVsTo} has the following syntax
+
+\takeMeasure{\string\begin\darg{writeRVsTo}\darg{quizzes|exercises}}%
+\begin{dCmd*}[commandchars=!()]{\bxSize}
+\begin{writeRVsTo}{quizzes|exercises}
+ !meta(rangen commands creating RVs)
+\end{writeRVsTo}
+\end{dCmd*}
+The argument can be either the string \texttt{quizzes} or \texttt{exercises}. In the first case,
+the content of the environment is written to the solutions file for quizzes, and in the latter case,
+to the solutions file for the exercises.
+
+\bigskip
+
+That's all for now, I simply must get back to my retirement. \dps
+
+\end{document}