From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/generic/arrayjobx/arrayjobx.sty | 192 +++++++++++++++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 macros/generic/arrayjobx/arrayjobx.sty (limited to 'macros/generic/arrayjobx/arrayjobx.sty') 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 +% and Denis Girou ) +% * 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 ) +% + 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 +% ) +% * 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 }\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 -- cgit v1.2.3