diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/coollist/coollist.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/coollist/coollist.dtx | 328 |
1 files changed, 264 insertions, 64 deletions
diff --git a/Master/texmf-dist/source/latex/coollist/coollist.dtx b/Master/texmf-dist/source/latex/coollist/coollist.dtx index 964cda37de4..2d86d834ef7 100644 --- a/Master/texmf-dist/source/latex/coollist/coollist.dtx +++ b/Master/texmf-dist/source/latex/coollist/coollist.dtx @@ -2,16 +2,19 @@ % %<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01] %<package>\ProvidesPackage{coollist} -%<package> [2007/10/06 v1.1 COntent Oriented LaTeX Lists] +%<package> [2007/10/06 v1.2 COntent Oriented LaTeX Lists] %<package>\RequirePackage{ifthen} %<package>\RequirePackage{amsmath} %<package>\RequirePackage{amssymb} +%<package>\RequirePackage{coolstr} +%<package>\RequirePackage{forloop} % % %<*driver> \documentclass{ltxdoc} \usepackage{coollist} \usepackage{url} +\usepackage{pdflscape} \EnableCrossrefs \CodelineIndex \RecordChanges @@ -22,7 +25,7 @@ % \fi % % -% \CheckSum{74} +% \CheckSum{211} % % %% \CharacterTable @@ -51,7 +54,7 @@ % \DoNotIndex{\@ne,\expandafter} % \DoNotIndex{\advance,\begingroup,\catcode,\closein} % \DoNotIndex{\newcommand,\renewcommand,\providecommand} -% \DoNotIndex{\closeout,\day,\def,\edef,\gdef,\let,\empty,\endgroup} +% \DoNotIndex{\closeout,\day,\def,\edef,\gdef,\xdef,\let,\empty,\endgroup} % \DoNotIndex{\newcounter,\providecounter,\addtocounter,\setcounter,\stepcounter,\value,\arabic} % \DoNotIndex{\if,\fi,\ifthenelse,\else,\setboolean,\boolean,\newboolean,\provideboolean,\equal,\AND,\OR,\NOT,\whiledo} % \DoNotIndex{\ifcase,\ifcat,\or,\else} @@ -122,8 +125,8 @@ % The default values are % % \begin{tabular}{ll} -% |listStop| & \makeatletter |@@| \makeatother \\ -% |listEnd| & \makeatletter |@@@| \makeatother +% |listStop| & \makeatletter |@@| \makeatother \\ +% |listEnd| & \makeatletter |@@@| \makeatother % \end{tabular} % % @@ -158,6 +161,13 @@ % % % +% \DescribeMacro{\listsum} +% |\listsum|\marg{list}\marg{macro} stores the sum of the comma delimited list \meta{list} in the macro +% \meta{macro}. Integers are recognized and summed accordingly. All other tokens are summed as variables with some +% integer coefficient as the end result. +% +% +% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %\section{Test Cases} @@ -173,9 +183,9 @@ % \DescribeMacro{\listval} % % \begin{tabular}{ll} -% |\listval{1,2,3,4}{0}| & \listval{1,2,3,4}{0} (the null string) \\ -% |$\listval{\alpha,\beta,\gamma}{2}$| & $\listval{\alpha,\beta,\gamma}{2}$ \\ -% |\listval{a,b,c}{4}| & \listval{a,b,c}{4} (the null string) +% |\listval{1,2,3,4}{0}| & \listval{1,2,3,4}{0} (the null string) \\ +% |$\listval{\alpha,\beta,\gamma}{2}$| & $\listval{\alpha,\beta,\gamma}{2}$ \\ +% |\listval{a,b,c}{4}| & \listval{a,b,c}{4} (the null string) % \end{tabular} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -188,16 +198,16 @@ % % \begin{tabular}{ll} % |\liststore{1,2,3,4}{temp}| -% \\ -% |\tempi;\tempii;\tempiii;\tempiv| & \liststore{1,2,3,4}{temp} \tempi;\tempii;\tempiii;\tempiv -% \\[1cm] +% \\ +% |\tempi;\tempii;\tempiii;\tempiv| & \liststore{1,2,3,4}{temp} \tempi;\tempii;\tempiii;\tempiv +% \\[1cm] % |\liststore{a_1,a_2,a_3,a_4}{temp}| -% \\ -% |$\tempi;\tempii;\tempiii;\tempiv$| & \liststore{a_1,a_2,a_3,a_4}{temp} $\tempi;\tempii;\tempiii;\tempiv$ -% \\[1cm] +% \\ +% |$\tempi;\tempii;\tempiii;\tempiv$| & \liststore{a_1,a_2,a_3,a_4}{temp} $\tempi;\tempii;\tempiii;\tempiv$ +% \\[1cm] % |\liststore{a,b}{temp}| -% \\ -% |\tempi;\tempii| & \liststore{a,b,c}{temp} \tempi;\tempii +% \\ +% |\tempi;\tempii| & \liststore{a,b,c}{temp} \tempi;\tempii % \end{tabular} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -209,10 +219,10 @@ % \DescribeMacro{\listlen} % % \begin{tabular}{ll} -% |\listlen{1,2,3,4,5}| & \listlen{1,2,3,4,5} \\ -% |\listlen{}| & \listlen{} \\ -% |\listlen{1,2}| & \listlen{1,2} \\ -% |\listlen{1}| & \listlen{1} +% |\listlen{1,2,3,4,5}| & \listlen{1,2,3,4,5} \\ +% |\listlen{}| & \listlen{} \\ +% |\listlen{1,2}| & \listlen{1,2} \\ +% |\listlen{1}| & \listlen{1} % \end{tabular} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -226,16 +236,36 @@ % % \begin{tabular}{ll} % |\listlenstore{thelistlength}{1,2,3,4,5}| -% \\ -% |\arabic{thelistlength}| & \listlenstore{thelistlength}{1,2,3,4,5} \arabic{thelistlength} -% \\[1cm] +% \\ +% |\arabic{thelistlength}| & \listlenstore{thelistlength}{1,2,3,4,5} \arabic{thelistlength} +% \\[1cm] % |\listlenstore{thelistlength}{}| -% \\ -% |\arabic{thelistlength}| & \listlenstore{thelistlength}{} \arabic{thelistlength} -% \\[1cm] +% \\ +% |\arabic{thelistlength}| & \listlenstore{thelistlength}{} \arabic{thelistlength} +% \\[1cm] % \end{tabular} % % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % +%\subsection{\texttt{$\backslash$listsum}} +% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \DescribeMacro{\listsum} Summing elements of lists +% +% \begin{tabular}{ll} +% |\listsum{1,2,3,4,5}{\thelistsum}| \\ +% |\thelistsum| & \listsum{1,2,3,4,5}{\thelistsum}\thelistsum \\[1cm] +% |\listsum{1,2,3,a,b,a,a}{\thelistsum}| \\ +% |\thelistsum| & \listsum{1,2,3,a,b,a,a}{\thelistsum}\thelistsum \\[1cm] +% |\listsum{a,b,c,d}{\thelistsum}| \\ +% |\thelistsum| & \listsum{a,b,c,d}{\thelistsum}\thelistsum +% \end{tabular} +% +% +% \begin{landscape} +% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %\section{Implementation} @@ -290,40 +320,40 @@ % \begin{macrocode} \def\COOL@listgobble[#1]#2,#3,\COOL@listEnd{% \ifthenelse{\equal{#3}{\COOL@listStop}}% - {% + {% % \end{macrocode} % % we have reached the end of the list, just need to check if we need to output something % % \begin{macrocode} - \ifthenelse{\value{COOL@listpointer}=#1}% - {% - \setboolean{COOL@found}{true}% - #2% - }% - % Else - {% - }% - }% + \ifthenelse{\value{COOL@listpointer}=#1}% + {% + \setboolean{COOL@found}{true}% + #2% + }% + % Else + {% + }% + }% % Else - {% - \ifthenelse{\value{COOL@listpointer}=#1}% - {% - \setboolean{COOL@found}{true}% - #2% - }% - % Else - {% - }% - \stepcounter{COOL@listpointer}% + {% + \ifthenelse{\value{COOL@listpointer}=#1}% + {% + \setboolean{COOL@found}{true}% + #2% + }% + % Else + {% + }% + \stepcounter{COOL@listpointer}% % \end{macrocode} % % We must eat up the whole list no matter what or else the stuff beyond |#1| will be displayed. so we need % to call ``the gobbler" again. % % \begin{macrocode} - \COOL@listgobble[#1]#3,\COOL@listEnd% - }% + \COOL@listgobble[#1]#3,\COOL@listEnd% + }% }% % \end{macrocode} % @@ -349,31 +379,31 @@ % % \begin{macrocode} \ifthenelse{\equal{#1}{}}% - {% + {% % \end{macrocode} % % set the listpointer to zero because the list has no length % \begin{macrocode} - \setcounter{COOL@listpointer}{0}% - }% + \setcounter{COOL@listpointer}{0}% + }% % \end{macrocode} % % Else % % \begin{macrocode} - {% + {% % \end{macrocode} % % start at the beginning of the list, so initialize |listpointer| % % \begin{macrocode} - \setcounter{COOL@listpointer}{1}% + \setcounter{COOL@listpointer}{1}% % \end{macrocode} % % Assume that the target will not be found---it will be set to true by ``the gobbler" if it is % % \begin{macrocode} - \setboolean{COOL@found}{false}% + \setboolean{COOL@found}{false}% % \end{macrocode} % % Now call the gobbler---since the user shouldn't be forced to submit the end character (in fact @@ -382,8 +412,8 @@ % the entire list is read in by |\COOL@listgobbler| we need the list stop `character' too. % % \begin{macrocode} - \COOL@listgobble[#2]#1,\COOL@listStop,\COOL@listEnd% - }% + \COOL@listgobble[#2]#1,\COOL@listStop,\COOL@listEnd% + }% }% % \end{macrocode} % @@ -416,15 +446,15 @@ % \begin{macrocode} \def\COOL@liststore@gobbler[#1]#2,#3,\COOL@listEnd{% \ifthenelse{\equal{#3}{\COOL@listStop}}% - {% - \expandafter\gdef\csname #1\roman{COOL@listpointer}\endcsname{#2}% - }% + {% + \expandafter\gdef\csname #1\roman{COOL@listpointer}\endcsname{#2}% + }% % Else - {% - \expandafter\gdef\csname #1\roman{COOL@listpointer}\endcsname{#2}% - \stepcounter{COOL@listpointer}% - \COOL@liststore@gobbler[#1]#3,\COOL@listEnd% - }% + {% + \expandafter\gdef\csname #1\roman{COOL@listpointer}\endcsname{#2}% + \stepcounter{COOL@listpointer}% + \COOL@liststore@gobbler[#1]#3,\COOL@listEnd% + }% } \newcommand{\liststore}[2]{% \setcounter{COOL@listpointer}{1}% @@ -477,5 +507,175 @@ % % % +% \begin{macro}{\listsum} +% \changes{v1.2}{2007/10/10}{added this function to the package} +% Sum the contents of the list. Integers are recognized and summed, tokens are treated as independent variables. +% The function returns a string of the sum +% +% Counter for the coefficients +% \begin{macrocode} +\newcounter{COOL@intsum} +% \end{macrocode} +% Counter for the register index +% \begin{macrocode} +\newcounter{COOL@register@ct} +\newcounter{COOL@register@len} +% \end{macrocode} +% boolean for identifying integers +% \begin{macrocode} +\newboolean{COOL@listsum@isint} +% \end{macrocode} +% +% Now the function +% +% \begin{macrocode} +\newcommand{\listsum}[2]{% +% \end{macrocode} +% First store the entire list +% \begin{macrocode} +\liststore{#1}{COOL@listtosum@element@}% +% \end{macrocode} +% store the length of the list +% \begin{macrocode} +\listlenstore{COOL@listlen}{#1}% +% \end{macrocode} +% check for the list having a non-zero length +% \begin{macrocode} +\ifthenelse{ \value{COOL@listlen} < 1 }% + {% + \PackageWarning{cool}{List is empty}% + \xdef#2{0}% + }% +% \end{macrocode} +% Else +% \begin{macrocode} + {% +% \end{macrocode} +% put the first list element into the register +% \begin{macrocode} + \isint{\COOL@listtosum@element@i}{COOL@listsum@isint}% + \ifthenelse{ \boolean{COOL@listsum@isint} }% + {% + \xdef\COOL@listsum@register@integers{\COOL@listtosum@element@i}% + \setcounter{COOL@register@len}{0}% + }% +% \end{macrocode} +% Else +% \begin{macrocode} + {% +% \end{macrocode} +% Initialize the integers register to zero; store the character and its coefficient +% \begin{macrocode} + \gdef\COOL@listsum@register@integers{0}% + \xdef\COOL@listsum@register@i{\COOL@listtosum@element@i}% + \gdef\COOL@listsum@register@coef@i{1}% + \setcounter{COOL@register@len}{1}% + }% +% \end{macrocode} +% Now go through each additional element making an index of the symbols and summing identical ones +% \begin{macrocode} + \forloop{COOL@listpointer}{2}{\NOT \value{COOL@listpointer} > \value{COOL@listlen}}% + {% +% \end{macrocode} +% Expand the element to a convenient storage macro +% \begin{macrocode} + \xdef\COOL@listsum@element{\csname COOL@listtosum@element@\roman{COOL@listpointer}\endcsname}% +% \end{macrocode} +% Check if this element is an integer +% \begin{macrocode} + \isint{\COOL@listsum@element}{COOL@listsum@isint}% + \ifthenelse{ \boolean{COOL@listsum@isint} }% + {% +% \end{macrocode} +% Grab the current value of the integers and store it in the register counter +% \begin{macrocode} + \setcounter{COOL@intsum}{\COOL@listsum@register@integers}% + \addtocounter{COOL@intsum}{\COOL@listsum@element}% + \xdef\COOL@listsum@register@integers{\arabic{COOL@intsum}}% + }% +% \end{macrocode} +% Else, it's not an integer so search to see if it matches known elements +% \begin{macrocode} + {% + \setboolean{COOL@found}{false}% + \forloop{COOL@register@ct}{1}{\NOT \value{COOL@register@ct} > \value{COOL@register@len}}% + {% + \xdef\COOL@listsum@known@element{% + \csname COOL@listsum@register@\roman{COOL@register@ct}\endcsname% + }% + \ifthenelse{ \equal{\COOL@listsum@element}{\COOL@listsum@known@element} }% + {% +% \end{macrocode} +% found the element so increment the coefficient +% (grab coefficient, store in ct, increment ct, store new ct) +% \begin{macrocode} + \xdef\COOL@listsum@known@element@coef{% + \csname COOL@listsum@register@coef@\roman{COOL@register@ct}\endcsname% + }% + \setcounter{COOL@intsum}{\COOL@listsum@known@element@coef}% + \addtocounter{COOL@intsum}{1}% + \expandafter\xdef\csname COOL@listsum@register@coef@\roman{COOL@register@ct}\endcsname{\arabic{COOL@intsum}}% +% \end{macrocode} +% flag the element as found and set the counter to the length of the register $+1$ +% \begin{macrocode} + \setboolean{COOL@found}{true}% + }% +% \end{macrocode} +% Else do nothing +% \begin{macrocode} + {% + }% + }% +% \end{macrocode} +% Check to see if the element is a known element. If not, add it to the register +% \begin{macrocode} + \ifthenelse{ \boolean{COOL@found} }% + {}% +% \end{macrocode} +% Else +% \begin{macrocode} + {% + \addtocounter{COOL@register@len}{1}% + \expandafter\xdef\csname COOL@listsum@register@\roman{COOL@register@len}\endcsname{\COOL@listsum@element}% + \expandafter\xdef\csname COOL@listsum@register@coef@\roman{COOL@register@len}\endcsname{1}% + }% + }% + }% +% \end{macrocode} +% Finally, create and store the sum +% \begin{macrocode} + \xdef\COOL@listsum@result{}% + \ifthenelse{ \NOT \COOL@listsum@register@integers = 0 }% + { + \xdef\COOL@listsum@result{\COOL@listsum@result\COOL@listsum@register@integers}% + \ifthenelse{ \NOT \value{COOL@register@len} = 0 }% + {% + \xdef\COOL@listsum@result{\COOL@listsum@result+}% + }{}% + }{}% + \forloop{COOL@register@ct}{1}{ \NOT \value{COOL@register@ct} > \value{COOL@register@len} }% + {% + \edef\COOL@listsum@curcoef{\csname COOL@listsum@register@coef@\roman{COOL@register@ct}\endcsname}% + \ifthenelse{ \NOT \COOL@listsum@curcoef = 1}% + {% + \xdef\COOL@listsum@result{\COOL@listsum@result\COOL@listsum@curcoef}% + }{}% + \xdef\COOL@listsum@result{\COOL@listsum@result\csname COOL@listsum@register@\roman{COOL@register@ct}\endcsname}% + \ifthenelse{ \NOT \value{COOL@register@ct} = \value{COOL@register@len} }% + {% + \xdef\COOL@listsum@result{\COOL@listsum@result+}% + }{}% + }% + \xdef#2{\COOL@listsum@result}% + }% +} +% \end{macrocode} +% +% \end{macro} +% +% +% \end{landscape} +% +% % \Finale \endinput
\ No newline at end of file |