summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/csvtools/csvtools.sty
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/csvtools/csvtools.sty')
-rw-r--r--Master/texmf-dist/tex/latex/csvtools/csvtools.sty346
1 files changed, 346 insertions, 0 deletions
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'.