summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/readarray/readarray.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/readarray/readarray.sty')
-rw-r--r--macros/latex/contrib/readarray/readarray.sty415
1 files changed, 282 insertions, 133 deletions
diff --git a/macros/latex/contrib/readarray/readarray.sty b/macros/latex/contrib/readarray/readarray.sty
index 562fca3323..fb6c2ba90d 100644
--- a/macros/latex/contrib/readarray/readarray.sty
+++ b/macros/latex/contrib/readarray/readarray.sty
@@ -1,5 +1,5 @@
-\def\readarrayPackageVersion{2.0}
-\def\readarrayPackageDate{2016/11/07}
+\def\readarrayPackageVersion{3.0}
+\def\readarrayPackageDate{2021/08/08}
\ProvidesPackage{readarray}
[\readarrayPackageDate\ \readarrayPackageVersion\ %
Routines for inputting 2D and 3D array data and recalling it on an
@@ -33,7 +33,10 @@ element-by-element basis.]
% -Deprecated \Arrayijk, \arrayijk, \Arrayij, & \arrayij. Direct
% access now preferred, e.g., \xyz[2,3,1].
% -Deprecated most other commands in favor of a more natural syntax.
-\RequirePackage{ifthen}
+% v3.0 (2021-08-05)
+% -Added features: \setvalue, \initarray, \mergearray, \typesetarray
+% -Allowed for \readarrayendlinechar to be set other than 9
+\RequirePackage{forloop}
\RequirePackage{listofitems}[2016-10-22]
%
\newcounter{@index}
@@ -42,13 +45,12 @@ element-by-element basis.]
\newcounter{@col}
\newcounter{use@args}
\newcounter{@record}
-\newcounter{arg@index}
-\newcounter{break@count}
\newcounter{index@count}
-\newcounter{loop@count}
\newtoks\Arg@toks
\newtoks\@arrayident@toks
\newread\rdar@file
+\newcount\readarrayendlinechar
+\edef\readarraybackslash{\expandafter\@firstoftwo\string\\}
%
\newcommand\readdef[2]{\@readdef{#1}{#2}{ArrayRecord}}
%
@@ -59,61 +61,57 @@ element-by-element basis.]
\expandafter\ra@TermB\expandafter{\@arrayident}%
}
%
-\newcommand\readarray{\@ifstar{\read@array@newsyntax[*]}{\read@array@newsyntax[]}}
+\newcommand\readarray{\@ifstar
+ {\read@array@newsyntax[*]}{\read@array@newsyntax[]}}
%
\def\arraytomacro#1[#2]#3{%
- \edef\@arrayident{\rdar@macroname#1[#2]}%
- \@arrayident@toks=\expandafter\expandafter\expandafter{\csname\@arrayident\endcsname}%
+ \@arrayident@toks=\expandafter\expandafter\expandafter
+ {\csname\rdar@macroname#1[#2]\endcsname}%
\expandafter\def\expandafter#3\expandafter{\the\@arrayident@toks}%
}
%
\newcommand\readarraysepchar[1]{\def\read@array@sepchar{#1}}
%
-\def\nocheckbounds{\def\rootmacro@aux##1##2##3{##1%
+\def\nocheckbounds{\def\rootmacro@aux##1##2{\csname##1[##2]\endcsname%
}\typeout{readarray: bounds checking OFF}%
}
%
-\def\checkbounds{\def\rootmacro@aux##1##2##3{##1%
- \expandafter\ifx##1\relax\readarrayboundfailmsg%
- \setbox0=\hbox{\typeout{readarray Warning: ##1 out of bounds.}}%
+\def\checkbounds{\def\rootmacro@aux##1##2{%
+ \ifcsname##1[##2]\endcsname\csname##1[##2]\endcsname\else%
+ \readarrayboundfailmsg%
+ \typeout{readarray Warning: \readarraybackslash##1[##2] undefined.}%
\fi%
}\typeout{readarray: bounds checking ON}%
}
%
-\def\hypercheckbounds{\def\rootmacro@aux##1##2##3{##1%
- \expandafter\ifx##1\relax\readarrayboundfailmsg%
- \typeout{readarray Warning: ##1 out of bounds:}%
- \fi%
- \setcounter{index@count}{0}%
- \parse@index##3,\relax%
- \setcounter{loop@count}{0}%
- \whiledo{\value{loop@count}<\value{index@count}}{%
- \stepcounter{loop@count}%
- \ifnum\csname parsed@index[\theloop@count]\endcsname<0%
- \relax\typeout{\nonposmessage{##2}{##3}}\fi%
- }%
- \ifnum \value{index@count}=1\relax%
- \ifnum\csname parsed@index[1]\endcsname>%
- \csname##2CELLS\endcsname\relax\typeout{\recordmessage{##2}{##3}}\fi%
- \fi
- \ifnum \value{index@count}=2\relax%
- \ifnum\csname parsed@index[1]\endcsname>%
- \csname##2ROWS\endcsname\relax\typeout{\rowmessage{##2}{%
- \csname parsed@index[1]\endcsname}}\fi%
- \ifnum\csname parsed@index[2]\endcsname>%
- \csname##2COLS\endcsname\relax\typeout{\colmessage{##2}{%
- \csname parsed@index[2]\endcsname}}\fi%
- \fi
- \ifnum \value{index@count}=3\relax%
- \ifnum\csname parsed@index[1]\endcsname>%
- \csname##2PLANES\endcsname\relax\typeout{\planemessage{##2}{%
- \csname parsed@index[1]\endcsname}}\fi%
- \ifnum\csname parsed@index[2]\endcsname>%
- \csname##2ROWS\endcsname\relax\typeout{\rowmessage{##2}{%
- \csname parsed@index[2]\endcsname}}\fi%
- \ifnum\csname parsed@index[2]\endcsname>%
- \csname##2COLS\endcsname\relax\typeout{\colmessage{##2}{%
- \csname parsed@index[3]\endcsname}}\fi%
+\def\hypercheckbounds{\def\rootmacro@aux##1##2{%
+ \ifcsname##1[##2]\endcsname\csname##1[##2]\endcsname\else
+ \readarrayboundfailmsg%
+ \typeout{readarray Warning: \readarraybackslash##1[##2] undefined:}%
+ \setcounter{index@count}{0}%
+ \parse@index##2,\relax%
+ \forloop{@index}{1}{\value{@index}<\numexpr\theindex@count+1}{%
+ \ifnum\parsed@index[\the@index]<1%
+ \relax\typeout{ \nonpos@message{##1}{##2}}\fi%
+ }%
+ \ifnum \value{index@count}=1\relax%
+ \ifnum\parsed@index[1]>\csname##1CELLS\endcsname\relax
+ \typeout{ \record@message{##1}{##2}}\fi%
+ \fi
+ \ifnum \value{index@count}=2\relax%
+ \ifnum\parsed@index[1]>\csname##1ROWS\endcsname\relax
+ \typeout{ \row@message{##1}{\parsed@index[1]}}\fi%
+ \ifnum\parsed@index[2]>\csname##1COLS\endcsname\relax
+ \typeout{ \col@message{##1}{\parsed@index[2]}}\fi%
+ \fi
+ \ifnum \value{index@count}=3\relax%
+ \ifnum\parsed@index[1]>\csname##1PLANES\endcsname\relax
+ \typeout{ \plane@message{##1}{\parsed@index[1]}}\fi%
+ \ifnum\parsed@index[2]>\csname##1ROWS\endcsname\relax
+ \typeout{ \row@message{##1}{\parsed@index[2]}}\fi%
+ \ifnum\parsed@index[3]>\csname##1COLS\endcsname\relax
+ \typeout{ \col@message{##1}{\parsed@index[3]}}\fi%
+ \fi%
\fi%
}\typeout{readarray: bounds hyperchecking ON}%
}
@@ -122,30 +120,30 @@ element-by-element basis.]
%
\def\getArg@toks[#1]{\Arg@toks\expandafter\expandafter\expandafter{\Arg@list[#1]}}
%
-\newcommand\@readdef[3]{%
+\def\@readdef#1#2#3{%
\clear@array{#3}%
\edef\former@recordcount{\csname #3CELLS\endcsname}%
\def\first@row{T}%
\def\first@plane{T}%
- \catcode\endlinechar=9 %
+ \catcode\endlinechar=\readarrayendlinechar\relax %
\def#2{}%
\setcounter{@record}{0}%
\openin\rdar@file=#1%
\loop\unless\ifeof\rdar@file%
- \read\rdar@file to\rdar@fileline % Reads a line of the file into \rdar@fileline%
+ \read\rdar@file to\rdar@fileline % Reads file line into \rdar@fileline%
\addtocounter{@record}{1}%
\expandafter\g@addto@macro\expandafter#2\expandafter{\rdar@fileline}%
- \ifthenelse{\equal{\rdar@fileline}{}}{}{\expandafter\g@addto@macro%
- \expandafter#2\expandafter{\read@array@sepchar}}%
+ \ifx\rdar@fileline\empty\else\expandafter\g@addto@macro%
+ \expandafter#2\expandafter{\read@array@sepchar}\fi%
\if T\first@row\read@array{#2}\setcounter{@col}{\numexpr(\Arg@listlen-1)}%
\edef\ncols{\arabic{@col}}\def\first@row{F}\setcounter{@row}{1}%
\else%
\if T\first@plane%
- \ifthenelse{\equal{\rdar@fileline}{}}{%
+ \ifx\rdar@fileline\empty
\edef\nrows{\arabic{@row}}\def\first@plane{F}%
- }{%
+ \else
\addtocounter{@row}{1}%
- }%
+ \fi
\fi%
\fi%
\def\record@name{\csname #3[\the@record]\endcsname}%
@@ -163,18 +161,17 @@ element-by-element basis.]
}
%
\def\read@array@newsyntax[#1]#2#3[#4,#5]{%
- \edef\@arrayident{\rdar@macroname#3}%
\setcounter{index@count}{0}%
\parse@index#5,\relax%
\ifnum\value{index@count}=1\relax%
- \def\ra@TermA{\readArrayij#1{#2}}%
- \edef\ra@TermB{{\@arrayident}{\csname parsed@index[1]\endcsname}}%
+ \def\ra@TermA{\read@Arrayij[#1]{#2}}%
+ \edef\ra@TermB{{\rdar@macroname#3}{\parsed@index[1]}}%
\expandafter\ra@TermA\ra@TermB%
\else
\ifnum\value{index@count}=2\relax%
- \def\ra@TermA{\readArrayijk#1{#2}}%
- \edef\ra@TermB{{\@arrayident}{\csname parsed@index[1]\endcsname}%
- {\csname parsed@index[2]\endcsname}}%
+ \def\ra@TermA{\read@Arrayijk[#1]{#2}}%
+ \edef\ra@TermB{{\rdar@macroname#3}{\parsed@index[1]}%
+ {\parsed@index[2]}}%
\expandafter\ra@TermA\ra@TermB%
\fi\fi
}
@@ -184,29 +181,27 @@ element-by-element basis.]
\read@array[#1]{#2}%
\setcounter{@plane}{\numexpr(\Arg@listlen/#5/#4)}%
\setcounter{use@args}{\numexpr\arabic{@plane}*#4*#5}%
- \ifthenelse{\arabic{use@args} > \Arg@listlen}{%
+ \ifnum\arabic{use@args} > \Arg@listlen\relax
\addtocounter{@plane}{-1}%
\setcounter{use@args}{\numexpr\arabic{@plane}*#4*#5}%
- }{}%
+ \fi%
\expandafter\edef\csname#3PLANES\endcsname{\arabic{@plane}}%
\expandafter\edef\csname#3ROWS\endcsname{#4}%
\expandafter\edef\csname#3COLS\endcsname{#5}%
\expandafter\edef\csname#3CELLS\endcsname{\arabic{use@args}}%
- \setcounter{@index}{0}%
\setcounter{@plane}{1}%
\setcounter{@row}{1}%
\setcounter{@col}{0}%
- \whiledo{\value{@index} < \value{use@args}}{%
- \addtocounter{@index}{1}%
+ \forloop{@index}{1}{\value{@index} < \numexpr\value{use@args}+1}{%
\addtocounter{@col}{1}%
- \ifthenelse{\value{@col} > #5}%
- {\addtocounter{@row}{1}%
- \addtocounter{@col}{-#5}}%
- {}%
- \ifthenelse{\value{@row} > #4}%
- {\addtocounter{@plane}{1}%
- \addtocounter{@row}{-#4}}%
- {}%
+ \ifnum\value{@col} > #5\relax
+ \addtocounter{@row}{1}%
+ \addtocounter{@col}{-#5}%
+ \fi
+ \ifnum\value{@row} > #4\relax
+ \addtocounter{@plane}{1}%
+ \addtocounter{@row}{-#4}%
+ \fi
\def\arg@name{\csname#3[\the@plane,\the@row,\the@col]\endcsname}%
\getArg@toks[\the@index]%
\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter%
@@ -220,24 +215,22 @@ element-by-element basis.]
\read@array[#1]{#2}%
\setcounter{@row}{\numexpr(\Arg@listlen/#4)}%
\setcounter{use@args}{\numexpr\arabic{@row}*#4}%
- \ifthenelse{\arabic{use@args} > \Arg@listlen}{%
+ \ifnum\arabic{use@args} > \Arg@listlen\relax
\addtocounter{@row}{-1}%
\setcounter{use@args}{\numexpr\arabic{@row}*#4}%
- }{}%
+ \fi
\expandafter\edef\csname#3PLANES\endcsname{0}%
\expandafter\edef\csname#3ROWS\endcsname{\arabic{@row}}%
\expandafter\edef\csname#3COLS\endcsname{#4}%
\expandafter\edef\csname#3CELLS\endcsname{\arabic{use@args}}%
- \setcounter{@index}{0}%
\setcounter{@row}{1}%
\setcounter{@col}{0}%
- \whiledo{\value{@index} < \value{use@args}}{%
- \addtocounter{@index}{1}%
+ \forloop{@index}{1}{\value{@index} < \numexpr\value{use@args}+1}{%
\addtocounter{@col}{1}%
- \ifthenelse{\value{@col} > #4}%
- {\addtocounter{@row}{1}%
- \addtocounter{@col}{-#4}}%
- {}%
+ \ifnum\value{@col} > #4\relax
+ \addtocounter{@row}{1}%
+ \addtocounter{@col}{-#4}%
+ \fi
\def\arg@name{\csname#3[\the@row,\the@col]\endcsname}%
\getArg@toks[\the@index]%
\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter%
@@ -246,44 +239,163 @@ element-by-element basis.]
\define@rootmacro{#3}%
}
%
-\newcommand\clear@array[1]{%
- \expandafter\ifx\csname #1\endcsname\relax\else%
- \setcounter{@row}{0}%
- \whiledo{\value{@row}<\csname #1ROWS\endcsname}{%
- \stepcounter{@row}%
+\newcommand\read@array[2][]{%
+ \bgroup%
+ \ifx\empty\read@array@sepchar
+ \setsepchar{\empty}%
+ \else
+ \expandafter\setsepchar\expandafter{\read@array@sepchar}%
+ \fi
+ \greadlist#1\Arg@list{#2}%
+ \egroup%
+ \edef\Arg@listCELLS{\Arg@listlen}%
+}
+%
+\def\clear@array#1{%
+ \ifcsname #1\endcsname%
+ \forloop{@row}{1}{\value{@row}<\numexpr\csname #1ROWS\endcsname+1}{%
\ifnum\csname #1COLS\endcsname=0\relax%
- \expandafter\let\csname #1[\the@row]\endcsname\relax%
+ \expandafter\let\csname #1[\the@row]\endcsname\undefined%
\else
- \setcounter{@col}{0}%
- \whiledo{\value{@col}<\csname #1COLS\endcsname}{%
- \stepcounter{@col}%
+ \forloop{@col}{1}{\value{@col}<\numexpr\csname #1COLS\endcsname+1}{%
\ifnum\csname #1PLANES\endcsname=0\relax%
- \expandafter\let\csname #1[\the@row,\the@col]\endcsname\relax%
+ \expandafter\let\csname #1[\the@row,\the@col]\endcsname
+ \undefined%
\else
- \setcounter{@plane}{0}%
- \whiledo{\value{@plane}<\csname #1PLANES\endcsname}{%
- \stepcounter{@plane}%
+ \forloop{@plane}{1}{\value{@plane}<\numexpr\csname #1PLANES\endcsname+1}{%
\expandafter%
- \let\csname #1[\the@plane,\the@row,\the@col]\endcsname\relax%
+ \let\csname #1[\the@plane,\the@row,\the@col]\endcsname
+ \undefined%
}%
\fi%
}%
\fi%
}%
+ \expandafter\let\csname #1PLANES\endcsname\undefined
+ \expandafter\let\csname #1ROWS\endcsname\undefined
+ \expandafter\let\csname #1PLANES\endcsname\undefined
+ \expandafter\let\csname #1\endcsname\undefined
\fi%
}
%
-\newcommand\read@array[2][]{%
- \bgroup%
- \expandafter\setsepchar\expandafter{\read@array@sepchar}%
- \greadlist#1\Arg@list{#2}%
- \egroup%
- \edef\Arg@listCELLS{\Arg@listlen}%
+\def\setvalue#1[#2]#3{%
+ \ifcsname\rdar@macroname#1[#2]\endcsname
+ \expandafter\def\csname\rdar@macroname#1[#2]\endcsname{#3}%
+ \else
+ \typeout{readarray Warning (setvalue = #3):
+ \readarraybackslash\rdar@macroname#1[#2] undefined.}%
+ \fi%
+}
+%
+\def\readarray@initializedata#1[#2]#3{%
+ \expandafter\def\csname
+ \rdar@macroname#1[#2]\expandafter\endcsname\expandafter{#3}%
+}
+%
+\def\initarray#1[#2]{%
+ \edef\@tmp{\rdar@macroname#1}%
+ \expandafter\clear@array\expandafter{\@tmp}%
+ \expandafter\define@rootmacro\expandafter{\@tmp}%
+ \setcounter{index@count}{0}%
+ \parse@index#2,\relax
+ \ifnum\value{index@count}=2\relax
+ \setcounter{use@args}{\numexpr\parsed@index[1]*\parsed@index[2]}
+ \expandafter\def\csname\@tmp PLANES\endcsname{0}
+ \expandafter\edef\csname\@tmp ROWS\endcsname{\parsed@index[1]}
+ \expandafter\edef\csname\@tmp COLS\endcsname{\parsed@index[2]}
+ \expandafter\edef\csname\@tmp CELLS\endcsname{\theuse@args}
+ \forloop{@row}{1}{\value{@row}<\numexpr\parsed@index[1]+1}{%
+ \forloop{@col}{1}{\value{@col}<\numexpr\parsed@index[2]+1}{%
+ \readarray@initializedata#1[\the@row,\the@col]{\readarrayinitvalue}}}
+ \else
+ \ifnum\value{index@count}=3\relax
+ \setcounter{use@args}{\numexpr\parsed@index[1]*
+ \parsed@index[2]*\parsed@index[3]}
+ \expandafter\edef\csname\@tmp PLANES\endcsname{\parsed@index[1]}
+ \expandafter\edef\csname\@tmp ROWS\endcsname{\parsed@index[2]}
+ \expandafter\edef\csname\@tmp COLS\endcsname{\parsed@index[3]}
+ \expandafter\edef\csname\@tmp CELLS\endcsname{\theuse@args}
+ \forloop{@plane}{1}{\value{@plane}<\numexpr\parsed@index[1]+1}{%
+ \forloop{@row}{1}{\value{@row}<\numexpr\parsed@index[2]+1}{%
+ \forloop{@col}{1}{\value{@col}<\numexpr\parsed@index[3]+1}{%
+ \readarray@initializedata#1[\the@plane,\the@row,\the@col]{%
+ \readarrayinitvalue}}}}
+ \else
+ [initarray ERROR: 2-D or 3-D arrays only]
+ \fi
+ \fi
+}
+%
+\def\mergearray#1#2[#3]{%
+ \setcounter{index@count}{0}%
+ \parse@index#3,\relax
+ \ifnum\value{index@count}=2\relax
+ \forloop{@row}{1}{\value{@row}<
+ \numexpr\csname\rdar@macroname#1ROWS\endcsname+1}{%
+ \forloop{@col}{1}{\value{@col}<
+ \numexpr\csname\rdar@macroname#1COLS\endcsname+1}{%
+ \edef\tmpA{\the\numexpr\the@row+\parsed@index[1]-1,%
+ \the\numexpr\the@col+\parsed@index[2]-1}%
+ \edef\tmpB{\csname\rdar@macroname#1[\the@row,\the@col]\endcsname}%
+ \def\tmpC{\setvalue#2[\tmpA]}%
+ \expandafter\tmpC\expandafter{\tmpB}}}%
+ \else
+ \ifnum\value{index@count}=3\relax
+ \forloop{@plane}{1}{\value{@plane}<
+ \numexpr\csname\rdar@macroname#1PLANES\endcsname+1}{%
+ \forloop{@row}{1}{\value{@row}<
+ \numexpr\csname\rdar@macroname#1ROWS\endcsname+1}{%
+ \forloop{@col}{1}{\value{@col}<
+ \numexpr\csname\rdar@macroname#1COLS\endcsname+1}{%
+ \edef\tmpA{\the\numexpr\the@plane+\parsed@index[1]-1,%
+ \the\numexpr\the@row+\parsed@index[2]-1,%
+ \the\numexpr\the@col+\parsed@index[3]-1}%
+ \edef\tmpB{\csname\rdar@macroname#1%
+ [\the@plane,\the@row,\the@col]\endcsname}%
+ \def\tmpC{\setvalue#2[\tmpA]}%
+ \expandafter\tmpC\expandafter{\tmpB}}}}%
+ \else
+ [mergearray ERROR: 2-D or 3-D arrays only]
+ \fi
+ \fi
+}
+%
+\def\addtoArg@toks#1{\Arg@toks\expandafter{\the\Arg@toks#1}}
+\def\xaddtoArg@toks#1{\expandafter\addtoArg@toks\expandafter{#1}}
+\def\xxaddtoArg@toks#1{\expandafter\xaddtoArg@toks\expandafter{#1}}
+%
+\def\typesetarray#1{\noindent\Arg@toks{}%
+ \ifnum\csname\rdar@macroname#1PLANES\endcsname>0\relax
+ \forloop{@plane}{1}{\value{@plane}<
+ \numexpr\csname\rdar@macroname#1PLANES\endcsname+1}{%
+ \ifnum\the@plane=1 \else\xaddtoArg@toks{\typesetplanesepchar}\fi%
+ \forloop{@row}{1}{\value{@row}<
+ \numexpr\csname\rdar@macroname#1ROWS\endcsname+1}{%
+ \ifnum\the@row=1 \else\xaddtoArg@toks{\typesetrowsepchar}\fi%
+ \forloop{@col}{1}{\value{@col}<
+ \numexpr\csname\rdar@macroname#1COLS\endcsname+1}{%
+ \ifnum\the@col=1 \else\xaddtoArg@toks{\typesetcolsepchar}\fi%
+ \xaddtoArg@toks{\expandafter\typesetcell\expandafter
+ {\csname\rdar@macroname#1[\the@plane,\the@row,\the@col]\endcsname}}}%
+ }%
+ }%
+ \else
+ \forloop{@row}{1}{\value{@row}<
+ \numexpr\csname\rdar@macroname#1ROWS\endcsname+1}{%
+ \ifnum\the@row=1 \else\xaddtoArg@toks{\typesetrowsepchar}\fi%
+ \forloop{@col}{1}{\value{@col}<
+ \numexpr\csname\rdar@macroname#1COLS\endcsname+1}{%
+ \ifnum\the@col=1 \else\xaddtoArg@toks{\typesetcolsepchar}\fi%
+ \xaddtoArg@toks{\expandafter\typesetcell\expandafter
+ {\csname\rdar@macroname#1[\the@row,\the@col]\endcsname}}%
+ }%
+ }%
+ \fi
+ \the\Arg@toks
}
%
\def\define@rootmacro#1{%
- \expandafter\def\csname#1\endcsname[##1]{%
- \expandafter\rootmacro@aux\csname #1[##1]\endcsname{#1}{##1}}%
+ \expandafter\def\csname#1\endcsname[##1]{\rootmacro@aux{#1}{##1}}%
}
%
\def\parse@index#1,#2\relax{%
@@ -291,21 +403,43 @@ element-by-element basis.]
\expandafter\gdef\csname parsed@index[\theindex@count]\endcsname{#1}%
\ifx\relax#2\relax\else\parse@index#2\relax\fi%
}
+%
+\def\parsed@index[#1]{\csname parsed@index[#1]\endcsname}
+%
% INITIALIZATION
+% ON \readdef, SEP CHAR INSERTED AFTER EACH RECORD;
+% ON \readarray, SEP CHAR SERVES AS DATA-FIELD SEPARATOR
\readarraysepchar{ }
-\nocheckbounds
+% ON \readdef, IGNORE END-LINE CHARS BY DEFAULT (NORMAL LaTeX MODE = 5)
+\readarrayendlinechar=9
+% DEFAULT CELL DATA FOR \initarray
+\def\readarrayinitvalue{-}
+% DEFAULT FIELD SEPARATORS FOR \typesetarray
+\def\typesetplanesepchar{\\---\\}
+\def\typesetrowsepchar{\\}
+\def\typesetcolsepchar{,}
+% DEFAULT CELL FORMATTING ON \typesetarray
+\def\typesetcell#1{#1}
%
-\def\nonposmessage#1#2{Negative index [#2] impermissable for #1.}
-\def\recordmessage#1#2{RECORD=#2 exceeds bounds(=\csname#1CELLS\endcsname) for #1.}
-\def\planemessage#1#2{PLANE=#2 exceeds bounds(=\csname#1PLANES\endcsname) for #1.}
-\def\rowmessage#1#2{ROW=#2 exceeds bounds(=\csname#1ROWS\endcsname) for #1.}
-\def\colmessage#1#2{COL=#2 exceeds bounds(=\csname#1COLS\endcsname) for #1.}
+\nocheckbounds% DEFAULT IS NO BOUNDS CHECKING
%
-\def\the@showargs@rule{\kern.2pt\rule{.8ex}{1.6ex}\hspace{.2pt}}%
-\def\readarrayboundfailmsg{?}% DISPLAYED WHEN ARRAY CALL OUT OF BOUNDS
+\def\nonpos@message#1#2{Nonpositive index [#2] prohibited for \ra@nm#1.}
+\def\record@message#1#2{%
+ RECORD=#2 exceeds bounds(=\csname#1CELLS\endcsname) for \ra@nm#1.}
+\def\plane@message#1#2{%
+ PLANE=#2 exceeds bounds(=\csname#1PLANES\endcsname) for \ra@nm#1.}
+\def\row@message#1#2{%
+ ROW=#2 exceeds bounds(=\csname#1ROWS\endcsname) for \ra@nm#1.}
+\def\col@message#1#2{%
+ COL=#2 exceeds bounds(=\csname#1COLS\endcsname) for \ra@nm#1.}
+%
+\def\readarrayboundfailmsg{?}% WHEN ARRAY CALL OUT OF BOUNDS, IF BOUNDS CHECKING ON
+\def\ra@nm#1.{\readarraybackslash#1.}
%
-% SUPPORT/DEBUG ROUTINES
+% SUPPORT/DEBUG ROUTINES
+% (THESE ARE DEPRECATED...CONSIDER USING \typesetarray AS AN ALTERNATIVE)
%
+\def\the@showargs@rule{\kern.2pt\rule{.8ex}{1.6ex}\hspace{.2pt}}%
% \arraydump INITIALIZATIONS
\def\row@spacer{\\}
\def\row@msg{\the@showargs@rule\hfill{\scriptsize\scshape$<$\row@sign~\arabic{@row}$>$}}
@@ -315,32 +449,27 @@ element-by-element basis.]
\def\close@out{}
%
\newcommand\arraydump[1]{%
- \edef\@arrayident{\rdar@macroname#1}%
- \expandafter\ifx\csname\@arrayident\endcsname\relax\else%
- \edef\ra@TmpA{\csname\@arrayident PLANES\endcsname}%
- \edef\ra@TmpB{\csname\@arrayident COLS\endcsname}%
+ \expandafter\ifx\csname\rdar@macroname#1\endcsname\relax\else%
+ \edef\ra@TmpA{\csname\rdar@macroname#1PLANES\endcsname}%
+ \edef\ra@TmpB{\csname\rdar@macroname#1COLS\endcsname}%
\def\ra@rank{3-D}%
\ifnum\ra@TmpA=0\relax\def\ra@TmpA{1}\def\plane@sign{\mbox{}}\def\ra@rank{2-D}%
\else\def\plane@sign{{\scriptsize\scshape Plane \arabic{@plane}}}\fi%
\ifnum\ra@TmpB=0\relax\def\ra@TmpB{1}\def\row@sign{Record}\def\ra@rank{1-D}%
\else\def\row@sign{Row}\fi%
\par\noindent\header@msg%
- \setcounter{@plane}{0}%
- \whiledo{\value{@plane}<\ra@TmpA}{%
- \stepcounter{@plane}%
+ \forloop{@plane}{1}{\value{@plane}<\numexpr\ra@TmpA+1}{%
\plane@msg%
- \setcounter{@row}{0}%
- \whiledo{\value{@row}<\csname\@arrayident ROWS\endcsname}{%
- \ifnum\value{@row}=0\relax\else\row@spacer\fi%
- \stepcounter{@row}%
- \setcounter{@col}{0}%
- \whiledo{\value{@col}<\ra@TmpB}{%
+ \forloop{@row}{1}{\value{@row}<
+ \numexpr\csname\rdar@macroname#1ROWS\endcsname+1}{%
+ \ifnum\value{@row}=1\relax\else\row@spacer\fi%
+ \forloop{@col}{1}{\value{@col}<
+ \numexpr\ra@TmpB+1}{%
\the@showargs@rule%
- \stepcounter{@col}%
- \ifnum\csname\@arrayident COLS\endcsname=0\relax%
+ \ifnum\csname\rdar@macroname#1COLS\endcsname=0\relax%
#1[\the@row]%
\else%
- \ifnum\csname\@arrayident PLANES\endcsname=0\relax%
+ \ifnum\csname\rdar@macroname#1PLANES\endcsname=0\relax%
#1[\the@row,\the@col]%
\else%
#1[\the@plane,\the@row,\the@col]%
@@ -355,13 +484,35 @@ element-by-element basis.]
\newcommand\scalardump[1]{\bgroup%
\def\row@spacer{}%
\def\row@msg{}%
- \def\header@msg{{\bfseries\csname\@arrayident CELLS\endcsname\ ELEMENTS:}%
+ \def\header@msg{{\bfseries\csname\rdar@macroname####1CELLS\endcsname\ ELEMENTS:}%
~\hrulefill\mbox{}\\}%
\def\last@row{}%
\def\plane@msg{}%
\def\close@out{\the@showargs@rule\\}%
\arraydump#1\egroup%
}
+
+\endinput
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+COMMANDS THAT WERE DEPRECATED IN v2.0 (2016-11-10), NOT BEING IN THE PREFERRED
+PACKAGE SYNTAX, THAT HAVE BEEN ELIMINATED in v3.0 (2021)
+CODE PROVIDED BELOW AS A COPY/PASTE LAST RESORT FOR STRAGGLERS
+
+\usepackage{ifthen}
%
% DEPRECATED COMMANDS (NOT PREFERRED EMBODIMENT OF PACKAGE SYNTAX)
%
@@ -422,6 +573,4 @@ element-by-element basis.]
\Arg@list[\value{@index}]}%
}%
}
-\endinput
-