diff options
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r-- | Master/texmf-dist/tex/latex/readarray/readarray.sty | 415 |
1 files changed, 282 insertions, 133 deletions
diff --git a/Master/texmf-dist/tex/latex/readarray/readarray.sty b/Master/texmf-dist/tex/latex/readarray/readarray.sty index 562fca33237..fb6c2ba90d5 100644 --- a/Master/texmf-dist/tex/latex/readarray/readarray.sty +++ b/Master/texmf-dist/tex/latex/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 - |