summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/coollist/coollist.dtx
diff options
context:
space:
mode:
authorNorbert Preining <preining@logic.at>2007-11-16 10:54:55 +0000
committerNorbert Preining <preining@logic.at>2007-11-16 10:54:55 +0000
commit26a5e20d6d379e77f021e478b3934f5bc99a2cdd (patch)
tree78c04c14d2c88d9eaaf2cc31eaf290ee4d228461 /Master/texmf-dist/source/latex/coollist/coollist.dtx
parent9acb11771e83a042aa9f732555d94343c4759010 (diff)
update coollist v1.2 from ctan
git-svn-id: svn://tug.org/texlive/trunk@5448 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/coollist/coollist.dtx')
-rw-r--r--Master/texmf-dist/source/latex/coollist/coollist.dtx328
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