From 26a5e20d6d379e77f021e478b3934f5bc99a2cdd Mon Sep 17 00:00:00 2001
From: Norbert Preining <preining@logic.at>
Date: Fri, 16 Nov 2007 10:54:55 +0000
Subject: update coollist v1.2 from ctan

git-svn-id: svn://tug.org/texlive/trunk@5448 c570f23f-e606-0410-a88d-b1316a301751
---
 .../texmf-dist/source/latex/coollist/coollist.dtx  | 328 +++++++++++++++++----
 1 file changed, 264 insertions(+), 64 deletions(-)

(limited to 'Master/texmf-dist/source/latex/coollist/coollist.dtx')

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,15 +236,35 @@
 %
 % \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}
 %
 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -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
-- 
cgit v1.2.3

