summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/csvtools
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2008-04-29 17:18:51 +0000
committerKarl Berry <karl@freefriends.org>2008-04-29 17:18:51 +0000
commit1bb1fcb353daeee517c22ad1ecc8912942c493b4 (patch)
tree8d132b8dcb564cfc362679f487754d75a1466a7e /Master/texmf-dist/tex/latex/csvtools
parent1cd62a262eb0789c37a72a517c82fe276b360e6f (diff)
restore csvtools, since we cannot eliminate all from ctan:/obsolete anyway
git-svn-id: svn://tug.org/texlive/trunk@7722 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/csvtools')
-rw-r--r--Master/texmf-dist/tex/latex/csvtools/csvpie.sty207
-rw-r--r--Master/texmf-dist/tex/latex/csvtools/csvsort.sty322
-rw-r--r--Master/texmf-dist/tex/latex/csvtools/csvtools.sty346
3 files changed, 875 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/csvtools/csvpie.sty b/Master/texmf-dist/tex/latex/csvtools/csvpie.sty
new file mode 100644
index 00000000000..ef2da7e00ea
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/csvtools/csvpie.sty
@@ -0,0 +1,207 @@
+%%
+%% This is file `csvpie.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% csvtools.dtx (with options: `csvpie.sty,package')
+%% Copyright (C) 2007 Nicola Talbot, all rights reserved.
+%% If you modify this file, you must change its name first.
+%% You are NOT ALLOWED to distribute this file alone. You are NOT
+%% ALLOWED to take money for the distribution or use of either this
+%% file or a changed version, except for a nominal charge for copying
+%% etc.
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{csvpie}[2006/09/01 v1.0]
+\newif\ifcolorpiechart
+\colorpiecharttrue
+\DeclareOption{color}{\colorpiecharttrue}
+\DeclareOption{monochrome}{\colorpiechartfalse}
+\ProcessOptions
+\RequirePackage{csvtools}
+\RequirePackage{tikz}
+\RequirePackage{calc}
+\RequirePackage{keyval}
+\newlength\csvradius
+\newlength\csvinner
+\newlength\csvouter
+\newlength\csvcutawayoffset
+\newcounter{csvstartangle}
+\newcounter{csvendangle}
+\newcounter{csvangle}
+\newcounter{csvpietotal}
+\newcommand*{\csvpiedefaults}{radius=2cm,inner=0.25,outer=1.25,%
+cutaway={},total=100,start=0,offset=0.1}
+\newcommand{\csvpieouterlabel}{\field{1}}
+\newcommand{\csvpieinnerlabel}{\field{2}\%}
+\newcommand*{\csvpiecutaways}{}
+\newcommand*{\csvpiesegmentcol}[2]{%
+\expandafter\def\csname csvpie@segcol\romannumeral#1\endcsname{#2}}
+\newcommand*{\csvpiesegcolname}[1]{%
+\csname csvpie@segcol\romannumeral#1\endcsname}
+\ifcolorpiechart
+\csvpiesegmentcol{1}{red}
+\csvpiesegmentcol{2}{green}
+\csvpiesegmentcol{3}{blue}
+\csvpiesegmentcol{4}{yellow}
+\csvpiesegmentcol{5}{magenta}
+\csvpiesegmentcol{6}{cyan}
+\csvpiesegmentcol{7}{orange}
+\csvpiesegmentcol{8}{white}
+\else
+\csvpiesegmentcol{1}{black!15}
+\csvpiesegmentcol{2}{black!25}
+\csvpiesegmentcol{3}{black!35}
+\csvpiesegmentcol{4}{black!45}
+\csvpiesegmentcol{5}{black!55}
+\csvpiesegmentcol{6}{black!65}
+\csvpiesegmentcol{7}{black!75}
+\csvpiesegmentcol{8}{black!85}
+\fi
+\define@key{csvpie}{start}{\setcounter{csvstartangle}{#1}}
+\define@key{csvpie}{total}{\setcounter{csvpietotal}{#1}}
+\define@key{csvpie}{radius}{\setlength{\csvradius}{#1}}
+\define@key{csvpie}{inner}{\setlength{\csvinner}{#1\csvradius}}
+\define@key{csvpie}{outer}{\setlength{\csvouter}{#1\csvradius}}
+\define@key{csvpie}{offset}{\setlength{\csvcutawayoffset}{#1\csvradius}}
+\define@key{csvpie}{cutaway}{\renewcommand*{\csvpiecutaways}{#1}}
+\providecommand*{\csv@startrow}{1}
+\define@key{csvpie}{firstrow}{\renewcommand*{\csv@startrow}{#1}}
+\newcommand{\csvpiechart}{%
+\@ifstar{\def\@@pieapplyCSVfile{\applyCSVfile*}%
+\def\csv@startrow{1}%
+\@csvpiechart}{%
+\def\@@pieapplyCSVfile{\applyCSVfile}%
+\def\csv@startrow{2}%
+\@csvpiechart}%
+}
+\newcommand*{\csvpiesetkeys}[1]{%
+\edef\csv@piesk{\noexpand\setkeys{csvpie}{\csvpiedefaults,#1}}%
+\csv@piesk}
+\newcommand{\@csvpiechart}[3][]{%
+{\csvpiesetkeys{#1}%
+\edef\csv@startang{\number\c@csvstartangle}%
+\csv@computeangles{#2}{#3}%
+\setcounter{csvstartangle}{\csv@startang}%
+\begin{tikzpicture}%
+\@@pieapplyCSVfile[\csv@startrow]{#3}{%
+\csvpiesegment{#2}}%
+\end{tikzpicture}%
+}}
+\newcommand*{\csvpiesegment}[1]{%
+\setcounter{csvstartangle}{%
+\csname csv@sang@\romannumeral\c@csvrownumber\endcsname}%
+\setcounter{csvangle}{%
+\csname csv@angle@\romannumeral\c@csvrownumber\endcsname}%
+\setcounter{csvendangle}{\value{csvangle} + \value{csvstartangle}}%
+\setcounter{csvangle}{%
+\csname csv@cut@angle\romannumeral\c@csvrownumber\endcsname}%
+\ifthenelse{\value{csvangle}>180}{\addtocounter{csvangle}{-360}}{}%
+\edef\@csv@shift{(\number\c@csvangle:%
+\csname csv@cut@len\romannumeral\c@csvrownumber\endcsname)}%
+\setcounter{csvangle}{%
+\csname csv@angle@\romannumeral\c@csvrownumber\endcsname/2
++\value{csvstartangle}}%
+\begin{scope}[shift={\@csv@shift}]%
+\fill[color=\csvpiesegcolname\c@csvrownumber] (0,0) --
+(\thecsvstartangle:\csvradius)
+arc (\thecsvstartangle:\thecsvendangle:\csvradius) -- cycle;
+\ifthenelse{\(\value{csvangle}>90 \and \value{csvangle}<270\)
+\TE@or \value{csvangle}<-90}{%
+\setcounter{csvstartangle}{\value{csvangle}-180}%
+\draw (\thecsvangle:\csvinner)
+node[left,rotate=\thecsvstartangle]{\csvpieinnerlabel};
+\draw (\thecsvangle:\csvouter)
+node[left,rotate=\thecsvstartangle]{\csvpieouterlabel};
+}{%
+\draw (\thecsvangle:\csvinner)
+node[right,rotate=\thecsvangle]{\csvpieinnerlabel};
+\draw (\thecsvangle:\csvouter)
+node[right,rotate=\thecsvangle]{\csvpieouterlabel};
+}%
+\end{scope}%
+}
+\newcommand*{\csv@computeangles}[2]{%
+\@@pieapplyCSVfile[\csv@startrow]{#2}{%
+\csvsetsegmentparams{\c@csvrownumber}{#1}%
+}%
+\ifthenelse{\equal{\csvpiecutaways}{}}{}{\csvcomputeoffsets}}
+\newcommand*{\csvcomputeoffsets}{%
+\@for\csv@row:=\csvpiecutaways\do{%
+\expandafter\@csv@set@off\csv@row-\relax
+}}
+\def\@csv@set@off#1-#2\relax{%
+\ifthenelse{\equal{#2}{}}{%
+\@@csv@set@off{#1}}{%
+\@@csv@set@offr#1-#2\relax}%
+}
+\newcommand*{\@@csv@set@off}[1]{%
+\setcounter{csvangle}{%
+\csname csv@angle@\romannumeral#1\endcsname/2
++ \csname csv@sang@\romannumeral#1\endcsname}%
+\expandafter\xdef\csname csv@cut@angle\romannumeral#1\endcsname{%
+\number\c@csvangle}%
+\expandafter
+\gdef\csname csv@cut@len\romannumeral\csv@row\endcsname{%
+\csvcutawayoffset}%
+}
+\newcount\@csv@seg
+\def\@@csv@set@offr#1-#2-\relax{%
+\ifnum#1>#2\relax
+\PackageError{csvpie}{Segment ranges must go in ascending
+order}{Try #2-#1 instead of #1-#2}%
+\else
+\setcounter{csvangle}{0}%
+\@csv@seg=#1\relax
+\whiledo{\not\(\@csv@seg > #2\)}{%
+\addtocounter{csvangle}{%
+\csname csv@angle@\romannumeral\@csv@seg\endcsname}%
+\advance\@csv@seg by 1}%
+\setcounter{csvangle}{\value{csvangle}/2
++ \csname csv@sang@\romannumeral#1\endcsname}%
+\@csv@seg=#1\relax
+\whiledo{\not\(\@csv@seg > #2\)}{%
+\expandafter\xdef\csname csv@cut@angle\romannumeral\@csv@seg\endcsname{%
+\number\c@csvangle}%
+\expandafter
+\gdef\csname csv@cut@len\romannumeral\@csv@seg\endcsname{%
+\csvcutawayoffset}%
+\advance\@csv@seg by 1}%
+\fi
+}
+\newcommand*{\csvsetsegmentparams}[2]{%
+\ifthenelse{\value{csvstartangle}>180}{%
+\addtocounter{csvstartangle}{-360}}{}%
+\ifthenelse{\value{csvstartangle}<-180}{%
+\addtocounter{csvstartangle}{360}}{}%
+\expandafter
+\xdef\csname csv@sang@\romannumeral#1\endcsname{%
+\number\c@csvstartangle}%
+\setcounter{csvangle}{360*\real{#2}/\value{csvpietotal}}%
+\addtocounter{csvstartangle}{\value{csvangle}}%
+\expandafter
+\xdef\csname csv@angle@\romannumeral#1\endcsname{%
+\number\c@csvangle}%
+\expandafter
+\gdef\csname csv@cut@angle\romannumeral#1\endcsname{0}%
+\expandafter
+\gdef\csname csv@cut@len\romannumeral#1\endcsname{0cm}%
+}
+\endinput
+%%
+%% End of file `csvpie.sty'.
diff --git a/Master/texmf-dist/tex/latex/csvtools/csvsort.sty b/Master/texmf-dist/tex/latex/csvtools/csvsort.sty
new file mode 100644
index 00000000000..4dad7d27e20
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/csvtools/csvsort.sty
@@ -0,0 +1,322 @@
+%%
+%% This is file `csvsort.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% csvtools.dtx (with options: `csvsort.sty,package')
+%% Copyright (C) 2007 Nicola Talbot, all rights reserved.
+%% If you modify this file, you must change its name first.
+%% You are NOT ALLOWED to distribute this file alone. You are NOT
+%% ALLOWED to take money for the distribution or use of either this
+%% file or a changed version, except for a nominal charge for copying
+%% etc.
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{csvsort}[2007/07/03 v1.0 (NLCT)]
+\@ifundefined{compare}{\input{compare}}{}
+\newif\if@csv@ishigher
+\newcommand{\csv@alphaascendingcompare}[2]{%
+\@csv@extractkey#1{\@csv@keya}%
+\@csv@extractkey#2{\@csv@keyb}%
+\csvsort@verbose{Comparing \@csv@keya\space and \@csv@keyb}%
+\edef\@csvsrt@result{\noexpand\compare{\@csv@keya}{\@csv@keyb}}%
+\ifnum\@csvsrt@result=1\relax
+ \@csv@ishighertrue
+\else
+ \@csv@ishigherfalse
+\fi}
+\newcommand{\csv@alphadescendingcompare}[2]{%
+\@csv@extractkey#1{\@csv@keya}%
+\@csv@extractkey#2{\@csv@keyb}%
+\csvsort@verbose{Comparing \@csv@keya\space and \@csv@keyb}%
+\edef\@csvsrt@result{\noexpand\compare{\@csv@keya}{\@csv@keyb}}%
+\ifnum\@csvsrt@result=-1\relax
+ \@csv@ishighertrue
+\else
+ \@csv@ishigherfalse
+\fi}
+\newcommand{\csv@numericascendingcompare}[2]{%
+\@csv@extractkey#1{\@csv@keya}%
+\@csv@extractkey#2{\@csv@keyb}%
+\if\relax\@csv@keya\relax\def\@csv@keya{0}\fi
+\if\relax\@csv@keyb\relax\def\@csv@keyb{0}\fi
+\csvsort@verbose{Comparing \number\@csv@keya\space and \number\@csv@keyb}%
+\ifnum\@csv@keya>\@csv@keyb\relax
+ \@csv@ishighertrue
+\else
+ \@csv@ishigherfalse
+\fi}
+\newcommand{\csv@numericdescendingcompare}[2]{%
+\@csv@extractkey#1{\@csv@keya}%
+\@csv@extractkey#2{\@csv@keyb}%
+\if\relax\@csv@keya\relax\def\@csv@keya{0}\fi
+\if\relax\@csv@keyb\relax\def\@csv@keyb{0}\fi
+\csvsort@verbose{Comparing \number\@csv@keya\space and \number\@csv@keyb}%
+\ifnum\@csv@keya<\@csv@keyb\relax
+ \@csv@ishighertrue
+\else
+ \@csv@ishigherfalse
+\fi}
+\def\@csv@extractkey#1#2#3{\def#3{#1}}
+\def\@csv@extractdata#1#2#3{\def#3{#2}}
+\let\csv@compare\csv@alphaascendingcompare
+\RequirePackage{xkeyval}
+\define@boolkey{csvsort.sty}[csvsrt]{verbose}[true]{}
+\csvsrtverbosetrue
+\newcommand{\csvsort@verbose}[1]{%
+\ifcsvsrtverbose\typeout{#1}\fi}
+\define@choicekey{csvsort.sty}{sort}[\val\nr]{alphabetical,numerical,%
+alphabetical ascending,numerical ascending,%
+alphabetical descending,numerical descending,%
+alphabeticalascending,alphabeticaldescending,%
+numericalascending,numericaldescending}{%
+\ifcase\nr
+ % alphabetical (ascending)
+ \let\csv@compare\csv@alphaascendingcompare
+ \or
+ % numerical (ascending)
+ \let\csv@compare\csv@numericascendingcompare
+ \or
+ % alphabetical ascending
+ \let\csv@compare\csv@alphaascendingcompare
+ \or
+ % numerical ascending
+ \let\csv@compare\csv@numericascendingcompare
+ \or
+ % alphabetical descending
+ \let\csv@compare\csv@alphadescendingcompare
+ \or
+ % numerical descending
+ \let\csv@compare\csv@numericdescendingcompare
+ \or
+ % alphabeticalascending
+ \let\csv@compare\csv@alphaascendingcompare
+ \or
+ % alphabetical descending
+ \let\csv@compare\csv@alphadescendingcompare
+ \or
+ % numericalascending
+ \let\csv@compare\csv@numericascendingcompare
+ \or
+ % numericaldescending
+ \let\csv@compare\csv@numericdescendingcompare
+\fi}
+\newcommand{\csv@sortvariable}{\field{1}}
+\define@key{csvsort.sty}{variable}{%
+\renewcommand{\csv@sortvariable}{#1}}
+\newcounter{sfirstdataline}
+\setcounter{sfirstdataline}{1}
+\define@key{csvsort.sty}{sfirstdataline}{%
+\setcounter{sfirstdataline}{#1}}
+\newcounter{firstdataline}
+\setcounter{firstdataline}{2}
+\define@key{csvsort.sty}{firstdataline}{%
+\setcounter{firstdataline}{#1}}
+\ProcessOptionsX
+\RequirePackage{csvtools}
+\RequirePackage{xfor}
+\newcommand{\csv@insertionsort}[1]{%
+\let\@csv@sortedlist\relax
+\@for\@csv@listelement:=#1\do{%
+\if\@csv@sortedlist\relax
+ \expandafter\toks@\expandafter{\@csv@listelement}%
+ \edef\@csv@sortedlist{\the\toks@}%
+\else
+ \expandafter\@csv@insert@into\expandafter
+ {\@csv@listelement}{\@csv@sortedlist}%
+\fi}\let#1\@csv@sortedlist}
+\newcommand\@csv@insert@into[2]{%
+\let\@csv@tmplist\relax
+\@for\@sort@list@element:=#2\do{%
+ \expandafter\csv@compare\expandafter{\@sort@list@element}{#1}%
+ \if@csv@ishigher
+ \toks@{#1}%
+ \if\relax\@csv@tmplist
+ \edef\@csv@tmplist{\the\toks@,\@sort@list@element}%
+ \else
+ \edef\@csv@tmplist{\@csv@tmplist,\the\toks@,\@sort@list@element}%
+ \fi
+ \@endfortrue
+ \else
+ \if\relax\@csv@tmplist
+ \edef\@csv@tmplist{\@sort@list@element}%
+ \else
+ \edef\@csv@tmplist{\@csv@tmplist,\@sort@list@element}%
+ \fi
+ \fi
+}%
+\if@endfor
+ \ifx\@forremainder\@empty
+ \else
+ \edef\@csv@tmplist{\@csv@tmplist,\@forremainder}%
+ \fi
+\else
+ \toks@{#1}%
+ \if\relax\@csv@tmplist
+ \edef\@csv@tmplist{\the\toks@}%
+ \else
+ \edef\@csv@tmplist{\@csv@tmplist,\the\toks@}%
+ \fi
+\fi
+\@endforfalse
+\let#2\@csv@tmplist
+}
+\newcommand{\sortapplyCSVfile}{%
+\@ifstar\@ssortapplyCSVfile\@sortapplyCSVfile}
+\newcommand{\@ssortapplyCSVfile}[3][]{%
+\bgroup
+\setkeys{csvsort.sty}{#1}%
+\def\@csv@list{}%
+\@sapplyCSVfile[\c@sfirstdataline]{#2}{%
+\edef\csv@key{\csv@sortvariable}%
+\if\relax\@csv@list\relax
+\protected@xdef\@csv@list{{\csv@key}{\csvline}}%
+\else
+\protected@xdef\@csv@list{\@csv@list,{\csv@key}{\csvline}}%
+\fi
+}%
+\@ssortapplyCSVdata{\@csv@list}{#3}%
+\egroup}
+\newcommand{\@sortapplyCSVfile}[3][]{%
+\bgroup
+\setkeys{csvsort.sty}{#1}%
+\def\@csv@list{}%
+\@applyCSVfile[\c@firstdataline]{#2}{%
+\edef\csv@key{\csv@sortvariable}%
+\if\relax\@csv@list\relax
+\protected@xdef\@csv@list{{\csv@key}{\csvline}}%
+\else
+\protected@xdef\@csv@list{\@csv@list,{\csv@key}{\csvline}}%
+\fi
+}%
+\@sortapplyCSVdata{\@csv@list}{#3}%
+\egroup}
+\newcommand{\sortapplyCSVdata}{%
+\@ifstar\@ssortapplyCSVdata\@sortapplyCSVdata}
+\newcommand{\@ssortapplyCSVdata}[3][\relax]{%
+\bgroup
+\if\relax#1\relax\else\setkeys{csvsort.sty}{sort=#1}\fi
+\csv@insertionsort{#2}%
+\c@csvrownumber=0\relax
+\@for\@csv@element:=#2\do{%
+\expandafter\@csv@extractdata\@csv@element\csvline
+\expandafter\toks@\expandafter{\csvline}%
+\edef\@csvlin@{\@csvseparator\the\toks@\@csvseparator}%
+\long\edef\@csvlin@{\@csvseparator\csvline\@csvseparator}%
+\c@field=0\relax
+\whiledo{\not\equal{\@csvlin@}{\@csvseparator}}{%
+\extractentry{\@csvlin@}{\param}%
+\expandafter\toks@\expandafter{\param}%
+\advance\c@field by 1\relax
+\expandafter\xdef\csname @field\romannumeral\c@field\endcsname{%
+\the\toks@}%
+}%
+\ifthenelse{\not\equal{\csvline}{}}{%
+\refstepcounter{csvrownumber}%
+#3}{}%
+}%
+\egroup
+}
+\newcommand{\@sortapplyCSVdata}[3][\relax]{%
+\bgroup
+\if\relax#1\relax\else\setkeys{csvsort.sty}{sort=#1}\fi
+\csv@insertionsort{#2}%
+\c@csvrownumber=0\relax
+\@for\@csv@element:=#2\do{%
+\expandafter\@csv@extractdata\@csv@element\csvline
+\expandafter\toks@\expandafter{\csvline}%
+\edef\@csvlin@{\@csvseparator\the\toks@\@csvseparator}%
+\long\edef\@csvlin@{\@csvseparator\csvline\@csvseparator}%
+\c@field=0\relax
+\whiledo{\not\equal{\@csvlin@}{\@csvseparator}}{%
+\extractentry{\@csvlin@}{\param}%
+\expandafter\toks@\expandafter{\param}%
+\advance\c@field by 1\relax
+\expandafter\xdef\csname @field\romannumeral\c@field\endcsname{%
+\the\toks@}%
+\edef\@fieldlabel{%
+\csname @fieldlabel\romannumeral\c@field\endcsname}%
+\expandafter\xdef\csname insert\@fieldlabel\endcsname{\the\toks@}%
+}%
+\ifthenelse{\not\equal{\csvline}{}}{%
+\refstepcounter{csvrownumber}%
+#3}{}%
+}%
+\egroup
+}
+\newcommand{\sortCSVtotabular}[6][]{%
+\@sortCSVtotabular[#1]{#2}{#3}{#4}{#5}{#6}{tabular}}
+\newcommand{\sortCSVtolongtable}[6][]{%
+\@sortCSVtotabular[#1]{#2}{#3}{#4}{#5}{#6}{longtable}}
+\newcommand{\@sortCSVtotabular}[7][]{%
+\bgroup
+\setkeys{csvsort.sty}{#1}%
+\def\@csv@list{}%
+\@applyCSVfile[\c@firstdataline]{#2}{%
+\edef\csv@key{\csv@sortvariable}%
+\if\relax\@csv@list\relax
+\protected@xdef\@csv@list{{\csv@key}{\csvline}}%
+\else
+\protected@xdef\@csv@list{\@csv@list,{\csv@key}{\csvline}}%
+\fi
+}%
+\sortCSVdatatotabular{\c@csvrownumber}{\@csv@list}{#3}{#4}{#5}{#6}{#7}%
+\egroup
+}
+\newcommand{\sortCSVdatatotabular}[7]{%
+\maxlines=#1\relax
+\csv@insertionsort{#2}%
+\csvlastbutone=\maxlines
+\advance\csvlastbutone by -1\relax
+\c@csvrownumber=0\relax
+\c@csvlinenum=0\relax
+\def\@r@wh{#4}\def\@r@w{}\def\@r@wl{}%
+\@for\@csv@element:=#2\do{%
+\expandafter\@csv@extractdata\@csv@element\csvline
+\expandafter\toks@\expandafter{\csvline}%
+\edef\@csvlin@{\@csvseparator\the\toks@\@csvseparator}%
+\long\edef\@csvlin@{\@csvseparator\csvline\@csvseparator}%
+\c@field=0\relax
+\whiledo{\not\equal{\@csvlin@}{\@csvseparator}}{%
+\extractentry{\@csvlin@}{\param}%
+\expandafter\toks@\expandafter{\param}%
+\advance\c@field by 1\relax
+\expandafter\xdef\csname @field\romannumeral\c@field\endcsname{%
+\the\toks@}%
+\edef\@fieldlabel{%
+\csname @fieldlabel\romannumeral\c@field\endcsname}%
+\expandafter\xdef\csname insert\@fieldlabel\endcsname{\the\toks@}%
+}%
+\refstepcounter{csvrownumber}%
+\refstepcounter{csvlinenum}%
+\ifnum\c@csvrownumber=\maxlines
+ \protected@edef\@r@wl{#6}%
+\else
+ \expandafter\toks@\expandafter{\@r@w}
+ \protected@edef\@r@w{\the\toks@#5}%
+\fi
+}%
+\begin{#7}{#3}%
+\@r@wh
+\@r@w
+\@r@wl
+\end{#7}%
+}
+\endinput
+%%
+%% End of file `csvsort.sty'.
diff --git a/Master/texmf-dist/tex/latex/csvtools/csvtools.sty b/Master/texmf-dist/tex/latex/csvtools/csvtools.sty
new file mode 100644
index 00000000000..87711ecc2e9
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/csvtools/csvtools.sty
@@ -0,0 +1,346 @@
+%%
+%% This is file `csvtools.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% csvtools.dtx (with options: `csvtools.sty,package')
+%% Copyright (C) 2007 Nicola Talbot, all rights reserved.
+%% If you modify this file, you must change its name first.
+%% You are NOT ALLOWED to distribute this file alone. You are NOT
+%% ALLOWED to take money for the distribution or use of either this
+%% file or a changed version, except for a nominal charge for copying
+%% etc.
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{csvtools}[2007/07/03 v1.24 (NLCT)]
+\RequirePackage{ifthen}
+\RequirePackage{longtable}
+\newcommand*{\@csvseparator}{,}
+\newcommand*{\setcsvseparator}[1]{%
+\renewcommand*{\@csvseparator}{#1}%
+\construct@lopoff{#1}%
+\@construct@qlopoff{#1}%
+\@construct@lopoff{#1}}
+\newcommand*{\extractentry}[2]{%
+\expandafter\csvlopoff#1\to{#1}{#2}}
+\edef\construct@lopoff#1{%
+\noexpand\long\noexpand\def\noexpand\csvlopoff#1##1##2\noexpand\to##3##4{%
+\noexpand\ifx"##1\noexpand\relax
+\noexpand\@csv@qlopoff#1##1##2\noexpand\to##3##4\relax
+\noexpand\else
+\noexpand\@csv@lopoff#1##1##2\noexpand\to##3##4\relax
+\noexpand\fi
+}}
+\edef\@construct@qlopoff#1{%
+\noexpand\long\noexpand\def\noexpand\@csv@qlopoff#1"##1"#1##2\noexpand\to##3##4{%
+\noexpand\def##4{##1}\noexpand\def##3{#1##2}}}
+\edef\@construct@lopoff#1{%
+\noexpand\long\noexpand\def\noexpand\@csv@lopoff#1##1#1##2\noexpand\to##3##4{%
+\noexpand\def##4{##1}\noexpand\def##3{#1##2}}}
+\setcsvseparator{,}
+\newread\csvfile
+\newif\ifmore
+\newcount\c@field
+\newcount\c@maxfields
+\newcounter{csvlinenum}
+\newcount\maxlines
+\newcount\csvlastbutone
+\newcounter{csvrownumber}
+\toksdef\csv@tb=2
+\newcommand{\field}[1]{\csname @field\romannumeral#1\endcsname}
+\newcommand{\setcsvfieldlabel}[2]{%
+\expandafter\def\csname @fieldlabel\romannumeral#1\endcsname{#2}}
+\newcommand{\insertbyname}[1]{\csname insert#1\endcsname}
+\newcommand{\trim}[1]{\def\@trmstr{}%
+\def\csv@trmarg{#1}%
+\if\par\csv@trmarg
+\else
+\expandafter\@trim#1\end
+\let#1\@trmstr
+\fi
+}
+\long\def\@trim#1 \end{\def\@trmstr{#1}}
+\newcommand{\applyCSVfile}{\@ifstar\@sapplyCSVfile\@applyCSVfile}
+\newcommand{\@sapplyCSVfile}[3][1]{%
+\IfFileExists{#2}{%
+\openin\csvfile=#2
+\ifeof\csvfile\morefalse\else\moretrue\fi
+\ifmore
+{\c@csvlinenum=1\relax
+\global\c@csvrownumber=0\relax
+\loop
+\read\csvfile to\csvline
+\advance\c@csvlinenum by 1\relax
+\ifnum\c@csvlinenum>#1\relax
+\trim{\csvline}%
+\csv@tb=\expandafter{\csvline}%
+\edef\@csvlin@{\@csvseparator\the\csv@tb\@csvseparator}%
+\c@field = 0\relax
+\whiledo{\not\equal{\@csvlin@}{\@csvseparator\par\@csvseparator} \and
+\not\equal{\@csvlin@}{\@csvseparator\@csvseparator} \and
+\not\equal{\@csvlin@}{\@csvseparator}}{%
+\extractentry{\@csvlin@}{\param}%
+\csv@tb=\expandafter{\param}%
+\advance\c@field by 1\relax
+\expandafter\xdef\csname @field\romannumeral\c@field\endcsname{%
+\the\csv@tb}%
+}%
+\ifthenelse{\not\equal{\csvline}{\par} \and
+\not\equal{\csvline}{}}{%
+\refstepcounter{csvrownumber}\relax
+#3}{}%
+\fi
+\ifeof\csvfile\morefalse\else\moretrue\fi
+\ifmore
+\repeat}%
+\closein\csvfile
+\fi
+}{\PackageError{csvtools}{Can't find file '#2'}{}}%
+}
+\newcommand{\@applyCSVfile}[3][2]{%
+\ifnum#1<2\relax
+\PackageError{csvtools}{Header line required}{The optional
+argument to `\string\applyCSVfile' needs to be > 1. The header
+line should be on line 1}%
+\else
+\IfFileExists{#2}{%
+\openin\csvfile=#2
+\ifeof\csvfile\morefalse\else\moretrue\fi
+\ifmore
+\global\c@csvlinenum=1\relax
+\global\c@csvrownumber=0\relax
+\global\c@maxfields=0\relax
+{\loop
+\read\csvfile to\csvline
+\trim{\csvline}%
+\ifnum\c@csvlinenum=1\relax
+\ifthenelse{\not\equal{\csvline}{\par} \and
+\not\equal{\csvline}{}}{%
+\csv@tb=\expandafter{\csvline}\relax
+\edef\@csvlin@{\@csvseparator\the\csv@tb\@csvseparator}%
+\c@field=0\relax
+\whiledo{\not\equal{\@csvlin@}{\@csvseparator\par\@csvseparator}
+\and \not\equal{\@csvlin@}{\@csvseparator\@csvseparator}
+\and \not\equal{\@csvlin@}{\@csvseparator}}{%
+\extractentry{\@csvlin@}{\param}%
+\advance\c@field by 1\relax
+\csv@tb=\expandafter{\param}\relax
+\expandafter
+\xdef\csname @fieldlabel\romannumeral\c@field\endcsname{\the\csv@tb}%
+}%
+\c@maxfields=\c@field
+}{%
+\PackageError{csvtools}{Header line missing in file #2}{Header
+line required on line 1}}%
+\fi
+\c@field=0\relax
+\whiledo{\c@field < \c@maxfields}{%
+\advance\c@field by 1\relax
+\expandafter\let\csname @field\romannumeral\c@field\endcsname\relax%
+\edef\@fieldlabel{%
+\csname @fieldlabel\romannumeral\c@field\endcsname}%
+\ifthenelse{\equal{\@fieldlabel}{}
+\TE@or \equal{\@fieldlabel}{penalties}
+\TE@or \equal{\@fieldlabel}{byname}}{\PackageError{csvtools}{%
+\string\insert\@fieldlabel \space already defined}{%
+You can't have the label '\@fieldlabel' in your header row.}}{}%
+\expandafter\let\csname insert\@fieldlabel\endcsname\relax%
+}%
+\advance\c@csvlinenum by 1\relax
+\ifnum\c@csvlinenum>#1\relax
+\csv@tb=\expandafter{\csvline}\relax
+\edef\@csvlin@{\@csvseparator\the\csv@tb\@csvseparator}%
+\c@field=0\relax
+\whiledo{\not\equal{\@csvlin@}{\@csvseparator\par\@csvseparator}
+\and \not\equal{\@csvlin@}{\@csvseparator\@csvseparator}
+\and \not\equal{\@csvlin@}{\@csvseparator}}{%
+\extractentry{\@csvlin@}{\param}%
+\csv@tb=\expandafter{\param}\relax
+\advance\c@field by 1\relax
+\expandafter
+\xdef\csname @field\romannumeral\c@field\endcsname{\the\csv@tb}%
+\edef\@fieldlabel{%
+\csname @fieldlabel\romannumeral\c@field\endcsname}%
+\ifthenelse{\equal{\@fieldlabel}{}
+\TE@or \equal{\@fieldlabel}{penalties}
+\TE@or \equal{\@fieldlabel}{byname}}{\PackageError{csvtools}{%
+\string\insert\@fieldlabel \space already defined}{%
+You can't have the label '\@fieldlabel' in your header row.}}{}%
+\expandafter\xdef\csname insert\@fieldlabel\endcsname{\the\csv@tb}%
+}%
+\ifthenelse{\not\equal{\csvline}{\par}
+\and \not\equal{\csvline}{}}{%
+\global\advance\c@csvrownumber by 1\relax
+#3}{}%
+\fi
+\ifeof\csvfile\morefalse\else\moretrue\fi
+\ifmore
+\repeat}%
+\closein\csvfile
+\fi
+}{\PackageError{csvtools}{Can't find file '#2'}{}}%
+\fi
+}
+\newcommand{\CSVtotabular}[5]{%
+\openin\csvfile=#1
+\c@csvlinenum=0\relax
+\loop
+\advance\c@csvlinenum by 1\relax
+\read\csvfile to\csvline
+\expandafter
+\xdef\csname @csvline\romannumeral\c@csvlinenum\endcsname{\csvline}%
+\ifthenelse{\not\equal{\csvline}{\par}}{\trim{\csvline}}{}%
+\ifnum\c@csvlinenum=1\relax
+\csv@tb=\expandafter{\csvline}
+\edef\@csvlin@{\@csvseparator\the\csv@tb\@csvseparator}%
+\c@field = 0\relax
+\whiledo{\not\equal{\@csvlin@}{\@csvseparator\par\@csvseparator}%
+\and \not\equal{\@csvlin@}{\@csvseparator\@csvseparator}%
+\and \not\equal{\@csvlin@}{\@csvseparator}}{%
+\extractentry{\@csvlin@}{\param}%
+\csv@tb=\expandafter{\param}%
+\advance\c@field by 1\relax
+\expandafter\xdef\csname insert\the\csv@tb\endcsname{%
+\noexpand\field{\the\c@field}}%
+}%
+\fi
+\csv@tb=\expandafter{\csvline}%
+\edef\@csvlin@{\@csvseparator\the\csv@tb\@csvseparator}%
+\c@field = 0\relax
+\whiledo{\not\equal{\@csvlin@}{\@csvseparator\par\@csvseparator}
+\and \not\equal{\@csvlin@}{\@csvseparator\@csvseparator}
+\and \not\equal{\@csvlin@}{\@csvseparator}}{%
+\extractentry{\@csvlin@}{\param}%
+\csv@tb=\expandafter{\param}
+\advance\c@field by 1\relax
+\expandafter
+\xdef\csname @l\romannumeral\c@csvlinenum @field\romannumeral\c@field\endcsname{\the\csv@tb}%
+}%
+\ifeof\csvfile\morefalse\else\moretrue\fi
+\ifmore
+\repeat
+\closein\csvfile
+{%
+\def\field##1{%
+\csname @l\romannumeral\c@csvlinenum @field\romannumeral##1\endcsname}%
+\def\@r@wh{\begin{tabular}{#2}#3}%
+\def\@r@w{#4}%
+\def\@r@wl{#5\end{tabular}}%
+\maxlines=\c@csvlinenum
+\advance\maxlines by -1\relax
+\csvlastbutone=\maxlines
+\advance\csvlastbutone by -1\relax
+\c@csvlinenum=1\relax
+\setcounter{csvrownumber}{0}\relax
+\whiledo{\not{\c@csvlinenum>\maxlines}}{%
+\ifthenelse{\expandafter\equal{%
+\csname @csvline\romannumeral\c@csvlinenum\endcsname}{\par}}%
+{\relax}{%
+\ifnum\c@csvlinenum=1\relax
+\@r@wh
+\else
+\refstepcounter{csvrownumber}%
+\ifnum\c@csvlinenum=\maxlines\@r@wl\else\@r@w\fi
+\fi}%
+\global\advance\c@csvlinenum by 1\relax
+}\relax
+}}
+\newcommand{\CSVtolongtable}[5]{%
+\openin\csvfile=#1
+\c@csvlinenum=0\relax
+\loop
+\advance\c@csvlinenum by 1\relax
+\read\csvfile to\csvline
+\expandafter
+\xdef\csname @csvline\romannumeral\c@csvlinenum\endcsname{\csvline}%
+\ifthenelse{\not\equal{\csvline}{\par}}{\trim{\csvline}}{}%
+\ifnum\c@csvlinenum=1\relax
+\csv@tb=\expandafter{\csvline}%
+\edef\@csvlin@{\@csvseparator\the\csv@tb\@csvseparator}%
+\c@field = 0\relax
+\whiledo{\not\equal{\@csvlin@}{\@csvseparator\par\@csvseparator}
+\and \not\equal{\@csvlin@}{\@csvseparator\@csvseparator}
+\and \not\equal{\@csvlin@}{\@csvseparator}}{%
+\extractentry{\@csvlin@}{\param}%
+\csv@tb=\expandafter{\param}%
+\advance\c@field by 1\relax
+\expandafter
+\xdef\csname insert\the\csv@tb\endcsname{%
+\noexpand\field{\the\c@field}}%
+}%
+\fi
+\csv@tb=\expandafter{\csvline}%
+\edef\@csvlin@{\@csvseparator\the\csv@tb\@csvseparator}%
+\c@field = 0\relax
+\whiledo{\not\equal{\@csvlin@}{\@csvseparator\par\@csvseparator}
+\and \not\equal{\@csvlin@}{\@csvseparator\@csvseparator}
+\and \not\equal{\@csvlin@}{\@csvseparator}}{%
+\extractentry{\@csvlin@}{\param}%
+\csv@tb=\expandafter{\param}%
+\advance\c@field by 1\relax
+\expandafter
+\xdef\csname @l\romannumeral\c@csvlinenum @field\romannumeral\c@field\endcsname{\the\csv@tb}%
+}%
+\ifeof\csvfile\morefalse\else\moretrue\fi
+\ifmore
+\repeat
+\closein\csvfile
+{\def\field##1{%
+\csname @l\romannumeral\c@csvlinenum @field\romannumeral##1\endcsname}%
+\def\@r@wh{\begin{longtable}{#2}#3}%
+\def\@r@w{#4}%
+\def\@r@wl{#5\end{longtable}}%
+\maxlines=\c@csvlinenum
+\advance\maxlines by -1\relax
+\csvlastbutone=\maxlines
+\advance\csvlastbutone by -1\relax
+\c@csvlinenum=1\relax
+\setcounter{csvrownumber}{0}\relax
+\whiledo{\not{\c@csvlinenum>\maxlines}}{%
+\ifthenelse{\expandafter\equal{%
+\csname @csvline\romannumeral\c@csvlinenum\endcsname}{\par}}%
+{\relax}{%
+\ifnum\c@csvlinenum=1\relax
+\@r@wh
+\else
+\refstepcounter{csvrownumber}%
+\ifnum\c@csvlinenum=\maxlines\@r@wl\else\@r@w\fi
+\fi}%
+\global\advance\c@csvlinenum by 1\relax
+}\relax
+}}
+\newcommand{\ifnextrowlast}[2]{%
+\ifnum\c@csvlinenum=\csvlastbutone#1\else#2\fi}
+\newcommand{\csvSaveEntry}[2][csvrownumber]{%
+\@ifnextchar[{\@csvSaveEntry{#1}{#2}}{%
+\@csvSaveEntry{#1}{#2}[\insertbyname{#2}]}%
+}
+\def\@csvSaveEntry#1#2[#3]{%
+\edef\@csv@tmp{\insertbyname{#2}}%
+\if\relax\@csv@tmp\relax
+\edef\@entry{#3}%
+\else
+\edef\@entry{\insertbyname{#2}}%
+\fi
+\expandafter
+\xdef\csname #2\romannumeral\value{#1}\endcsname{\@entry}}
+\newcommand{\csvGetEntry}[2]{%
+\csname #2\romannumeral\value{#1}\endcsname}
+\endinput
+%%
+%% End of file `csvtools.sty'.