summaryrefslogtreecommitdiff
path: root/macros/generic/arrayjobx/arrayjobx.sty
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/generic/arrayjobx/arrayjobx.sty
Initial commit
Diffstat (limited to 'macros/generic/arrayjobx/arrayjobx.sty')
-rw-r--r--macros/generic/arrayjobx/arrayjobx.sty192
1 files changed, 192 insertions, 0 deletions
diff --git a/macros/generic/arrayjobx/arrayjobx.sty b/macros/generic/arrayjobx/arrayjobx.sty
new file mode 100644
index 0000000000..fb533f625a
--- /dev/null
+++ b/macros/generic/arrayjobx/arrayjobx.sty
@@ -0,0 +1,192 @@
+% ARRAY STRUCTURE - arrayjobx.sty - Version 1.04 - 05/03/10
+%
+% By Zhuhan Jiang (01/05/95), extracted from formlett.sty
+% (see CTAN/macros/generic/formlett.sty from line 344 to line 483)
+%
+% This program can be redistributed and/or modified under the terms
+% of the LaTeX Project Public License distributed from CTAN archives
+% in directory macros/latex/base/lppl.txt
+%
+% * 01/05/95 - Version 1.00
+% + Original version
+% * 12/21/99 - Version 1.01
+% + Spurious blanks removed in \read@array and \get@max@count
+% (reported by Antonio Leitao <aml@gia.ist.utl.pt>
+% and Denis Girou <Denis.Girou@idris.fr>)
+% * 04/05/00 - Version 1.02
+% + Add the \ifexpandarrayelement macro to allow to evaluate
+% or not the content to put as an element of the array
+% (from Denis Girou <Denis.Girou@idris.fr>)
+% + Put this package under the terms of the LaTeX Project
+% Public License
+% * 05/03/00 - Version 1.03
+% + Add a \ProvidesPackage macro when LaTeX is used
+% (according to the example given by Bernd Raichle
+% <raichle@Informatik.Uni-Stuttgart.DE>)
+% * 05/03/10 - Version 1.04
+% + Change the name of the macro \array to \arrayx
+% to avoid conflict with macros in the amsmath package.
+% Change suggested by Michael Sharpe (msharpe at ucsd.edu)
+%
+%
+% \newarray\ARRAYNAME
+% \delarray\ARRAYNAME
+%
+% \ARRAYNAME(A1,..,An)={T}
+% \readarray{ARRAYNAME}{ B1 & B2 & ... & Bm }
+% \dataheight
+%
+% \data(A1,...,An)=\data( A1 + (A2-1)*\dataheight +
+% ... + (An-1)*\dataheight^{n-1} )
+% if \normalindextrue
+% =\data( An + (An-1 -1)*\dataheight +
+% ... + (A1-1)*\dataheight^{n-1} )
+% if \normalindexfalse
+%
+% \checkARRAYNAME(A1,..,An)
+% \ifemptydata valid when \checkARRAYNAME is just executed
+% \cachedata: keeps the data of \ARRAYNAME(m)
+% when \checkARRAYNAME(m) is executed
+%
+% OTHERS:
+% save to array: \arrayx{n}(m)={T}
+% get from array: \arrayx{n}(m)
+% clear element: \clrarray{n}(m)
+% test element: \testarray{n}(m)
+% macro save to \temp@macro
+%
+%
+% e.g.
+%
+% \newarray\Table
+% \readarray{Table}{one&two& \unknownmacro && &six}
+% \Table(7)={seven}
+% \dataheight=0 % or 1 or < 0
+% \Table(7) = \Table(2,6,1) % 7=1+(2-1)+(6-1)+(1-1)
+% \normalindexfalse
+% \dataheight=3
+% \Table(7) = \Table(1,7) = \Table(3,1)
+% \normalindextrue
+% \Table(7) = \Table(7,1) = \Table(1,3)
+%
+% \checkTable(4) \ifemptydata (4)=empty \fi
+% \checkTable(5) \ifemptydata\else (5)=nonempty \fi
+% \ifx\cachedata\space ={\tt <space>}\fi
+% \checkTable(1000) \ifemptydata (1000)=empty \fi
+%
+% \delarray\Table
+%
+%
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname ProvidesPackage\endcsname\relax%
+\else
+ \ProvidesPackage{arrayjobx}[2010/05/03 v1.04 Array management]
+\fi
+%
+\xdef\EntryArrayJob{\the\catcode`\@}\catcode`\@=11\relax
+\newif\ifemptydata \newcount\dataheight
+\newif\ifnormalindex \normalindexfalse
+%
+\newcount\array@width \newcount\index@count \newcount\index@total
+\newif\ifone@VEC \newif\if@rev@index
+\newtoks\temp@toks \newcount\temp@count
+\newcount\temp@@count \newcount\temp@@@count
+%
+\newif\ifexpandarrayelement
+%
+\long\def\assign@VEC#1(#2)=#3{\temp@count=#2 \relax
+\get@max@count{total@#1}\temp@count
+\ifexpandarrayelement
+ \expandafter\xdef\csname#1#2\string~\endcsname{#3}%
+\else
+ \expandafter\gdef\csname#1#2\string~\endcsname{#3}%
+\fi}
+\def\get@VEC#1(#2){\csname#1#2\string~\endcsname}
+\def\clrarray#1(#2){%
+ \global\expandafter\let\csname#1#2\string~\endcsname=\undefined@}
+%
+\def\testarray#1(#2){%
+ \expandafter\let\expandafter\temp@macro\csname#1#2\string~\endcsname
+ \ifx\temp@macro\relax \def\temp@macro{}\fi}%
+%
+\def\arrayx#1(#2){\def\check@VEC{%
+ \ifx=\next@VEC \def\full@VEC####1{\assign@VEC#1(#2)####1}%
+ \else \def\full@VEC{\get@VEC#1(#2)}\fi \full@VEC}%check@VEC
+\futurelet\next@VEC\check@VEC}
+%
+\def\get@index(#1)#2\safty@mark{\one@VEC#2,\safty@mark
+ \def\next@@VEC{#1}\ifx\next@@VEC\empty\def\next@@VEC{\array@width}\fi
+ \if@rev@index
+ {\temp@count=1 \advance\index@count1 \relax
+ \ifnum\index@count<\index@total
+ \loop \multiply\temp@count \next@@VEC
+ \advance\index@count-1 \relax
+ \ifnum\index@count>0 \repeat
+ \fi \global\temp@@count\temp@count }%
+ \else \multiply\temp@@count \next@@VEC \fi
+ \ifnum\temp@@count=0 \temp@@count=1 \relax \fi
+ \advance\temp@count-1 \ifnum\temp@count<0 \temp@count=0 \fi
+ \multiply\temp@count \temp@@count
+ \advance\temp@@@count by \temp@count \advance\index@count1
+ \ifone@VEC
+ \def\next@@VEC{\index@total=\index@count \advance\temp@@@count1 }%
+ \else \one@VEC#2\safty@mark \edef\next@@VEC{\noexpand\get@index(#1)%
+ \the\temp@toks\noexpand\safty@mark}%
+ \fi \next@@VEC}%
+%
+\def\one@VEC#1,#2\safty@mark{\def\temp@macro{#2}\temp@toks={#2}%
+ \ifx\temp@macro\empty \one@VECtrue \else \one@VECfalse \fi
+ \temp@count=#1 \relax }%
+%
+\def\get@all@index(#1)#2\safty@mark{%
+ \temp@@@count=0 \temp@@count=0 \index@count=0 \@rev@indexfalse
+ \get@index(#1)#2\safty@mark
+ \ifnormalindex\else
+ \temp@@@count=0 \temp@@count=0 \index@count=0 \@rev@indextrue
+ \get@index(#1)#2\safty@mark \fi }%
+%
+\def\read@array[#1]#2#3{\temp@count=1
+ \def\one@item##1#1##2\safty@mark{\def\temp@macro{##2}\temp@toks={##2}%
+ \ifx\temp@macro\empty\else
+ \def\temp@macro{\one@item##2\safty@mark}\fi
+ {\temp@toks={##1}\def\temp@@macro{\arrayx{#2}(\the\temp@count)=}%
+ \expandafter\temp@@macro\expandafter{\the\temp@toks}}%
+ \expandafter\edef\csname total@#2\endcsname{\the\temp@count}%
+ \advance\temp@count1\temp@macro}%
+ \one@item#3#1\safty@mark}%
+%
+\def\strip@esc#1{\temp@count=\escapechar \escapechar=-1 %
+ \temp@toks=\expandafter{\string#1}\escapechar\temp@count}
+\def\get@max@count#1#2{\edef\temp@macro{\csname #1\endcsname}%
+ \ifnum\temp@macro<#2\expandafter\xdef\csname #1\endcsname{\the#2}\fi}%
+%
+\def\newarray#1{\strip@esc{#1}%
+ \expandafter\gdef\csname total@\the\temp@toks\endcsname{0}%
+ \expandafter\edef\csname\the\temp@toks\endcsname(##1)%
+ {\noexpand\get@all@index(\noexpand\dataheight)##1\noexpand\safty@mark
+% \noexpand\get@max@count{total@\the\temp@toks}\noexpand\temp@@@count
+ \noexpand\arrayx{\the\temp@toks}(\noexpand\the\noexpand\temp@@@count)}%
+ \expandafter\edef\csname check\the\temp@toks\endcsname(##1)%
+ {\noexpand\get@all@index(\noexpand\dataheight)##1\noexpand\safty@mark
+ \noexpand\testarray{\the\temp@toks}(\noexpand\the
+ \noexpand\temp@@@count)\noexpand\let\noexpand\cachedata
+ \noexpand\temp@macro\noexpand\ifx\noexpand\temp@macro\noexpand\empty
+ \noexpand\emptydatatrue\noexpand\else\noexpand\emptydatafalse
+ \noexpand\fi}}%
+%
+\def\delarray#1{\strip@esc{#1}% delete array globally
+ \temp@count=0 \temp@@count=\csname total@\the\temp@toks\endcsname
+ \loop \expandafter\global\expandafter\let
+ \csname\the\temp@toks\string~\endcsname\undefined@
+ \advance\temp@count1 %
+ \ifnum\temp@count<\temp@@count \repeat % global loop for less memory
+ \global\expandafter\let\csname total@\the\temp@toks\endcsname\undefined@
+ \global\expandafter\let\csname \the\temp@toks\endcsname\undefined@
+ \global\expandafter\let\csname check\the\temp@toks\endcsname\undefined@ }%
+%
+\def\readarray#1#2{\read@array[&]{#1}{#2}}%
+%
+\catcode`\@=\EntryArrayJob\relax
+\endinput
+%
+% END OF MACROS