summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/counterz/counterz.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/counterz/counterz.dtx')
-rw-r--r--macros/latex/contrib/counterz/counterz.dtx960
1 files changed, 693 insertions, 267 deletions
diff --git a/macros/latex/contrib/counterz/counterz.dtx b/macros/latex/contrib/counterz/counterz.dtx
index 82857faf4c..2efbfa056d 100644
--- a/macros/latex/contrib/counterz/counterz.dtx
+++ b/macros/latex/contrib/counterz/counterz.dtx
@@ -7,7 +7,7 @@
%<*readme>
----------------------------------------------------------------------
-`counterz' --- 2023/05/19 Version 1.0.0
+`counterz' --- 2023/05/30 Version 1.1.0
Copyright (C) 2023 by Christopher McClain
E-mail: christopher.mcclain@mail.wvu.edu
@@ -38,7 +38,7 @@ random counters and save such counter values for future typesetting.
\preamble
----------------------------------------------------------------------
-`counterz' --- 2023/05/19 Version 1.0.0 Additional tools for counters
+`counterz' --- 2023/05/30 Version 1.1.0 Additional tools for counters
E-mail: christopher.mcclain@mail.wvu.edu
Released under the LaTeX Project Public License v1.3c or later
See https://www.latex-project.org/lppl.txt
@@ -110,11 +110,12 @@ and the derived files counterz.ins,
\newcounter,\newbool,\newwrite,\numexpr,\openout,\pdfuniformdeviate,
\providecounter,\ProvidesPackage,\relax,\renewcommand,
\RequirePackage,\Roman,\roman,\setcounter,\the,\unexpanded,\value,
- \whileboolexpr,\write}
+ \whileboolexpr,\write,\@ifnextchar,\ifltxcounter,\InputIfFileExists,
+ \m@k@gobbleendoptarg,\MessageBreak,\PackageError,\protect,\space,
+ \typein,\@typein}
\CodelineIndex
\RecordChanges
\begin{document}
- \newenvironment{codeoutput}{\newline\newline}{\newline\newline}
\DocInput{\jobname.dtx}
\end{document}
%</driver>
@@ -136,6 +137,7 @@ and the derived files counterz.ins,
%\maketitle
%
%\changes{v1.0.0}{2023/05/19}{First public release}
+%\changes{v1.1.0}{2023/05/30}{New and revised commands and error reports}
%
%
%\begin{abstract}
@@ -188,11 +190,12 @@ and the derived files counterz.ins,
%
%\subsection{Installation}
%
-% This package may be installed by copying the file \textsf{counterz.sty} to
-% your local texmf directory. The code and documentation may also be generated
-% from \textsf{\jobname.dtx}. Typesetting the documentation requires
-% the package \textsf{hypdoc} which is included in \TeX\ distributions and at
-% \href{http://www.ctan.org}{The Comprehensive TeX Archive Network}.
+% Run (pdf)\TeX{} on counterz.dtx to generate the file counterz.sty, and copy it
+% to your local texmf directory. To generate both the package file counterz.sty
+% and the documentation counterz.pdf, run (pdf)\LaTeX{} on counterz.dtx.
+% Typesetting the documentation requires the package \textsf{hypdoc} which is
+% included in \TeX\ distributions and at \href{http://www.ctan.org}
+% {The Comprehensive TeX Archive Network}.
%
%\section{User Guide}
%
@@ -202,57 +205,69 @@ and the derived files counterz.ins,
%\begin{verbatim}
%\usepackage{counterz}
%\end{verbatim}
+%
+% \noindent
% The package \textsf{counterz} loads the packages \textsf{etoolbox} and
% \textsf{makecmds}, both of which are included in \TeX\ distributions
% and at \href{http://www.ctan.org}{The Comprehensive TeX Archive Network}.
%
%\subsection{Counter Prefixes}
%
-%\DescribeMacro{\setcounterprefix}
-%\DescribeMacro{\clearcounterprefix}
% Counter prefixes are stored in an internal macro whose default value is an
-% empty string. The command \cs{setcounterprefix}\marg{prefix} is used to change
-% this value. For example, to change the prefix to \textit{PurpleMonkey}, use
+% empty string.
+%\DescribeMacro{\setcounterprefix}
+% The command \cs{setcounterprefix}\marg{prefix} is used to change this value.
+% For example, to change the prefix to \textit{PurpleMonkey}, use
+%
%\begin{verbatim}
%\setcounterprefix{PurpleMonkey}
%\end{verbatim}
+%
+% \noindent
% and to change it from \textit{PurpleMonkey} to \textit{Dishwasher}, use
+%
%\begin{verbatim}
%\setcounterprefix{Dishwasher}
%\end{verbatim}
-% The command \cs{clearcounterprefix} returns the prefix to its empty default:
-%\begin{verbatim}
-%\clearcounterprefix
-%\end{verbatim}
+%
+% \noindent
+%\DescribeMacro{\clearcounterprefix}
+% The command \cs{clearcounterprefix} returns the prefix to its empty default.
%
%\subsection{Manipulating Counters}
%
%\DescribeMacro{\xnewcounter}
-%\DescribeMacro{\xprovidecounter}
-%\DescribeMacro{\xsetcounter}
-%\DescribeMacro{\xaddtocounter}
-%\DescribeMacro{\xvalue}
% The command \cs{xnewcounter}\marg{countername} creates a counter with a
-% prefixed name. The command \cs{xsetcounter}\marg{countername}\marg{integer}
-% assigns the specified value to the counter with the prefixed name. For
-% example, suppose that the file \textsf{BoringFile1.tex} contains the
-% following:
+% prefixed name.
+%\DescribeMacro{\xsetcounter}
+% The command \cs{xsetcounter}\marg{countername}\marg{integer} assigns the
+% specified value to the counter with the prefixed name. For example, suppose
+% that the file \textsf{BoringFile1.tex} contains the following:
+%
%\begin{verbatim}
%\xnewcounter{bestcounterever}
%\xsetcounter{bestcounterever}{100}
%\end{verbatim}
+%
+% \noindent
% and suppose that the file \textsf{BoringFile2.tex} contains the following:
+%
%\begin{verbatim}
%\xnewcounter{bestcounterever}
%\xsetcounter{bestcounterever}{-29}
%\end{verbatim}
+%
+% \noindent
% and, finally, suppose that the file Main.tex contains (in part) the following:
+%
%\begin{verbatim}
%\setcounterprefix{PurpleMonkey}
%\input{BoringFile1}
%\setcounterprefix{Dishwasher}
%\input{BoringFile2}
%\end{verbatim}
+%
+% \noindent
% Then typesetting \textsf{Main.tex} will create a counter
% \textit{PurpleMonkeybestcounterever} with the value 100 and a counter
% \textit{Dishwasherbestcounterever} with the value $-29$. By using commands
@@ -263,9 +278,12 @@ and the derived files counterz.ins,
% in the file \textsf{Main.tex}. By changing prefixes, \textsf{Main.tex} can
% even input the same file multiple times without conflict.
%
+%\DescribeMacro{\xprovidecounter}
% The commands \cs{xprovidecounter}, \cs{xaddtocounter}, and \cs{xvalue} are
% likewise prefix versions of commands \cs{providecounter}, \cs{addtocounter},
+%\DescribeMacro{\xaddtocounter}
% and \cs{value}, respectively. When the prefix is empty, the commands expand
+%\DescribeMacro{\xvalue}
% like their standard counterparts. (Note: \cs{providecounter} defines a counter
% if it has not already been defined. See the documentation for the package
% \textsf{makecmds} for details.)
@@ -273,15 +291,17 @@ and the derived files counterz.ins,
%\subsection{Conditional Statements}
%
%\DescribeMacro{\ifctrequal}
-%\DescribeMacro{\ifctrless}
-%\DescribeMacro{\ifctrmore}
% The command \cs{ifctrequal}\marg{counter1}\marg{counter2}\marg{foo}\marg{bar}
% uses the command \cs{xvalue} to compare the values of the (prefixed) counters
% and then executes \meta{foo} if the values are equal and otherwise executes
-% \meta{bar}. The commands \cs{ifctrless} and \cs{ifctrmore} work analogously,
-% based on whether the value of prefixed \meta{counter1} is less than that of
-% of prefixed \meta{counter2} or more than that of prefixed \meta{counter2},
-% respectively. Consider the example code
+% \meta{bar}. The commands
+%\DescribeMacro{\ifctrless}
+% \cs{ifctrless} and \cs{ifctrmore} work analogously, based on whether the value
+% of prefixed \meta{counter1} is less than that of of prefixed \meta{counter2}
+%\DescribeMacro{\ifctrmore}
+% or more than that of prefixed \meta{counter2}, respectively. Consider the
+% example code
+%
%\begin{verbatim}
%\setcounterprefix{TigerTiger}
%\xnewcounter{Small}
@@ -292,8 +312,11 @@ and the derived files counterz.ins,
%\ifctrless{Small}{Large}{March}{April}
%\ifctrmore{Small}{Large}{May}{June}
%\end{verbatim}
+%
+% \noindent
% which produces the output
-% \begin{codeoutput}
+%
+% \bigskip
%\setcounterprefix{TigerTiger}
%\xnewcounter{Small}
%\xsetcounter{Small}{7}
@@ -302,18 +325,21 @@ and the derived files counterz.ins,
%\ifctrequal{Small}{Large}{January}{February}
%\ifctrless{Small}{Large}{March}{April}
%\ifctrmore{Small}{Large}{May}{June}
-% \end{codeoutput}
+%
+% \bigskip
+% \noindent
% because the value of the counter \textit{TigerTigerSmall} is 7 which is less
% than 11, the value of the counter \textit{TigerTigerLarge}.
%
%\DescribeMacro{\ifctrzero}
-%\DescribeMacro{\ifctrneg}
-%\DescribeMacro{\ifctrpos}
% The command \cs{ifctrzero}\marg{counter}\marg{foo}\marg{bar} executes
% \meta{foo} if the value of the (prefixed) counter is zero and otherwise
-% executes \meta{bar}. The commands \cs{ifctrneg} and \cs{ifctrpos} work
-% analogously based on whether the value is negative or positive, respectively.
-% The example code
+% executes \meta{bar}. The commands
+%\DescribeMacro{\ifctrneg}
+% \cs{ifctrneg} and \cs{ifctrpos} work analogously based on whether the value
+%\DescribeMacro{\ifctrpos}
+% is negative or positive, respectively. The example code
+%
%\begin{verbatim}
%\setcounterprefix{TigerTiger}
%\xprovidecounter{Small}
@@ -322,54 +348,72 @@ and the derived files counterz.ins,
%\ifctrneg{Small}{March}{April}
%\ifctrpos{Small}{May}{June}
%\end{verbatim}
+%
+% \noindent
% produces the output
-% \begin{codeoutput}
+%
+% \bigskip
%\setcounterprefix{TigerTiger}
%\xprovidecounter{Small}
%\xsetcounter{Small}{7}
%\ifctrzero{Small}{January}{February}
%\ifctrneg{Small}{March}{April}
%\ifctrpos{Small}{May}{June}
-% \end{codeoutput}
+%
+% \bigskip
+% \noindent
% because the value of the counter \textit{TigerTigerSmall} is 7 which is
% positive (and thus nonzero, as well).
%
%\subsection{Displaying Counters}
%
%\DescribeMacro{\xarabic}
+% The command \cs{xarabic}\marg{counter} is simply a prefix version of the
+% standard display command \cs{arabic}.
%\DescribeMacro{\xroman}
+% The commands \cs{xroman}, \cs{xRoman}, \cs{xalph}, \cs{xAlph}, and
%\DescribeMacro{\xRoman}
+% \cs{xfnsymbol} are likewise prefix versions of the standard display commands
%\DescribeMacro{\xalph}
+% \cs{roman}, \cs{Roman}, \cs{alph}, \cs{Alph}, and \cs{fnsymbol}, inheriting
+% the restrictions of their
%\DescribeMacro{\xAlph}
+% parent commands.
+%
%\DescribeMacro{\xfnsymbol}
-% The command \cs{xarabic}\marg{counter} is simply a prefix version of the
-% standard display command \cs{arabic}. The commands \cs{xroman}, \cs{xRoman},
-% \cs{xalph}, \cs{xAlph}, and \cs{xfnsymbol} are likewise prefix versions of
-% the standard display commands \cs{roman}, \cs{Roman}, \cs{alph}, \cs{Alph},
-% and \cs{fnsymbol}, inheriting the restrictions of their parent commands.
% Note that the code
+%
%\begin{verbatim}
%\setcounterprefix{Sneaky}
%\xprovidecounter{Pete}
%\xsetcounter{Pete}{42}
%\arabic{Pete}
%\end{verbatim}
+%
+% \noindent
% produces an error because the counter \textit{Pete} is not defined, but the
% code
+%
%\begin{verbatim}
%\setcounterprefix{Sneaky}
%\xprovidecounter{Pete}
%\xsetcounter{Pete}{42}
%\xarabic{Pete}
%\end{verbatim}
+%
+% \noindent
% produces the output
-% \begin{codeoutput}
+%
+% \bigskip
%\setcounterprefix{Sneaky}
%\xprovidecounter{Pete}
%\xsetcounter{Pete}{42}
%\xarabic{Pete}
-% \end{codeoutput}
+%
+% \bigskip
+% \noindent
% which is the value of the counter \textit{SneakyPete}. The code
+%
%\begin{verbatim}
%\setcounterprefix{Sneaky}
%\xprovidecounter{Pete}
@@ -377,6 +421,8 @@ and the derived files counterz.ins,
%\clearcounterprefix
%\xarabic{Pete}
%\end{verbatim}
+%
+% \noindent
% also generates error because the final line is trying to use the
% undefined counter \textit{Pete} after the prefix was returned to its
% default value.
@@ -385,6 +431,7 @@ and the derived files counterz.ins,
% \textsf{counterz} defines some variants of \cs{xarabic} that are useful in
% the display of mathematical expressions. For example, consider the following
% code:
+%
%\begin{verbatim}
%\xprovidecounter{a}
%\xsetcounter{a}{5}
@@ -394,8 +441,11 @@ and the derived files counterz.ins,
%\xsetcounter{c}{-7}
%$\xarabic{a}+\xarabic{b}+\xarabic{c}$
%\end{verbatim}
+%
+% \noindent
% which produces
-% \begin{codeoutput}
+%
+% \bigskip
%\xprovidecounter{a}
%\xsetcounter{a}{5}
%\xprovidecounter{b}
@@ -403,81 +453,109 @@ and the derived files counterz.ins,
%\xprovidecounter{c}
%\xsetcounter{c}{-7}
%$\xarabic{a}+\xarabic{b}+\xarabic{c}$
-% \end{codeoutput}
-% Using \cs{arabicx} causes the expression to
-% contain the consecutive pair $+-$. The command
+%
+% \bigskip
+% \noindent
+% Using \cs{arabicx} causes the expression to contain the consecutive pair $+-$.
+% The command \cs{xsigned}\marg{counter} is like \cs{xarabic} except that
%\DescribeMacro{\xsigned}
-% \cs{xsigned}\marg{counter} is like \cs{xarabic} except that nonnegative values
-% are preceded by a plus sign ``+''. The code
+% nonnegative values are preceded by a plus sign ``+''. The code
+%
%\begin{verbatim}
%$\xarabic{a}\xsigned{b}\xsigned{c}$
%\end{verbatim}
+%
+% \noindent
% produces
-% \begin{codeoutput}
+%
+% \bigskip
%$\xarabic{a}\xsigned{b}\xsigned{c}$
-% \end{codeoutput}
+%
+% \bigskip
+% \noindent
% If we wish to suppress the $0$, we can instead use the command
%\DescribeMacro{\xsignednz}
-%\DescribeMacro{\xarabicnz}
% \cs{xsignednz}\marg{counter} which is a nonzero version of \cs{xsigned} and,
% if desired or necessary, the command \cs{xarabicnz}\marg{counter} which is a
-% nonzero version of \cs{xarabic}.
-% The code
+%\DescribeMacro{\xarabicnz}
+% nonzero version of \cs{xarabic}. The code
+%
%\begin{verbatim}
%$\xarabicnz{a}\xsignednz{b}\xsignednz{c}$
%\end{verbatim}
+%
+% \noindent
% produces
-% \begin{codeoutput}
+%
+% \bigskip
%$\xarabicnz{a}\xsignednz{b}\xsignednz{c}$
-% \end{codeoutput}
+%
+% \bigskip
+% \noindent
%\DescribeMacro{\xnegof}
+% The command \cs{xnegof}\marg{counter} displays the negative of \meta{counter}.
+% The command \cs{xnegofnz} does the same except that it suppresses the number
%\DescribeMacro{\xnegofnz}
+% zero. The command \cs{xnegsigned} includes the appropriate signs of plus ``+''
%\DescribeMacro{\xnegsigned}
+% and minus ``-'' (assigning a minus to zero in this case).
%\DescribeMacro{\xnegsignednz}
-% The package also contains variants of these commands for displaying the
-% negatives of counters, as demonstrated by the following code:
+% Finally, the command \cs{xnegsignednz} does the same except that it suppresses
+% the number zero., as demonstrated by the following code:
+%
%\begin{verbatim}
%\xprovidecounter{d}
%\xsetcounter{d}{-2}
-%$\xarabic{a}\xsigned{b}\xsigned{c}=\xarabic{d}$\\
-%$\xnegof{d}=\xnegof{a}\xnegsigned{b}\xnegsigned{c}$\\
+%
+%$\xarabic{a}\xsigned{b}\xsigned{c}=\xarabic{d}$
+%
+%$\xnegof{d}=\xnegof{a}\xnegsigned{b}\xnegsigned{c}$
+%
%$\xnegofnz{d}=\xnegofnz{a}\xnegsignednz{b}\xnegsignednz{c}$
%\end{verbatim}
+%
+% \noindent
% which produces
-%\begin{codeoutput}
+%
+% \bigskip
%\xprovidecounter{d}
%\xsetcounter{d}{-2}
-%$\xarabic{a}\xsigned{b}\xsigned{c}=\xarabic{d}$\\
-%$\xnegof{d}=\xnegof{a}\xnegsigned{b}\xnegsigned{c}$\\
+%
+%$\xarabic{a}\xsigned{b}\xsigned{c}=\xarabic{d}$
+%
+%$\xnegof{d}=\xnegof{a}\xnegsigned{b}\xnegsigned{c}$
+%
%$\xnegofnz{d}=\xnegofnz{a}\xnegsignednz{b}\xnegsignednz{c}$
-%\end{codeoutput}
+%
+% \bigskip
% The preceding commands for displaying values related to counters were created
% by using some other commands that we make available in case they prove useful.
%\DescribeMacro{\xabsof}
-%\DescribeMacro{\xsignof}
-%\DescribeMacro{\xnegsignof}
% The command \cs{xabsof}\marg{counter} prints the absolute value of
% \meta{counter}. The command \cs{xsignof}\marg{counter} prints a minus sign
+%\DescribeMacro{\xsignof}
% ``-'' if \meta{counter} is negative and otherwise prints a plus sign ``+''.
% (Note that the latter case includes the value zero.) The command
+%\DescribeMacro{\xnegsignof}
% \cs{xnegsignof}\marg{counter} prints a plus sign ``+'' if \meta{counter} is
-% negative and otherwise prints a minus sign ``-''. (Note that the former case
+% negative and otherwise prints a minus sign ``-''. (Note that the latter case
% includes the value zero.)
%
% Additional variants of these commands suppress certain output, as is
% conventional when using integers as coefficients in algebraic expressions.
-%\DescribeMacro{\xabsofcoef}
-%\DescribeMacro{\xsignofcoef}
-%\DescribeMacro{\xnegsignofcoef}
% The command \cs{xabsofcoef}\marg{counter} prints the absolute value of
+%\DescribeMacro{\xabsofcoef}
% \meta{counter} except that it suppresses the values of 1 and 0. The command
+%\DescribeMacro{\xsignofcoef}
% \cs{xsignofcoef}\marg{counter} prints the sign of \meta{counter} if the value
% of \meta{counter} is nonzero. The command \cs{xnegsignofcoef}\marg{counter}
+%\DescribeMacro{\xnegsignofcoef}
% prints the opposite sign of \meta{counter} if the value of \meta{counter} is
% nonzero. These commands are used to build versions of \cs{xarabic} and
% \cs{xsigned} specific to typesetting coefficients, as we now illustrate.
%
% Consider the following code
+%
%\begin{verbatim}
%\xprovidecounter{a0}
%\xsetcounter{a0}{-10}
@@ -492,10 +570,13 @@ and the derived files counterz.ins,
%\xprovidecounter{a5}
%\xsetcounter{a5}{11}
%$\xarabic{a5}x^5 + \xarabic{a4}x^4 + \xarabic{a3}x^3 + \xarabic{a2}x^2
-% + \xarabic{a1}x + \xarabic{a0} = 42$
+% + \xarabic{a1}x + \xarabic{a0} = 42$
%\end{verbatim}
+%
+% \noindent
% and its output
-%\begin{codeoutput}
+%
+% \bigskip
%\xprovidecounter{a0}
%\xsetcounter{a0}{-10}
%\xprovidecounter{a1}
@@ -509,57 +590,95 @@ and the derived files counterz.ins,
%\xprovidecounter{a5}
%\xsetcounter{a5}{11}
%$\xarabic{a5}x^5 + \xarabic{a4}x^4 + \xarabic{a3}x^3 + \xarabic{a2}x^2
-% + \xarabic{a1}x + \xarabic{a0} = 42$
-%\end{codeoutput}
-% We seek a better way to handle the coefficients, especially $1$ and $-1$.
+% + \xarabic{a1}x + \xarabic{a0} = 42$
+%
+% \bigskip
+% \noindent
+% We seek a better way to handle the coefficients, especially $1$ and $-1$. The
+% command \cs{xcoef}\marg{counter} prints the value of \meta{counter} except
%\DescribeMacro{\xcoef}
-%\DescribeMacro{\xsignedcoef}
-% The command \cs{xcoef}\marg{counter} prints the value of \meta{counter} except
% that it suppresses the values of 1, 0, and -1, printing a minus sign ``-'' in
% the latter case. The command \cs{xsignedcoef}\marg{counter} is like \cs{xcoef}
+%\DescribeMacro{\xsignedcoef}
% except that positive values are preceded by a plus sign ``+''. We use these to
% write the code
+%
%\begin{verbatim}
%$\xarabic{a5}x^5 + \xarabic{a4}x^4 + \xarabic{a3}x^3 + \xarabic{a2}x^2
-% + \xarabic{a1}x + \xarabic{a0} = 42$\\
-%$\xcoef{a5}\ifctrzero{a5}{}{x^5} \xsignedcoef{a4}\ifctrzero{a4}{}{x^4}
-% \xsignedcoef{a3}\ifctrzero{a3}{}{x^3} \xsignedcoef{a2}\ifctrzero{a2}{}{x^2}
-% \xsignedcoef{a1}\ifctrzero{a1}{}{x} \xsignednz{a0} = 42$
+% + \xarabic{a1}x + \xarabic{a0} = 42$
+%
+%$\xcoef{a5}\ifctrzero{a5}{}{x^5}
+% \xsignedcoef{a4}\ifctrzero{a4}{}{x^4}
+% \xsignedcoef{a3}\ifctrzero{a3}{}{x^3}
+% \xsignedcoef{a2}\ifctrzero{a2}{}{x^2}
+% \xsignedcoef{a1}\ifctrzero{a1}{}{x}
+% \xsignednz{a0}
+% = 42$
%\end{verbatim}
+%
+% \noindent
% whose output is
-%\begin{codeoutput}
+%
+% \bigskip
%$\xarabic{a5}x^5 + \xarabic{a4}x^4 + \xarabic{a3}x^3 + \xarabic{a2}x^2
-% + \xarabic{a1}x + \xarabic{a0} = 42$\\
-%$\xcoef{a5}\ifctrzero{a5}{}{x^5} \xsignedcoef{a4}\ifctrzero{a4}{}{x^4}
-% \xsignedcoef{a3}\ifctrzero{a3}{}{x^3} \xsignedcoef{a2}\ifctrzero{a2}{}{x^2}
-% \xsignedcoef{a1}\ifctrzero{a1}{}{x} \xsignednz{a0} = 42$
-%\end{codeoutput}
+% + \xarabic{a1}x + \xarabic{a0} = 42$
+%
+%$\xcoef{a5}\ifctrzero{a5}{}{x^5}
+% \xsignedcoef{a4}\ifctrzero{a4}{}{x^4}
+% \xsignedcoef{a3}\ifctrzero{a3}{}{x^3}
+% \xsignedcoef{a2}\ifctrzero{a2}{}{x^2}
+% \xsignedcoef{a1}\ifctrzero{a1}{}{x}
+% \xsignednz{a0}
+% = 42$
+%
+% \bigskip
%\DescribeMacro{\xnegcoef}
-%\DescribeMacro{\xnegsignedcoef}
% The command \cs{xnegcoef}\marg{counter} prints the negative of the value of
% \meta{counter} except that it suppresses the values of 1, 0, and -1, printing
% a ``-'' in the latter case. The command \cs{xnegsignedcoef}\marg{counter} is
+%\DescribeMacro{\xnegsignedcoef}
% like \cs{xnegcoef} except that positive values are preceded by a plus sign
% ``+''. We use these to write the code
+%
%\begin{verbatim}
-%$\xcoef{a5}\ifctrzero{a5}{}{x^5} \xsignedcoef{a4}\ifctrzero{a4}{}{x^4}
-% \xsignedcoef{a3}\ifctrzero{a3}{}{x^3} \xsignedcoef{a2}\ifctrzero{a2}{}{x^2}
-% \xsignedcoef{a1}\ifctrzero{a1}{}{x} \xsignednz{a0} = 42$\\
-%$\xcoef{a5}\ifctrzero{a5}{}{x^5} \xsignedcoef{a4}\ifctrzero{a4}{}{x^4}
-% \xsignedcoef{a2}\ifctrzero{a2}{}{x^2} \xsignednz{a0}
-% = \xnegcoef{a3}\ifctrzero{a3}{}{x^3} \xnegsignedcoef{a1}\ifctrzero{a1}{}{x}
+%$\xcoef{a5}\ifctrzero{a5}{}{x^5}
+% \xsignedcoef{a4}\ifctrzero{a4}{}{x^4}
+% \xsignedcoef{a3}\ifctrzero{a3}{}{x^3}
+% \xsignedcoef{a2}\ifctrzero{a2}{}{x^2}
+% \xsignedcoef{a1}\ifctrzero{a1}{}{x}
+% \xsignednz{a0}
+% = 42$
+%
+%$\xcoef{a5}\ifctrzero{a5}{}{x^5}
+% \xsignedcoef{a4}\ifctrzero{a4}{}{x^4}
+% \xsignedcoef{a2}\ifctrzero{a2}{}{x^2}
+% \xsignednz{a0}
+% = \xnegcoef{a3}\ifctrzero{a3}{}{x^3}
+% \xnegsignedcoef{a1}\ifctrzero{a1}{}{x}
% +42$
%\end{verbatim}
+%
+% \noindent
% whose output is
-%\begin{codeoutput}
-%$\xcoef{a5}\ifctrzero{a5}{}{x^5} \xsignedcoef{a4}\ifctrzero{a4}{}{x^4}
-% \xsignedcoef{a3}\ifctrzero{a3}{}{x^3} \xsignedcoef{a2}\ifctrzero{a2}{}{x^2}
-% \xsignedcoef{a1}\ifctrzero{a1}{}{x} \xsignednz{a0} = 42$\\
-%$\xcoef{a5}\ifctrzero{a5}{}{x^5} \xsignedcoef{a4}\ifctrzero{a4}{}{x^4}
-% \xsignedcoef{a2}\ifctrzero{a2}{}{x^2} \xsignednz{a0}
-% = \xnegcoef{a3}\ifctrzero{a3}{}{x^3} \xnegsignedcoef{a1}\ifctrzero{a1}{}{x}
+%
+% \bigskip
+%$\xcoef{a5}\ifctrzero{a5}{}{x^5}
+% \xsignedcoef{a4}\ifctrzero{a4}{}{x^4}
+% \xsignedcoef{a3}\ifctrzero{a3}{}{x^3}
+% \xsignedcoef{a2}\ifctrzero{a2}{}{x^2}
+% \xsignedcoef{a1}\ifctrzero{a1}{}{x}
+% \xsignednz{a0}
+% = 42$
+%
+%$\xcoef{a5}\ifctrzero{a5}{}{x^5}
+% \xsignedcoef{a4}\ifctrzero{a4}{}{x^4}
+% \xsignedcoef{a2}\ifctrzero{a2}{}{x^2}
+% \xsignednz{a0}
+% = \xnegcoef{a3}\ifctrzero{a3}{}{x^3}
+% \xnegsignedcoef{a1}\ifctrzero{a1}{}{x}
% +42$
-%\end{codeoutput}
+%
+% \bigskip
% As the reader has probably already observed in the code above, these display
% commands appear to be less efficient than a manual adjustment of signs and
% numbers. For fixed, known values of counters, this assessment is correct. The
@@ -568,16 +687,21 @@ and the derived files counterz.ins,
%
%\subsection{Random Counters}
%
+% We first define random versions of \cs{setcounter} and \cs{addtocounter}.
+% The command \cs{randsetcounter}\marg{counter}\marg{min}\marg{max} assigns
+%\DescribeMacro{\randsetcounter}
+% to \meta{counter} a random integer value between \meta{min} and \meta{max}.
%\DescribeMacro{\xrandsetcounter}
+% The command \cs{xrandsetcounter} is a prefix version of \cs{randsetcounter}.
+% Analogously, we define the command
+%\DescribeMacro{\randaddtocounter}
+% \cs{randaddtocounter}\marg{counter}\marg{min}\marg{max} which adds to
+% \meta{counter} a random integer value between \meta{min} and \meta{max}.
%\DescribeMacro{\xrandaddtocounter}
-% We first define random versions of \cs{xsetcounter} and \cs{xaddtocounter}.
-% The command \cs{xrandsetcounter}\marg{counter}\marg{min}\marg{max} assigns
-% to the prefixed \meta{counter} a random integer value between \meta{min} and
-% \meta{max}. Analogously, the command
-% \cs{xrandaddtocounter}\marg{counter}\marg{min}\marg{max} adds to the prefixed
-% \meta{counter} a random integer value between \meta{min} and \meta{max}. The
-% following code may be used to produce an expression in the form $ax+b$, where
-% $a$ and $b$ are random integers between $-10$ and $10$:
+% \cs{xrandaddtocounter} is a prefix version of \cs{randaddtocounter}.
+% The following code may be used to produce an expression in the form
+% $ax+b$, where $a$ and $b$ are random integers between $-10$ and $10$:
+%
%\begin{verbatim}
%\xprovidecounter{a}
%\xprovidecounter{b}
@@ -585,9 +709,13 @@ and the derived files counterz.ins,
%\xrandsetcounter{b}{-10}{10}
%$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$
%\end{verbatim}
+%
+% \noindent
% Organized in the following table are sixty instances of output that are
% randomly generated by the typesetting of this document:
-%\begin{codeoutput}
+%
+% \bigskip
+%\noindent
%\xprovidecounter{a}
%\xprovidecounter{b}
%\begin{tabular}{rrrrrr}
@@ -772,57 +900,130 @@ and the derived files counterz.ins,
%\xrandsetcounter{b}{-10}{10}
%$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ \\
%\end{tabular}
-%\end{codeoutput}
+%
+% \bigskip
+% In order to effectively manage the options of randomizing counter values or
+%\DescribeMacro{\randomizectr}
+% reusing counter values, the commands \cs{randomizectr} and \cs{norandomizectr}
+% are used to toggle an internal boolean variable. The internal boolean
+%\DescribeMacro{\norandomizectr}
+% is initialized as TRUE when the \textsf{counterz} package is loaded. A
+% conditional command \cs{ifrandomizectr}\marg{foo}\marg{bar} executes
+%\DescribeMacro{\ifrandomizectr}
+% \meta{foo} when the boolean is true and otherwise executes \meta{bar}.
%
% If our document contains randomly generated counters, but we wish to typeset
% the document again without changing those values, then we need a way to save
-% those values. The \textsf{counterz} package offers the following solution: a
-% file \textsf{\meta{jobname}.counters.tex} may be created during the
-% typesetting process to store the necessary information. For example, if the
-% document is named \textsf{Yellowdog.tex}, then the previously generated
-% counters and their assigned values will be stored the file
-% \textsf{Yellowdog.counters.tex}.
%\DescribeMacro{\opencountersfile}
-% The command \cs{opencountersfile} creates and opens the write stream to this
-% file. The author only has to include this command once, prior to any commands
-% used to save the counter values.
-%
+% them. The command \cs{opencountersfile} creates and opens the write stream to
+% the file \textsf{\meta{jobname}.counters.tex} to store the necessary
+% information. For example, if the document is
+% named \textsf{Yellowdog.tex}, then the previously generated counters and their
+% assigned values will be stored the file \textsf{Yellowdog.counters.tex}.
+% The author only has to include this command once, prior to any commands used
+% to save the counter values. Additional instances of \cs{opencountersfile} will
+% report an error, as will trying to use the command when the document is set to
+% not randomize (e.g. \cs{norandomizectr}). These error reports are designed to
+% prevent the accidental overwriting of \textsf{\meta{jobname}.counters.tex}.
+%
+% After opening the write stream to \textsf{\meta{jobname}.counters.tex}, the
+% command \cs{savecounter}\marg{counter} may be used to ``save'' the value of
+%\DescribeMacro{\savecounter}
+% \textit{counter} by writing to the file the relevant \cs{providecounter} and
+% \cs{setcounter} commands. The command \cs{xsavecounter} is a prefix version of
%\DescribeMacro{\xsavecounter}
-% The command \cs{xsavecounter}\marg{counter} ``saves'' the value of
-% \textit{counter} by writing to the file \textsf{\meta{jobname}.counters.tex}
-% the relevant \cs{providecounter} and \cs{setcounter} commands. The commands
-% written to the file explicitly include the necessary counter prefixes, and
-% consequently an author can, if necessary, manually find in the file the
-% specific assignment for any counter. The counters file may then be inputted
-% near the beginning of a subsequent typesetting to preassign all of the
-% values.
+% \cs{savecounter}. When using \cs{xsavecounter}, the commands that are written
+% to the file include the necessary counter prefixes. Consequently, an author
+% can, if necessary or desired, manually search the file for the value assigned
+% to any randomly generated counter.
+%
+% Once we have generated a file for storing counters, we need a way to recover
+% those values during a subsequent typesetting. The command
+%\DescribeMacro{\inputcountersfile}
+% \cs{inputcountersfile} will input the necessary file, if it exists, and report
+% an error if it does not. Keep in mind that inputting the file will override
+% any previous assignments of those counters, so it is probably best to invoke
+% this command near the beginning of a document. For example, after including an
+% instance of either \cs{randomizectr} or \cs{norandomizectr}, a document named
+% \textsf{Yellowdog.tex} might include the code
%
-%\DescribeMacro{\randomizectr}
-%\DescribeMacro{\norandomizectr}
-%\DescribeMacro{\ifrandomizectr}
-% In order to effectively manage the options of randomizing counter values or
-% reusing counter values, the \textsf{counterz} package offers the commands
-% \cs{randomizectr} and \cs{norandomizectr} that toggle an internal boolean
-% variable, and a conditional \cs{ifrandomizectr}\marg{foo}\marg{bar} that
-% executes \meta{foo} when the boolean is true and otherwise executes
-% \meta{bar}. For example, a document named \textsf{Yellowdog.tex} might
-% include the code
%\begin{verbatim}
-%\ifrandomizectr{}{input{Yellowdog.counters}}
+%\ifrandomizectr{\opencountersfile}{\inputcountersfile}
%\end{verbatim}
-% to determine whether to preload previously stored counter values.
%
-%\DescribeMacro{\xrandprovidecounter}
-%\DescribeMacro{\xrandprovidecounternz}
-% The command \cs{xrandprovidecounter}\marg{counter}\marg{min}\marg{max}
-% combines the four commands \cs{xprovidecounter}, \cs{ifrandomizectr},
-% \cs{xrandsetcounter}, and \cs{xsavecounter} to define a command that creates
-% \meta{counter} if it has not already been defined and, if the document is
+% \noindent
+% to determine whether to preload previously stored counter values or open the
+% write stream in anticipation of randomly generating new counter values.
+%
+%\DescribeMacro{\promptrandomizectr}
+% The command \cs{promptrandomizectr}\oarg{macro}\marg{message}\marg{string}
+% offers an alternative to manually switching between the commands
+% \cs{randomizectr} and \cs{norandomizectr} for different typesettings. The
+% contents of \meta{message} are displayed in the terminal, awaiting a response
+% from the user at the prompt \meta{macro}. If the optional argument is not used
+% then the default prompt is \cs{@typein}. If the optional argument is given, it
+% must be a macro name that includes the backslash. The user's response is
+% stored as a string in \meta{macro} and compared to \meta{string}. If they are
+% equal, then the command \cs{randomizectr} is executed. If they are not equal
+% then \cs{norandomizectr} is executed.
+%
+% Consider the following example code:
+%
+%\begin{verbatim}
+%\promptrandomizectr[\EnterResponse]{%
+% ^^J Enter 1 to randomize.
+% ^^J Enter 2 to not randomize.
+%}{%
+% 1%
+%}%
+%\ifrandomizectr{%
+% \opencountersfile
+%}{%
+% \inputcountersfile
+%}%
+%\end{verbatim}
+%
+% \noindent
+% which displays the following in the terminal:
+%
+%\begin{verbatim}
+% Enter 1 to randomize.
+% Enter 2 to not randomize.
+%
+%\EnterResponse=
+%\end{verbatim}
+%
+% \noindent
+% Notice that the first (optional) argument \cs{EnterResponse} begins with a
+% backslash and is displayed with an equals sign ``='' at the prompt. Also note
+% that the second argument contains two instances of the text \texttt{\^{}\^{}J}
+% which is used to produce a line break in the terminal output. Next, note that
+% the third argument \texttt{1} is immediately followed by a percent symbol
+% \texttt{\%} to prevent extra space being included in the string. (If the
+% \texttt{1} was immediately followed by a closing brace instead of a line break
+% in the code, the percent symbol would not be used.) Finally, note that if the
+% user types a \texttt{1} in the terminal and presses Enter, then the commands
+% \cs{randomizectr} and \cs{opencountersfile} will be executed. If the user
+% enters \textit{any other text} or simply presses Enter with no text, then the
+% commands \cs{norandomizectr} and \cs{inputcountersfile} will be executed,
+% despite the instructions to enter a \texttt{2} to achieve this outcome.
+%
+%\DescribeMacro{\randprovidecounter}
+% The command \cs{randprovidecounter}\marg{counter}\marg{min}\marg{max}
+% combines the four commands \cs{providecounter}, \cs{ifrandomizectr},
+% \cs{randsetcounter}, and \cs{savecounter}. The command creates \meta{counter}
+% if it has not already been defined and, if the document is
% randomized, assigns to \meta{counter} a random integer value between
% \meta{min} and \meta{max} and saves this value to the counters file. The
-% command \cs{xrandprovidecounternz} is like \cs{xrandprovidecounter} except
-% that the generated value is nonzero. Suppose that \textsf{Neverending.tex}
+%\DescribeMacro{\randprovidecounternz}
+% command \cs{randprovidecounternz} is like \cs{randprovidecounter} except
+%\DescribeMacro{\xrandprovidecounter}
+% that the generated value is nonzero. The commands \cs{xrandprovidecounter} and
+%\DescribeMacro{\xrandprovidecounternz}
+% \cs{xrandprovidecounternz} are prefix versions of \cs{randprovidecounter} and
+% \cs{randprovidecounternz}, respectively. Suppose that \textsf{Neverending.tex}
% contains the code
+%
%\begin{verbatim}
%\randomizectr
%\ifrandomizectr{\opencountersfile}{}
@@ -830,21 +1031,27 @@ and the derived files counterz.ins,
%\xrandprovidecounternz{Oracle}{-10}{10}
%\xcoef{Oracle}x+42
%\end{verbatim}
+%
+% \noindent
% After typesetting once, the resulting document might display an expression
% such as $-9x+42$ and print to \textsf{Neverending.counters.tex} the line
+%
%\begin{verbatim}
%\providecounter {SouthernOracle} \setcounter {SouthernOracle}{-9}
%\end{verbatim}
+%
+% \noindent
% After typesetting a second time, the resulting document might display $4x+42$
% and print to \textsf{Neverending.counters.tex} the line
+%
%\begin{verbatim}
%\providecounter {SouthernOracle} \setcounter {SouthernOracle}{4}
%\end{verbatim}
+%
+% \noindent
% If, however, the command \cs{randomizectr} is replaced by \cs{norandomizectr},
% then a third typesetting will leave both the displayed text and the counters
-% file unchanged. (Tip: Users who are concerned about accidental randomization
-% might create a terminal prompt with the commands \cs{typeout} and \cs{typein}
-% to input the randomization preference, as an added layer of security.)
+% file unchanged.
%
%\StopEventually{^^A
% \PrintChanges
@@ -859,7 +1066,9 @@ and the derived files counterz.ins,
%
% \begin{macrocode}
%<*package>
-\ProvidesPackage{counterz}[2023/05/19 v1.0.0 Additional tools for counters]
+\ProvidesPackage{counterz}[%
+ 2023/05/30 v1.1.0 Additional tools for counters
+]%
\RequirePackage{etoolbox,makecmds}
% \end{macrocode}
%
@@ -874,8 +1083,12 @@ and the derived files counterz.ins,
%
% \begin{macrocode}
\newcommand{\@counterz@counterprefix}{}
-\newcommand{\setcounterprefix}[1]{\renewcommand{\@counterz@counterprefix}{#1}}
-\newcommand{\clearcounterprefix}{\setcounterprefix{}}
+\newcommand{\setcounterprefix}[1]{%
+ \renewcommand{\@counterz@counterprefix}{#1}
+}%
+\newcommand{\clearcounterprefix}{%
+ \setcounterprefix{}
+}%
% \end{macrocode}
%
%\end{macro}
@@ -898,11 +1111,21 @@ and the derived files counterz.ins,
% counterparts.
%
% \begin{macrocode}
-\newcommand{\xnewcounter}[1]{\newcounter{\@counterz@counterprefix #1}}
-\newcommand{\xprovidecounter}[1]{\providecounter{\@counterz@counterprefix #1}}
-\newcommand{\xsetcounter}[2]{\setcounter{\@counterz@counterprefix #1}{#2}}
-\newcommand{\xaddtocounter}[2]{\addtocounter{\@counterz@counterprefix #1}{#2}}
-\newcommand{\xvalue}[1]{\value{\@counterz@counterprefix #1}}
+\newcommand{\xnewcounter}[1]{%
+ \newcounter{\@counterz@counterprefix #1}
+}%
+\newcommand{\xprovidecounter}[1]{%
+ \providecounter{\@counterz@counterprefix #1}
+}%
+\newcommand{\xsetcounter}[2]{%
+ \setcounter{\@counterz@counterprefix #1}{#2}
+}%
+\newcommand{\xaddtocounter}[2]{%
+ \addtocounter{\@counterz@counterprefix #1}{#2}
+}%
+\newcommand{\xvalue}[1]{%
+ \value{\@counterz@counterprefix #1}
+}%
% \end{macrocode}
%
%\end{macro}
@@ -926,7 +1149,9 @@ and the derived files counterz.ins,
% \meta{counter2} and otherwise executes \meta{bar}.
%
% \begin{macrocode}
-\newcommand{\ifctrequal}[4]{\ifnumequal{\xvalue{#1}}{\xvalue{#2}}{#3}{#4}}
+\newcommand{\ifctrequal}[4]{%
+ \ifnumequal{\xvalue{#1}}{\xvalue{#2}}{#3}{#4}
+}%
% \end{macrocode}
%
%\end{macro}
@@ -938,7 +1163,9 @@ and the derived files counterz.ins,
% \meta{counter2} and otherwise executes \meta{bar}.
%
% \begin{macrocode}
-\newcommand{\ifctrless}[4]{\ifnumless{\xvalue{#1}}{\xvalue{#2}}{#3}{#4}}
+\newcommand{\ifctrless}[4]{%
+ \ifnumless{\xvalue{#1}}{\xvalue{#2}}{#3}{#4}
+}%
% \end{macrocode}
%
%\end{macro}
@@ -950,7 +1177,9 @@ and the derived files counterz.ins,
% \meta{counter2} and otherwise executes \meta{bar}.
%
% \begin{macrocode}
-\newcommand{\ifctrmore}[4]{\ifnumless{\xvalue{#2}}{\xvalue{#1}}{#3}{#4}}
+\newcommand{\ifctrmore}[4]{%
+ \ifnumless{\xvalue{#2}}{\xvalue{#1}}{#3}{#4}
+}%
% \end{macrocode}
%
%\end{macro}
@@ -961,7 +1190,9 @@ and the derived files counterz.ins,
% the value of \meta{counter} is zero and otherwise executes \meta{bar}.
%
% \begin{macrocode}
-\newcommand{\ifctrzero}[3]{\ifnumequal{\xvalue{#1}}{0}{#2}{#3}}
+\newcommand{\ifctrzero}[3]{%
+ \ifnumequal{\xvalue{#1}}{0}{#2}{#3}
+}%
% \end{macrocode}
%
%\end{macro}
@@ -972,7 +1203,9 @@ and the derived files counterz.ins,
% value of \meta{counter} is negative and otherwise executes \meta{bar}.
%
% \begin{macrocode}
-\newcommand{\ifctrneg}[3]{\ifnumless{\xvalue{#1}}{0}{#2}{#3}}
+\newcommand{\ifctrneg}[3]{%
+ \ifnumless{\xvalue{#1}}{0}{#2}{#3}
+}%
% \end{macrocode}
%
%\end{macro}
@@ -983,7 +1216,9 @@ and the derived files counterz.ins,
% value of \meta{counter} is positive and otherwise executes \meta{bar}.
%
% \begin{macrocode}
-\newcommand{\ifctrpos}[3]{\ifnumless{\xvalue{#1}}{1}{#3}{#2}}
+\newcommand{\ifctrpos}[3]{%
+ \ifnumless{\xvalue{#1}}{1}{#3}{#2}
+}%
% \end{macrocode}
%
%\end{macro}
@@ -1042,7 +1277,9 @@ and the derived files counterz.ins,
% includes the value zero.
%
% \begin{macrocode}
-\newcommand{\xsignof}[1]{\ifctrneg{#1}{-}{+}}
+\newcommand{\xsignof}[1]{%
+ \ifctrneg{#1}{-}{+}
+}%
% \end{macrocode}
%
%\end{macro}
@@ -1054,7 +1291,9 @@ and the derived files counterz.ins,
% includes the value zero.
%
% \begin{macrocode}
-\newcommand{\xnegsignof}[1]{\ifctrneg{#1}{+}{-}}
+\newcommand{\xnegsignof}[1]{%
+ \ifctrneg{#1}{+}{-}
+}%
% \end{macrocode}
%
%\end{macro}
@@ -1066,7 +1305,9 @@ and the derived files counterz.ins,
% \cs{xsignof}.
%
% \begin{macrocode}
-\newcommand{\xsigned}[1]{\xsignof{#1} \xabsof{#1}}
+\newcommand{\xsigned}[1]{%
+ \xsignof{#1} \xabsof{#1}
+}%
% \end{macrocode}
%
%\end{macro}
@@ -1077,7 +1318,9 @@ and the derived files counterz.ins,
% zero.
%
% \begin{macrocode}
-\newcommand{\xsignednz}[1]{\ifctrzero{#1}{}{\xsigned{#1}}}
+\newcommand{\xsignednz}[1]{%
+ \ifctrzero{#1}{}{\xsigned{#1}}
+}%
% \end{macrocode}
%
%\end{macro}
@@ -1088,7 +1331,9 @@ and the derived files counterz.ins,
% zero.
%
% \begin{macrocode}
-\newcommand{\xarabicnz}[1]{\ifctrzero{#1}{}{\xarabic{#1}}}
+\newcommand{\xarabicnz}[1]{%
+ \ifctrzero{#1}{}{\xarabic{#1}}
+}%
% \end{macrocode}
%
%\end{macro}
@@ -1100,7 +1345,9 @@ and the derived files counterz.ins,
% \cs{xnegsignof}.
%
% \begin{macrocode}
-\newcommand{\xnegsigned}[1]{\xnegsignof{#1} \xabsof{#1}}
+\newcommand{\xnegsigned}[1]{%
+ \xnegsignof{#1} \xabsof{#1}
+}%
% \end{macrocode}
%
%\end{macro}
@@ -1111,7 +1358,9 @@ and the derived files counterz.ins,
% number zero.
%
% \begin{macrocode}
-\newcommand{\xnegsignednz}[1]{\ifctrzero{#1}{}{\xnegsigned{#1}}}
+\newcommand{\xnegsignednz}[1]{%
+ \ifctrzero{#1}{}{\xnegsigned{#1}}
+}%
% \end{macrocode}
%
%\end{macro}
@@ -1121,7 +1370,9 @@ and the derived files counterz.ins,
% \cs{xnegof}\marg{counter} prints the negative of the value of \meta{counter}.
%
% \begin{macrocode}
-\newcommand{\xnegof}[1]{\ifctrpos{#1}{-}{}\xabsof{#1}}
+\newcommand{\xnegof}[1]{%
+ \ifctrpos{#1}{-}{}\xabsof{#1}
+}%
% \end{macrocode}
%
%\end{macro}
@@ -1132,7 +1383,9 @@ and the derived files counterz.ins,
% zero.
%
% \begin{macrocode}
-\newcommand{\xnegofnz}[1]{\ifctrzero{#1}{}{\xnegof{#1}}}
+\newcommand{\xnegofnz}[1]{%
+ \ifctrzero{#1}{}{\xnegof{#1}}
+}%
% \end{macrocode}
%
%\end{macro}
@@ -1144,13 +1397,15 @@ and the derived files counterz.ins,
%
% \begin{macrocode}
\newcommand{\xcoef}[1]{%
- \ifboolexpr{test {\ifnumless{\xvalue{#1}}{-1}}%
- or test {\ifnumgreater{\xvalue{#1}}{1}}}{%
- \xarabic{#1}%
+ \ifboolexpr{%
+ test {\ifnumless{\xvalue{#1}}{-1}}
+ or test {\ifnumgreater{\xvalue{#1}}{1}}
+ }{%
+ \xarabic{#1}
}{%
}%
- \ifnumequal{\xvalue{#1}}{-1}{-}{}%
-}
+ \ifnumequal{\xvalue{#1}}{-1}{-}{}
+}%
% \end{macrocode}
%
%\end{macro}
@@ -1162,13 +1417,15 @@ and the derived files counterz.ins,
%
% \begin{macrocode}
\newcommand{\xnegcoef}[1]{%
- \ifboolexpr{test {\ifnumless{\xvalue{#1}}{-1}}%
- or test {\ifnumgreater{\xvalue{#1}}{1}}}{%
- \xnegof{#1}%
+ \ifboolexpr{%
+ test {\ifnumless{\xvalue{#1}}{-1}}
+ or test {\ifnumgreater{\xvalue{#1}}{1}}
+ }{%
+ \xnegof{#1}
}{%
}%
- \ifnumequal{\xvalue{#1}}{1}{-}{}%
-}
+ \ifnumequal{\xvalue{#1}}{1}{-}{}
+}%
% \end{macrocode}
%
%\end{macro}
@@ -1180,12 +1437,14 @@ and the derived files counterz.ins,
%
% \begin{macrocode}
\newcommand{\xabsofcoef}[1]{%
- \ifboolexpr{test {\ifnumless{\xvalue{#1}}{-1}}%
- or test {\ifnumgreater{\xvalue{#1}}{1}}}{%
- \xabsof{#1}%
+ \ifboolexpr{%
+ test {\ifnumless{\xvalue{#1}}{-1}}
+ or test {\ifnumgreater{\xvalue{#1}}{1}}
}{%
- }
-}
+ \xabsof{#1}
+ }{%
+ }%
+}%
% \end{macrocode}
%
%\end{macro}
@@ -1196,7 +1455,9 @@ and the derived files counterz.ins,
% \meta{counter} is nonzero.
%
% \begin{macrocode}
-\newcommand{\xsignofcoef}[1]{\ifctrzero{#1}{}{\xsignof{#1}}}
+\newcommand{\xsignofcoef}[1]{%
+ \ifctrzero{#1}{}{\xsignof{#1}}
+}%
% \end{macrocode}
%
%\end{macro}
@@ -1207,7 +1468,9 @@ and the derived files counterz.ins,
% if \meta{counter} is nonzero.
%
% \begin{macrocode}
-\newcommand{\xnegsignofcoef}[1]{\ifctrzero{#1}{}{\xnegsignof{#1}}}
+\newcommand{\xnegsignofcoef}[1]{%
+ \ifctrzero{#1}{}{\xnegsignof{#1}}
+}%
% \end{macrocode}
%
%\end{macro}
@@ -1218,7 +1481,9 @@ and the derived files counterz.ins,
% are preceded by a plus sign ``+''.
%
% \begin{macrocode}
-\newcommand{\xsignedcoef}[1]{\xsignofcoef{#1} \xabsofcoef{#1}}
+\newcommand{\xsignedcoef}[1]{%
+ \xsignofcoef{#1} \xabsofcoef{#1}
+}%
% \end{macrocode}
%
%\end{macro}
@@ -1229,68 +1494,190 @@ and the derived files counterz.ins,
% opposite sign.
%
% \begin{macrocode}
-\newcommand{\xnegsignedcoef}[1]{\xnegsignofcoef{#1} \xabsofcoef{#1}}
+\newcommand{\xnegsignedcoef}[1]{%
+ \xnegsignofcoef{#1} \xabsofcoef{#1}
+}%
% \end{macrocode}
%
%\end{macro}
%
%\subsection{Random Counters}
%
-% The commands \cs{xrandsetcounter} and \cs{xrandaddtocounter} use the pdf\TeX\
+% The commands \cs{randsetcounter} and \cs{randaddtocounter} use the pdf\TeX\
% primitive \cs{pdfuniformdeviate} to provide random versions of
-% \cs{xsetcounter} and \cs{xaddtocounter}.
+% \cs{setcounter} and \cs{addtocounter}. The commands \cs{xrandsetcounter} and
+% \cs{xrandaddtocounter} are prefix versions of \cs{randsetcounter} and
+% \cs{randaddtocounter}, respectively.
%
+%\begin{macro}{\randsetcounter}
+%\changes{v1.1.0}{2023/05/30}{new}
%\begin{macro}{\xrandsetcounter}
+%\changes{v1.1.0}{2023/05/30}{now based on a new \cs{randsetcounter}}
%
-% \cs{xrandsetcounter}\marg{counter}\marg{min}\marg{max} assigns to (the
-% prefixed) \meta{counter} a random integer value between \meta{min} and
-% \meta{max}.
+% \cs{randsetcounter}\marg{counter}\marg{min}\marg{max} assigns to
+% \meta{counter} a random integer value between \meta{min} and \meta{max}.
%
% \begin{macrocode}
-\newcommand{\xrandsetcounter}[3]{%
- \xsetcounter{#1}{%
+\newcommand{\randsetcounter}[3]{%
+ \setcounter{#1}{%
\the \numexpr #2+\pdfuniformdeviate \numexpr #3-#2+1 \relax
- }
-}
+ }%
+}%
+\newcommand{\xrandsetcounter}[3]{%
+ \randsetcounter{\@counterz@counterprefix#1}{#2}{#3}
+}%
% \end{macrocode}
%
%\end{macro}
+%\end{macro}
%
+%\begin{macro}{\randaddtocounter}
+%\changes{v1.1.0}{2023/05/30}{new}
%\begin{macro}{\xrandaddtocounter}
+%\changes{v1.1.0}{2023/05/30}{now based on a new \cs{randaddtocounter}}
%
-% \cs{xrandaddtocounter}\marg{counter}\marg{min}\marg{max} adds to (the
-% prefixed) \meta{counter} a random integer value between \meta{min} and
-% \meta{max}.
+% \cs{randaddtocounter}\marg{counter}\marg{min}\marg{max} adds to \meta{counter}
+% a random integer value between \meta{min} and \meta{max}.
%
% \begin{macrocode}
-\newcommand{\xrandaddtocounter}[3]{%
- \xaddtocounter{#1}{%
+\newcommand{\randaddtocounter}[3]{%
+ \addtocounter{#1}{%
\the \numexpr #2+\pdfuniformdeviate \numexpr #3-#2+1 \relax
- }
-}
+ }%
+}%
+\newcommand{\xrandaddtocounter}[3]{%
+ \randaddtocounter{\@counterz@counterprefix#1}{#2}{#3}
+}%
% \end{macrocode}
%
%\end{macro}
+%\end{macro}
% The following commands are designed to provide a means by which authors can
% generate random values for counters but also preserve those values for future
% typesettings. This is accomplished by storing counters and their values in an
% external file and then inputting the file before a subsequent typesetting.
%
+%\begin{macro}{\randomizectr}
+%\begin{macro}{\norandomizectr}
+%
+% In order to assign a random value to a counter during one typesetting and
+% avoid overwriting this value with a random assignment during another
+% typesetting, the boolean \textit{@counterz@random} is used to distinguish
+% between the two typesetting options. The value of \textit{@counterz@random} may
+% be changed by the commands \cs{randomizectr} and \cs{norandomizectr}.
+%
+% \begin{macrocode}
+\newbool{@counterz@random}
+\booltrue{@counterz@random}
+\newcommand{\randomizectr}{\booltrue{@counterz@random}}
+\newcommand{\norandomizectr}{\boolfalse{@counterz@random}}
+% \end{macrocode}
+%
+%\end{macro}
+%\end{macro}
+%
+%\begin{macro}{\ifrandomizectr}
+%
+% \cs{ifrandomizectr}\marg{foo}\marg{bar} executes \meta{foo} if the boolean
+% \textit{@counterz@random} is true and otherwise executes \meta{bar}.
+%
+% \begin{macrocode}
+\newcommand{\ifrandomizectr}[2]{%
+ \ifbool{@counterz@random}{#1}{#2}
+}%
+% \end{macrocode}
+%
+%\end{macro}
+%
+%\begin{macro}{\promptrandomizectr}
+%\changes{v1.1.0}{2023/05/30}{new}
+%
+% \cs{promptrandomizectr}\oarg{command}\marg{message}\marg{string} writes
+% \meta{message} to the terminal and awaits a response from the user at the
+% prompt. The user's response is stored in \meta{command} and compared to the
+% text of \meta{string}. If they are equal, then \cs{randomizectr} is executed.
+% If they are not equal, then \cs{norandomizectr} is executed.
+%
+% \begin{macrocode}
+\newcommand{\promptrandomizectr}[3][\@typein]{%
+ \typein[#1]{#2}
+ \ifdefstring{#1}{#3}{%
+ \randomizectr
+ }{%
+ \norandomizectr
+ }%
+}%
+% \end{macrocode}
+%
+%\end{macro}
+%
%\begin{macro}{\opencountersfile}
+%\changes{v1.1.0}{2023/05/30}{new error reports}
%
% The command \cs{opencountersfile} creates and opens the write stream to the
% file \textsf{\meta{jobname}.counters.tex}, referenced by the macro
-% \cs{countersfile}.
+% \cs{countersfile}. If the file already exists, it is overwritten. For this
+% reason,
%
% \begin{macrocode}
+\newbool{@counterz@fileISopen}
+\boolfalse{@counterz@fileISopen}
\newcommand{\opencountersfile}{%
- \newwrite\countersfile
- \immediate\openout\countersfile=\jobname.counters.tex
+ \ifbool{@counterz@fileISopen}{%
+ \PackageError{counterz}{%
+ The write stream is already open!
+ \MessageBreak Process interrupted to prevent overwriting
+ \MessageBreak \jobname.counters.tex
+ }{%
+ Be sure to include only one instance of
+ \protect\opencountersfile.
+ }%
+ }{%
+ \ifrandomizectr{%
+ \newwrite\countersfile
+ \immediate\openout\countersfile=\jobname.counters.tex
+ \booltrue{@counterz@fileISopen}
+ }{%
+ \PackageError{counterz}{%
+ \protect\opencountersfile\space requires
+ \protect\randomizectr
+ \MessageBreak Process interrupted to prevent overwriting
+ \MessageBreak \jobname.counters.tex
+ }{%
+ \protect\opencountersfile\space is designed to open a file
+ for saving newly randomized counters. See the Random
+ Counters section of the counterz package documentation for
+ details.
+ }%
+ }%
+ }%
}
% \end{macrocode}
%
%\end{macro}
%
+%\begin{macro}{\inputcountersfile}
+%\changes{v1.1.0}{2023/05/30}{new}
+%
+% The command \cs{inputcountersfile} inputs \textsf{\meta{jobname}.counters.tex}
+% if the file exists and reports a package error if the file does not exist.
+%
+% \begin{macrocode}
+\newcommand{\inputcountersfile}{%
+ \InputIfFileExists{\jobname.counters}{%
+ }{%
+ \PackageError{counterz}{%
+ The file \jobname.counters.tex does not exist.
+ }{%
+ See the Random Counters section of the counterz package
+ documentation.
+ }%
+ }%
+}%
+% \end{macrocode}
+%
+%\end{macro}
+%
%\begin{macro}{\@counterz@openbrace}
%\begin{macro}{\@counterz@closebrace}
%
@@ -1309,59 +1696,79 @@ and the derived files counterz.ins,
%\end{macro}
%\end{macro}
%
+%\begin{macro}{\savecounter}
+%\changes{v1.1.0}{2023/05/30}{new}
%\begin{macro}{\xsavecounter}
+%\changes{v1.1.0}{2023/05/30}{now based on a new \cs{savecounter}}
%
-% \cs{xsavecounter}\marg{counter} writes \cs{providecounter} and \cs{setcounter}
+% \cs{savecounter}\marg{counter} writes \cs{providecounter} and \cs{setcounter}
% commands to the file \textsf{\meta{jobname}.counters.tex} so that they may be
-% inputted as part of a future typesetting.
+% inputted as part of a future typesetting. The command reports a package error
+% if the write stream to \textsf{\meta{jobname}.counters.tex} is not open. The
+% command \cs{xsavecounter} is a prefix version of \cs{savecounter}.
+%
%
% \begin{macrocode}
-\newcommand{\xsavecounter}[1]{%
- \immediate\write\countersfile{%
- \unexpanded{\providecounter}\@counterz@openbrace%
- \@counterz@counterprefix #1\@counterz@closebrace%
- \unexpanded{ \setcounter}\@counterz@openbrace%
- \@counterz@counterprefix #1\@counterz@closebrace%
- \@counterz@openbrace%
- \arabic{\@counterz@counterprefix #1}\@counterz@closebrace%
+\newcommand{\savecounter}[1]{%
+ \ifbool{@counterz@fileISopen}{%
+ \immediate\write\countersfile{%
+ \unexpanded{\providecounter}
+ \@counterz@openbrace#1\@counterz@closebrace
+ \unexpanded{\setcounter}
+ \@counterz@openbrace#1\@counterz@closebrace
+ \@counterz@openbrace\arabic{#1}\@counterz@closebrace
+ }%
+ }{%
+ \PackageError{counterz}{%
+ The write stream to the file \jobname.counters.tex must be
+ opened before \protect\savecounter\space can be executed.
+ }{%
+ See \protect\opencountersfile\space and
+ \protect\savecounter\space in the counterz package
+ documentation.
+ }%
}%
}%
-% \end{macrocode}
-%
-%\end{macro}
-%
-%\begin{macro}{\randomizectr}
-%\begin{macro}{\norandomizectr}
-%
-% In order to assign a random value to a counter during one typesetting and
-% avoid overwriting this value with a random assignment during another
-% typesetting, the boolean \textit{@counterz@random} is used to distinguish
-% between the two typesettings. The value of \textit{@counterz@random} may
-% be changed by the commands \cs{randomizectr} and \cs{norandomizectr}.
-%
-% \begin{macrocode}
-\newbool{@counterz@random}
-\newcommand{\randomizectr}{\booltrue{@counterz@random}}
-\newcommand{\norandomizectr}{\boolfalse{@counterz@random}}
+
+\newcommand{\xsavecounter}[1]{%
+ \savecounter{\@counterz@counterprefix#1}%
+}%
% \end{macrocode}
%
%\end{macro}
%\end{macro}
%
-%\begin{macro}{\ifrandomizectr}
+%\begin{macro}{\randprovidecounter}
+%\changes{v1.1.0}{2023/05/30}{new}
%
-% \cs{ifrandomizectr}\marg{foo}\marg{bar} executes \meta{foo} if the boolean
-% \textit{@counterz@random} is true and otherwise executes \meta{bar}.
+% \cs{randprovidecounter}\marg{counter}\marg{min}\marg{max} creates
+% \meta{counter} if it does not already exist, and if the boolean
+% \textit{@counterz@random} is true then \meta{counter} is assigned a
+% random integer value between \meta{min} and \meta{max} and then saved.
%
% \begin{macrocode}
-\newcommand{\ifrandomizectr}[2]{%
- \ifbool{@counterz@random}{#1}{#2}
+\newcommand{\randprovidecounter}[3]{%
+ \ifltxcounter{#1}{%
+ \@ifnextchar]{%
+ \m@k@gobbleendoptarg
+ }{%
+ }%
+ }{%
+ \newcounter{#1}
+ \ifrandomizectr{%
+ \randsetcounter{#1}{#2}{#3}
+ \savecounter{#1}
+ }{%
+ }%
+ }%
}%
% \end{macrocode}
%
%\end{macro}
%
%\begin{macro}{\xrandprovidecounter}
+%\changes{v1.1.0}{2023/05/30}{no longer randomizes if already defined;
+%now based on a new \cs{randprovidecounter}}
%
% \cs{xrandprovidecounter}\marg{counter}\marg{min}\marg{max} creates
% \meta{counter} if it does not already exist, and if the boolean
@@ -1370,18 +1777,45 @@ and the derived files counterz.ins,
%
% \begin{macrocode}
\newcommand{\xrandprovidecounter}[3]{%
- \xprovidecounter{#1}
- \ifrandomizectr{%
- \xrandsetcounter{#1}{#2}{#3}
- \xsavecounter{#1}
- }{%
- }
-}
+ \randprovidecounter{\@counterz@counterprefix#1}{#2}{#3}
+}%
% \end{macrocode}
%
%\end{macro}
%
+%\begin{macro}{\randprovidecounternz}
+%\changes{v1.1.0}{2023/05/30}{new}
+%
+% \cs{randprovidecounternz}\marg{counter}\marg{min}\marg{max} does the same
+% job as the command \cs{xrandprovidecounter} except that the value of
+% \meta{counter} is randomized until it is nonzero.
+%
+% \begin{macrocode}
+\newcommand{\randprovidecounternz}[3]{%
+ \ifltxcounter{#1}{%
+ \@ifnextchar]{%
+ \m@k@gobbleendoptarg
+ }{%
+ }%
+ }{%
+ \newcounter{#1}
+ \ifrandomizectr{%
+ \setcounter{#1}{0}
+ \whileboolexpr{test {\ifnumequal{\value{#1}}{0}}}{%
+ \randsetcounter{#1}{#2}{#3}
+ }%
+ \savecounter{#1}
+ }{%
+ }%
+ }%
+}%
+% \end{macrocode}
+%
+%\end{macro}%
+%
%\begin{macro}{\xrandprovidecounternz}
+%\changes{v1.1.0}{2023/05/30}{no longer randomizes if already defined;
+%now based on a new \cs{randprovidecounternz}}
%
% \cs{xrandprovidecounternz}\marg{counter}\marg{min}\marg{max} does the same
% job as the command \cs{xrandprovidecounter} except that the value of
@@ -1389,16 +1823,8 @@ and the derived files counterz.ins,
%
% \begin{macrocode}
\newcommand{\xrandprovidecounternz}[3]{%
- \xprovidecounter{#1}
- \ifrandomizectr{%
- \xsetcounter{#1}{0}
- \whileboolexpr{ test {\ifnumequal{\xvalue{#1}}{0}}}{%
- \xrandsetcounter{#1}{#2}{#3}
- }
- \xsavecounter{#1}
- }{%
- }
-}
+ \randprovidecounternz{\@counterz@counterprefix#1}{#2}{#3}
+}%
% \end{macrocode}
%
%\end{macro}%