diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/datatool/datatool.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/datatool/datatool.sty | 3318 |
1 files changed, 3318 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/datatool/datatool.sty b/Master/texmf-dist/tex/latex/datatool/datatool.sty new file mode 100644 index 00000000000..099417295be --- /dev/null +++ b/Master/texmf-dist/tex/latex/datatool/datatool.sty @@ -0,0 +1,3318 @@ +%% +%% This is file `datatool.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% datatool.dtx (with options: `datatool.sty,package') +%% +%% datatool.dtx +%% Copyright 2007 Nicola Talbot +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3 +%% of this license of (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This work has the LPPL maintenance status `maintained'. +%% +%% The Current Maintainer of this work is Nicola Talbot. +%% +%% This work consists of the files datatool.dtx and datatool.ins and the derived files datatool.sty, datapie.sty, dataplot.sty, databar.sty, databib.sty, databib.bst. +%% +%% \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{datatool}[2007/08/17 v1.01 (NLCT)] +\RequirePackage{xkeyval} +\RequirePackage{ifthen} +\RequirePackage{xfor} +\RequirePackage{fp} +\RequirePackage{substr} +\newcommand*{\@dtl@separator}{,} +\newcommand*{\DTLsetseparator}[1]{% +\renewcommand*{\@dtl@separator}{#1}% +\@dtl@construct@lopoffs +} +\begingroup +\catcode`\ 12 +\gdef\DTLsettabseparator{% + \catcode`\ 12 + \DTLsetseparator{ }% +} +\endgroup +\begingroup +\catcode`\"12\relax +\gdef\@dtl@delimiter{"} +\endgroup +\newcommand*\DTLsetdelimiter[1]{% +\renewcommand*{\@dtl@delimiter}{#1}% +\@dtl@construct@lopoffs} +\edef\@dtl@construct@lopoff#1#2{% +\noexpand\long\noexpand\def\noexpand\@dtl@lopoff#1##1##2\noexpand +\to##3##4{% +\noexpand\ifx#2##1\noexpand\relax +\noexpand\@dtl@qlopoff#1##1##2\noexpand\to##3##4\relax +\noexpand\else +\noexpand\@dtl@lop@ff#1##1##2\noexpand\to##3##4\relax +\noexpand\fi +}} +\edef\@dtl@construct@qlopoff#1#2{% +\noexpand\long\noexpand\def\noexpand\@dtl@qlopoff#1#2##1#2#1##2\noexpand +\to##3##4{% +\noexpand\def##4{##1}\noexpand\def##3{#1##2}% +}} +\edef\@dtl@construct@lop@ff#1{% +\noexpand\long\noexpand\def\noexpand\@dtl@lop@ff#1##1#1##2\noexpand +\to##3##4{% +\noexpand\def##4{##1}\noexpand\def##3{#1##2}% +}} +\newcommand{\@dtl@construct@lopoffs}{% +\edef\@dtl@chars{{\@dtl@separator}{\@dtl@delimiter}}% +\expandafter\@dtl@construct@lopoff\@dtl@chars +\expandafter\@dtl@construct@qlopoff\@dtl@chars +\expandafter\@dtl@construct@lop@ff\expandafter{\@dtl@separator}% +} +\newcommand*{\@dtl@decimal}{.} +\newcommand*{\@dtl@numbergroupchar}{,} +\newcommand*{\DTLsetnumberchars}[2]{% +\renewcommand*{\@dtl@numbergroupchar}{#1}% +\renewcommand*{\@dtl@decimal}{#2}% +\@dtl@construct@getnums +\@dtl@construct@stripnumgrpchar{#1}} +\edef\@dtl@construct@getintfrac#1{% +\noexpand\def\noexpand\@dtl@getintfrac##1#1##2\noexpand\relax{% +\noexpand\@dtl@get@intpart{##1}% +\noexpand\def\noexpand\@dtl@fracpart{##2}% +\noexpand\ifx\noexpand\@empty\noexpand\@dtl@fracpart + \noexpand\def\noexpand\@dtl@fracpart{0}% +\noexpand\else + \noexpand\@dtl@getfracpart##2\noexpand\relax + \noexpand\@dtl@choptrailingzeroes{\noexpand\@dtl@fracpart}% +\noexpand\fi +}% +\noexpand\def\noexpand\@dtl@getfracpart##1#1\noexpand\relax{% +\noexpand\def\noexpand\@dtl@fracpart{##1}% +}% +\noexpand\def\noexpand\DTLconverttodecimal##1##2{% +\noexpand\dtl@ifsingle{##1}% +{\noexpand\expandafter\noexpand\toks@\noexpand\expandafter{##1}% +\noexpand\edef\noexpand\@dtl@tmp{\noexpand\the\noexpand\toks@}}% +{\noexpand\def\noexpand\@dtl@tmp{##1}}% + \noexpand\@dtl@standardize@currency\noexpand\@dtl@tmp + \noexpand\ifx\noexpand\@dtl@org@currency\noexpand\@empty + \noexpand\else + \noexpand\let\noexpand\@dtl@currency\noexpand\@dtl@org@currency + \noexpand\fi +\noexpand\expandafter +\noexpand\@dtl@getintfrac\noexpand\@dtl@tmp#1\noexpand\relax +\noexpand\edef##2{\noexpand\@dtl@intpart.\noexpand\@dtl@fracpart}}% +} +\newcommand*{\@dtl@construct@getnums}{% +\expandafter\@dtl@construct@getintfrac\expandafter{\@dtl@decimal}} +\newcommand*{\@dtl@get@intpart}[1]{% +\@dtl@tmpcount=1\relax +\def\@dtl@intpart{#1}% +\ifx\@dtl@intpart\@empty + \def\@dtl@intpart{0}% +\else + \def\@dtl@intpart{}% + \@dtl@get@int@part#1.\relax% +\fi +\ifnum\@dtl@tmpcount<0\relax + \edef\@dtl@intpart{-\@dtl@intpart}% +\fi +\@dtl@strip@numgrpchar{\@dtl@intpart}% +} +\def\@dtl@get@int@part#1#2\relax{% +\def\@dtl@argi{#1}% +\def\@dtl@argii{#2}% +\ifx\protect#1\relax% + \let\@dtl@get@nextintpart=\@dtl@get@int@part +\else + \expandafter\ifx\@dtl@argi\$% + \let\@dtl@get@nextintpart=\@dtl@get@int@part + \else + \ifx-#1% + \multiply\@dtl@tmpcount by -1\relax + \let\@dtl@get@nextintpart=\@dtl@get@int@part + \else + \if\@dtl@argi+% + \let\@dtl@get@nextintpart=\@dtl@get@int@part + \else + \def\@dtl@intpart{#1}% + \ifx.\@dtl@argii + \let\@dtl@get@nextintpart=\@gobble + \else + \let\@dtl@get@nextintpart=\@dtl@get@next@intpart + \fi + \fi + \fi + \fi +\fi +\@dtl@get@nextintpart#2\relax +} +\def\@dtl@get@next@intpart#1.\relax{% +\edef\@dtl@intpart{\@dtl@intpart#1}% +} +\newcommand*{\@dtl@choptrailingzeroes}[1]{% +\def\@dtl@tmpcpz{}% +\expandafter\@dtl@chop@trailingzeroes#1\@nil% +\let#1=\@dtl@tmpcpz +} +\def\@dtl@chop@trailingzeroes#1#2\@nil{% +\FPifeq{#2}{0}% + \edef\@dtl@tmpcpz{\@dtl@tmpcpz#1}% + \let\@dtl@chopzeroesnext=\@dtl@gobbletonil +\else + \edef\@dtl@tmpcpz{\@dtl@tmpcpz#1}% + \let\@dtl@chopzeroesnext=\@dtl@chop@trailingzeroes +\fi +\@dtl@chopzeroesnext#2\@nil +} +\def\@dtl@gobbletonil#1\@nil{} +\newcommand*{\dtl@truncatedecimal}[1]{% +\expandafter\@dtl@truncatedecimal#1.\@nil#1} +\def\@dtl@truncatedecimal#1.#2\@nil#3{% +\def#3{#1}} +\newcommand*{\@dtl@strip@numgrpchar}[1]{% +\def\@dtl@stripped{}% +\edef\@dtl@do@stripnumgrpchar{% +\noexpand\@@dtl@strip@numgrpchar#1\@dtl@numbergroupchar +\noexpand\relax}% +\@dtl@do@stripnumgrpchar +\let#1=\@dtl@stripped +} +\edef\@dtl@construct@stripnumgrpchar#1{% +\noexpand\def\noexpand\@@dtl@strip@numgrpchar##1#1##2\noexpand\relax{% +\noexpand\expandafter\noexpand\toks@\noexpand\expandafter +{\noexpand\@dtl@stripped}% +\noexpand\edef\noexpand\@dtl@stripped{\noexpand\the\noexpand\toks@ +##1}% +\noexpand\def\noexpand\@dtl@tmp{##2}% +\noexpand\ifx\noexpand\@dtl@tmp\noexpand\@empty + \noexpand\let\noexpand\@dtl@next=\noexpand\relax +\noexpand\else + \noexpand\let\noexpand\@dtl@next=\noexpand\@@dtl@strip@numgrpchar +\noexpand\fi +\noexpand\@dtl@next##2\noexpand\relax +}% +} +\newcommand*{\DTLdecimaltolocale}[2]{% +\edef\@dtl@tmpdtl{#1}% +\expandafter\@dtl@decimaltolocale\@dtl@tmpdtl.\relax +\FPifeq{\@dtl@fracpart}{0}% + \edef#2{\@dtl@intpart}% +\else + \edef#2{\@dtl@intpart\@dtl@decimal\@dtl@fracpart}% +\fi +} +\def\@dtl@decimaltolocale#1.#2\relax{% +\@dtl@decimaltolocaleint{#1}% +\def\@dtl@fracpart{#2}% +\ifx\@dtl@fracpart\@empty + \def\@dtl@fracpart{0}% +\else + \@dtl@decimaltolocalefrac#2\relax +\fi +} +\def\@dtl@decimaltolocaleint#1{% +\@dtl@tmpcount=0\relax +\@dtl@countdigits#1.\relax +\@dtl@numgrpsepcount=\@dtl@tmpcount\relax +\divide\@dtl@numgrpsepcount by 3\relax +\multiply\@dtl@numgrpsepcount by 3\relax +\advance\@dtl@numgrpsepcount by -\@dtl@tmpcount\relax +\ifnum\@dtl@numgrpsepcount<0\relax + \advance\@dtl@numgrpsepcount by 3\relax +\fi +\def\@dtl@intpart{}% +\@dtl@decimal@to@localeint#1.\relax +} +\def\@dtl@countdigits#1#2\relax{% +\advance\@dtl@tmpcount by 1\relax +\ifx.#2\relax + \let\@dtl@countnext=\@gobble +\else + \let\@dtl@countnext=\@dtl@countdigits +\fi +\@dtl@countnext#2\relax +} +\def\@dtl@decimal@to@localeint#1#2\relax{% +\advance\@dtl@numgrpsepcount by 1\relax +\ifx.#2\relax + \edef\@dtl@intpart{\@dtl@intpart#1}% + \let\@dtl@localeintnext=\@gobble +\else + \ifnum\@dtl@numgrpsepcount=3\relax + \edef\@dtl@intpart{\@dtl@intpart#1\@dtl@numbergroupchar}% + \@dtl@numgrpsepcount=0\relax + \else + \ifnum\@dtl@numgrpsepcount>3\relax + \@dtl@numgrpsepcount=0\relax + \fi + \edef\@dtl@intpart{\@dtl@intpart#1}% + \fi + \let\@dtl@localeintnext=\@dtl@decimal@to@localeint +\fi +\@dtl@localeintnext#2\relax +} +\def\@dtl@decimaltolocalefrac#1.\relax{% +\def\@dtl@fracpart{#1}% +\@dtl@choptrailingzeroes{\@dtl@fracpart}% +} +\newcommand*{\DTLdecimaltocurrency}[2]{% +\edef\@dtl@tmpdtl{#1}% +\expandafter\@dtl@decimaltolocale\@dtl@tmpdtl.\relax +\dtl@truncatedecimal\@dtl@tmpdtl +\@dtl@tmpcount=\@dtl@tmpdtl\relax +\expandafter\@dtl@toks\expandafter{\@dtl@currency}% +\FPifeq{\@dtl@fracpart}{0}% + \ifnum\@dtl@tmpcount<0\relax + \@dtl@tmpcount = -\@dtl@tmpcount\relax + \edef#2{-\the\@dtl@toks\the\@dtl@tmpcount\@dtl@decimal00}% + \else + \edef#2{\the\@dtl@toks\@dtl@intpart\@dtl@decimal00}% + \fi +\else + \ifnum\@dtl@tmpcount<0\relax + \@dtl@tmpcount = -\@dtl@tmpcount\relax + \ifnum\@dtl@fracpart<10\relax + \edef#2{-\the\@dtl@toks\number\@dtl@tmpcount + \@dtl@decimal\@dtl@fracpart0}% + \else + \edef#2{-\the\@dtl@toks\number\@dtl@tmpcount + \@dtl@decimal\@dtl@fracpart}% + \fi + \else + \ifnum\@dtl@fracpart<10\relax + \edef#2{\the\@dtl@toks\@dtl@intpart\@dtl@decimal\@dtl@fracpart0}% + \else + \edef#2{\the\@dtl@toks\@dtl@intpart\@dtl@decimal\@dtl@fracpart}% + \fi + \fi +\fi +} +\@dtl@construct@lopoffs +\@dtl@construct@getnums +\expandafter\@dtl@construct@stripnumgrpchar\expandafter +{\@dtl@numbergroupchar} +\define@key{datatool.sty}{separator}{% +\DTLsetseparator{#1}} +\define@key{datatool.sty}{delimiter}{% +\DTLsetdelimiter{#1}} +\define@boolkey{datatool.sty}[dtl]{verbose}[true]{% +\ifdtlverbose \FPmessagestrue\else \FPmessagesfalse\fi} +\newcommand*{\dtl@message}[1]{% +\ifdtlverbose\typeout{#1}\fi} +\ProcessOptionsX +\DeclareRobustCommand\DTLpar{\@par} +\newcount\@dtl@datatype +\newcount\@dtl@tmpcount +\newlength\dtl@tmplength +\newcount\@dtl@numgrpsepcount +\newcommand{\@dtl@checknumerical}[1]{% +\@dtl@numgrpsepfalse +\def\@dtl@tmp{#1}% +\ifx\@empty#1\@empty + \@dtl@datatype=0\relax +\else + \dtl@ifsingle{#1}% + {\expandafter\toks@\expandafter{#1}% + \edef\@dtl@tmp{\the\toks@}}% + {\def\@dtl@tmp{#1}}% + \@dtl@tmpcount=0\relax + \@dtl@datatype=0\relax + \@dtl@numgrpsepcount=2\relax + \@dtl@standardize@currency\@dtl@tmp + \ifx\@dtl@org@currency\@empty + \else + \let\@dtl@currency\@dtl@org@currency + \fi + \expandafter\@dtl@checknumericalstart\@dtl@tmp\@nil\@nil +\fi +\ifnum\@dtl@numgrpsepcount>-1\relax + \if@dtl@numgrpsep + \ifnum\@dtl@numgrpsepcount=3\relax + \else + \@dtl@datatype=0\relax + \fi + \fi +\fi +} +\def\@dtl@checknumericalstart#1#2\@nil\@nil{% +\ifx#1\protect + \@dtl@checknumericalstart#2\@nil\@nil\relax +\else + \ifx-#1\relax + \def\@dtl@tmp{#2}% + \ifx\@empty\@dtl@tmp + \@dtl@datatype=0\relax + \else + \ifnum\@dtl@datatype=0\relax + \@dtl@datatype=1\relax + \fi + \@dtl@checknumericalstart#2\@nil\@nil\relax + \fi + \else + \ifx+#1\relax + \def\@dtl@tmp{#2}% + \ifx\@empty\@dtl@tmp + \@dtl@datatype=0\relax + \else + \ifnum\@dtl@datatype=0\relax + \@dtl@datatype=1\relax + \fi + \@dtl@checknumericalstart#2\@nil\@nil\relax + \fi + \else + \def\@dtl@tmp{#1}% + \ifx#1\$\relax + \@dtl@datatype=3\relax + \@dtl@checknumericalstart#2\@nil\@nil\relax + \else + \ifx\@empty\@dtl@tmp + \@dtl@datatype=0\relax + \else + \ifnum\@dtl@datatype=0\relax + \@dtl@datatype=1\relax + \fi + \@dtl@checknumericalloop#1#2\@nil\@nil\relax + \fi + \fi + \fi + \fi +\fi +} +\newif\if@dtl@numgrpsep +\newcommand*{\@dtl@ifDigitOrDecimalSep}[3]{% +\ifx0#1\relax + #2% +\else + \ifx1#1\relax + #2% + \else + \ifx2#1\relax + #2% + \else + \ifx3#1\relax + #2% + \else + \ifx4#1\relax + #2% + \else + \ifx5#1\relax + #2% + \else + \ifx6#1\relax + #2% + \else + \ifx7#1\relax + #2% + \else + \ifx8#1\relax + #2% + \else + \ifx9#1\relax + #2% + \else + \expandafter\ifx\@dtl@decimal#1\relax + #2% + \else + #3% + \fi + \fi + \fi + \fi + \fi + \fi + \fi + \fi + \fi + \fi +\fi +} +\def\@dtl@checknumericalloop#1#2\@nil{% +\def\@dtl@tmp{#1}% +\ifx\@nnil\@dtl@tmp\relax + \let\@dtl@chcknumnext=\@dtl@checknumericalnoop% +\else + \@dtl@ifDigitOrDecimalSep{#1}{% + \let\@dtl@chcknumnext=\@dtl@checknumericalloop% + \expandafter\ifx\@dtl@decimal#1\relax + \if@dtl@numgrpsep + \ifnum\@dtl@numgrpsepcount=3\relax + \@dtl@numgrpsepcount=-1\relax + \else + \@dtl@datatype=0\relax + \let\@dtl@chcknumnext=\@dtl@checknumericalnoop + \fi + \else + \@dtl@numgrpsepcount=-1\relax + \fi + \else + \ifnum\@dtl@numgrpsepcount=-1\relax + \else + \advance\@dtl@numgrpsepcount by 1\relax + \fi + \fi +}{% +\ifx\@dtl@numbergroupchar\@dtl@tmp\relax + \@dtl@numgrpseptrue + \ifnum\@dtl@numgrpsepcount<3\relax + \@dtl@datatype=0\relax + \let\@dtl@chcknumnext=\@dtl@checknumericalnoop + \else + \@dtl@numgrpsepcount=0\relax + \fi +\else + \@dtl@datatype=0\relax + \let\@dtl@chcknumnext=\@dtl@checknumericalnoop +\fi +}% + \ifx\@dtl@decimal\@dtl@tmp\relax + \ifnum\@dtl@datatype<3\relax + \@dtl@datatype=2\relax + \fi + \advance\@dtl@tmpcount by 1\relax + \ifnum\@dtl@tmpcount>1\relax + \@dtl@datatype=0\relax + \let\@dtl@chcknumnext=\@dtl@checknumericalnoop% + \fi + \fi +\fi +\@dtl@chcknumnext#2\@nil +} +\def\@dtl@checknumericalnoop#1\@nil#2{} +\newcommand{\DTLifnumerical}[3]{% +\@dtl@checknumerical{#1}% +\ifnum\@dtl@datatype=0\relax#3\else#2\fi +} +\newcommand{\DTLifreal}[3]{% +\@dtl@checknumerical{#1}% +\ifnum\@dtl@datatype=2\relax #2\else #3\fi +} +\newcommand{\DTLifint}[3]{% +\@dtl@checknumerical{#1}% +\ifnum\@dtl@datatype=1\relax #2\else #3\fi +} +\newcommand{\DTLifstring}[3]{% +\@dtl@checknumerical{#1}% +\ifnum\@dtl@datatype=0\relax #2\else #3\fi +} +\newcommand{\DTLifcurrency}[3]{% +\@dtl@checknumerical{#1}% +\ifnum\@dtl@datatype=3\relax #2\else #3\fi +} +\newcommand*{\DTLifcurrencyunit}[4]{% +\@dtl@checknumerical{#1}% +\ifnum\@dtl@datatype=3\relax + \ifthenelse{\equal{\@dtl@org@currency}{#2}}{#3}{#4}% +\else + #4% +\fi +} +\newcommand{\DTLifcasedatatype}[5]{% +\@dtl@checknumerical{#1}% +\ifcase\@dtl@datatype + #2% string +\or + #3% integer +\or + #4% number +\or + #5% currency +\fi +} +\newcommand*{\dtl@testbothnumerical}[2]{% +\dtl@ifsingle{#1}{% + \edef\@dtl@tmp{#1}}{% + \def\@dtl@tmp{#1}}% +\expandafter\@dtl@checknumerical\expandafter{\@dtl@tmp}% +\edef\@dtl@firsttype{\number\@dtl@datatype}% +\dtl@ifsingle{#2}{% + \edef\@dtl@tmp{#2}}{% + \def\@dtl@tmp{#2}}% +\expandafter\@dtl@checknumerical\expandafter{\@dtl@tmp}% +\multiply\@dtl@datatype by \@dtl@firsttype\relax +\ifnum\@dtl@datatype>0\relax + \@dtl@conditiontrue +\else + \@dtl@conditionfalse +\fi +} +\newcommand*{\DTLifnumlt}[4]{% + \DTLconverttodecimal{#1}{\@dtl@numi}% + \DTLconverttodecimal{#2}{\@dtl@numii}% + \FPiflt{\@dtl@numi}{\@dtl@numii}% + #3% + \else + #4% + \fi +} +\newcommand*{\dtlcompare}[3]{% +\dtl@subnobrsp{#2}{\@dtl@argA}% +\dtl@subnobrsp{#3}{\@dtl@argB}% +\ifx\@dtl@argA\@empty + \ifx\@dtl@argB\@empty + #1=0\relax + \else + #1=-1\relax + \fi +\else + \ifx\@dtl@argB\@empty + #1=1\relax + \else + \DTLsubstituteall{\@dtl@argA}{ }{\space }% + \DTLsubstituteall{\@dtl@argB}{ }{\space }% + \expandafter\dtl@getfirst\@dtl@argA\end + \let\dtl@firstA=\dtl@first + \let\dtl@restA=\dtl@rest + \expandafter\dtl@getfirst\@dtl@argB\end + \let\dtl@firstB=\dtl@first + \let\dtl@restB=\dtl@rest + \expandafter\dtl@ifsingle\expandafter{\dtl@firstA}{% + \expandafter\dtl@ifsingle\expandafter{\dtl@firstB}{% + \expandafter\dtl@setcharcode\expandafter{\dtl@firstA}{\dtl@codeA}% + \expandafter\dtl@setcharcode\expandafter{\dtl@firstB}{\dtl@codeB}% + \ifnum\dtl@codeA=-1\relax + \ifnum\dtl@codeB=-1\relax + \protected@edef\dtl@donext{% + \noexpand\dtlcompare{\noexpand#1}{\dtl@restA}{\dtl@restB}}% + \dtl@donext + \else + \protected@edef\dtl@donext{% + \noexpand\dtlcompare + {\noexpand#1}{\dtl@restA}{\dtl@firstB\dtl@restB}}% + \dtl@donext + \fi + \else + \ifnum\dtl@codeB=-1\relax + \protected@edef\dtl@donext{% + \noexpand\dtlcompare + {\noexpand#1}{\dtl@firstA\dtl@restA}{\dtl@restB}}% + \dtl@donext + \else + \ifnum\dtl@codeA<\dtl@codeB + #1=-1\relax + \else + \ifnum\dtl@codeA>\dtl@codeB + #1=1\relax + \else + \ifx\dtl@restA\@empty + \ifx\dtl@restB\@empty + #1=0\relax + \else + #1=-1\relax + \fi + \else + \ifx\restB\@empty + #1=1\relax + \else + \protected@edef\dtl@donext{% + \noexpand\dtlcompare + {\noexpand#1}{\dtl@restA}{\dtl@restB}}% + \dtl@donext + \fi + \fi + \fi + \fi + \fi + \fi + }{% + \protected@edef\dtl@donext{% + \noexpand\dtlcompare + {\noexpand#1}{\dtl@firstA\dtl@restA}{\dtl@firstB\dtl@restB}}% + \dtl@donext + }}{% + \protected@edef\dtl@donext{% + \noexpand\dtlcompare + {\noexpand#1}{\dtl@firstA\dtl@restA}{\dtl@firstB\dtl@restB}}% + \dtl@donext + }% + \fi +\fi +} +\def\dtl@getfirst#1#2\end{% +\def\dtl@first{#1}% +\ifx\dtl@first\@empty + \def\dtl@rest{#2}% +\else + \dtl@ifsingle{#1}{\def\dtl@rest{#2}}{\dtl@getfirst#1#2\end}% +\fi +} +\newcount\dtl@codeA +\newcount\dtl@codeB +\newcommand*{\dtl@setcharcode}[2]{% +\def\@dtl@tmp{#1}% +\ifx\@dtl@tmp\@empty + #2=-1\relax +\else + \ifx#1\space\relax + #2=`\ \relax + \else + \ifx#1~\relax + #2=`\ \relax + \else + \ifcat\noexpand#1\relax% + #2=-1\relax + \else + #2=`#1\relax + \fi + \fi + \fi +\fi +} +\newcommand*{\dtl@setlccharcode}[2]{% +\def\@dtl@tmp{#1}% +\ifx\@dtl@tmp\@empty + #2=-1\relax +\else + \ifx#1\space\relax + #2=`\ \relax + \else + \ifx#1~\relax + #2=`\ \relax + \else + \ifcat\noexpand#1\relax% + #2=-1\relax + \else + #2=\lccode`#1\relax + \fi + \fi + \fi +\fi +} +\newcommand*{\dtlicompare}[3]{% +\dtl@subnobrsp{#2}{\@dtl@argA}% +\dtl@subnobrsp{#3}{\@dtl@argB}% +\ifx\@dtl@argA\@empty + \ifx\@dtl@argB\@empty + #1=0\relax + \else + #1=-1\relax + \fi +\else + \ifx\@dtl@argB\@empty + #1=1\relax + \else + \DTLsubstituteall{\@dtl@argA}{ }{\space }% + \DTLsubstituteall{\@dtl@argB}{ }{\space }% + \expandafter\dtl@getfirst\@dtl@argA\end + \let\dtl@firstA=\dtl@first + \let\dtl@restA=\dtl@rest + \expandafter\dtl@getfirst\@dtl@argB\end + \let\dtl@firstB=\dtl@first + \let\dtl@restB=\dtl@rest + \expandafter\dtl@ifsingle\expandafter{\dtl@firstA}{% + \expandafter\dtl@ifsingle\expandafter{\dtl@firstB}{% + \expandafter\dtl@setlccharcode\expandafter{\dtl@firstA}{\dtl@codeA}% + \expandafter\dtl@setlccharcode\expandafter{\dtl@firstB}{\dtl@codeB}% + \ifnum\dtl@codeA=-1\relax + \ifnum\dtl@codeB=-1\relax + \protected@edef\dtl@donext{% + \noexpand\dtlicompare{\noexpand#1}{\dtl@restA}{\dtl@restB}}% + \dtl@donext + \else + \protected@edef\dtl@donext{% + \noexpand\dtlicompare + {\noexpand#1}{\dtl@restA}{\dtl@firstB\dtl@restB}}% + \dtl@donext + \fi + \else + \ifnum\dtl@codeB=-1\relax + \protected@edef\dtl@donext{% + \noexpand\dtlicompare + {\noexpand#1}{\dtl@firstA\dtl@restA}{\dtl@restB}}% + \dtl@donext + \else + \ifnum\dtl@codeA<\dtl@codeB + #1=-1\relax + \else + \ifnum\dtl@codeA>\dtl@codeB + #1=1\relax + \else + \ifx\dtl@restA\@empty + \ifx\dtl@restB\@empty + #1=0\relax + \else + #1=-1\relax + \fi + \else + \ifx\restB\@empty + #1=1\relax + \else + \protected@edef\dtl@donext{% + \noexpand\dtlicompare + {\noexpand#1}{\dtl@restA}{\dtl@restB}}% + \dtl@donext + \fi + \fi + \fi + \fi + \fi + \fi + }{% + \protected@edef\dtl@donext{% + \noexpand\dtlicompare + {\noexpand#1}{\dtl@firstA\dtl@restA}{\dtl@firstB\dtl@restB}}% + \dtl@donext + }}{% + \protected@edef\dtl@donext{% + \noexpand\dtlicompare + {\noexpand#1}{\dtl@firstA\dtl@restA}{\dtl@firstB\dtl@restB}}% + \dtl@donext + }% + \fi +\fi +} +\newcommand*{\DTLifstringlt}{\@ifstar\@sDTLifstringlt\@DTLifstringlt} +\newcommand*{\@DTLifstringlt}[4]{% +\protected@edef\@dtl@tmpcmp{% + \noexpand\dtlcompare{\noexpand\@dtl@tmpcount}{#1}{#2}}% +\@dtl@tmpcmp +\ifnum\@dtl@tmpcount<0\relax + #3% +\else + #4% +\fi +} +\newcommand*{\@sDTLifstringlt}[4]{% +\protected@edef\@dtl@tmpcmp{% + \noexpand\dtlicompare{\noexpand\@dtl@tmpcount}{#1}{#2}}% +\@dtl@tmpcmp +\ifnum\@dtl@tmpcount<0\relax + #3% +\else + #4% +\fi +} +\newcommand*{\DTLiflt}{\@ifstar\@sDTLiflt\@DTLiflt} +\newcommand*{\@DTLiflt}[4]{% +\dtl@testbothnumerical{#1}{#2}% +\if@dtl@condition + \DTLifnumlt{#1}{#2}{#3}{#4}% +\else + \@DTLifstringlt{#1}{#2}{#3}{#4}% +\fi +} +\newcommand*{\@sDTLiflt}[4]{% +\dtl@testbothnumerical{#1}{#2}% +\if@dtl@condition + \DTLifnumlt{#1}{#2}{#3}{#4}% +\else + \@sDTLifstringlt{#1}{#2}{#3}{#4}% +\fi +} +\newcommand*{\DTLifnumgt}[4]{% + \DTLconverttodecimal{#1}{\@dtl@numi}% + \DTLconverttodecimal{#2}{\@dtl@numii}% + \FPifgt{\@dtl@numi}{\@dtl@numii}% + #3% + \else + #4% + \fi +} +\newcommand*{\DTLifstringgt}{\@ifstar\@sDTLifstringgt\@DTLifstringgt} +\newcommand*{\@DTLifstringgt}[4]{% +\protected@edef\@dtl@tmpcmp{% + \noexpand\dtlcompare{\noexpand\@dtl@tmpcount}{#1}{#2}}% +\@dtl@tmpcmp +\ifnum\@dtl@tmpcount>0\relax + #3% +\else + #4% +\fi +} +\newcommand*{\@sDTLifstringgt}[4]{% +\protected@edef\@dtl@tmpcmp{% + \noexpand\dtlicompare{\noexpand\@dtl@tmpcount}{#1}{#2}}% +\@dtl@tmpcmp +\ifnum\@dtl@tmpcount>0\relax + #3% +\else + #4% +\fi +} +\newcommand*{\DTLifgt}{\@ifstar\@sDTLifgt\@DTLifgt} +\newcommand*{\@DTLifgt}[4]{% +\dtl@testbothnumerical{#1}{#2}% +\if@dtl@condition + \DTLifnumgt{#1}{#2}{#3}{#4}% +\else + \@DTLifstringgt{#1}{#2}{#3}{#4}% +\fi +} +\newcommand*{\@sDTLifgt}[4]{% +\dtl@testbothnumerical{#1}{#2}% +\if@dtl@condition + \DTLifnumgt{#1}{#2}{#3}{#4}% +\else + \@sDTLifstringgt{#1}{#2}{#3}{#4}% +\fi +} +\newcommand*{\DTLifnumeq}[4]{% + \DTLconverttodecimal{#1}{\@dtl@numi}% + \DTLconverttodecimal{#2}{\@dtl@numii}% + \FPifeq{\@dtl@numi}{\@dtl@numii}% + #3% + \else + #4% + \fi +} +\newcommand*{\DTLifstringeq}{\@ifstar\@sDTLifstringeq\@DTLifstringeq} +\newcommand*{\@DTLifstringeq}[4]{% +\protected@edef\@dtl@tmpcmp{% + \noexpand\dtlcompare{\noexpand\@dtl@tmpcount}{#1}{#2}}% +\@dtl@tmpcmp +\ifnum\@dtl@tmpcount=0\relax + #3% +\else + #4% +\fi +} +\newcommand*{\@sDTLifstringeq}[4]{% +\protected@edef\@dtl@tmpcmp{% + \noexpand\dtlicompare{\noexpand\@dtl@tmpcount}{#1}{#2}}% +\@dtl@tmpcmp +\ifnum\@dtl@tmpcount=0\relax + #3% +\else + #4% +\fi +} +\newcommand*{\DTLifeq}{\@ifstar\@sDTLifeq\@DTLifeq} +\newcommand*{\@DTLifeq}[4]{% +\dtl@testbothnumerical{#1}{#2}% +\if@dtl@condition + \DTLifnumeq{#1}{#2}{#3}{#4}% +\else + \@DTLifstringeq{#1}{#2}{#3}{#4}% +\fi +} +\newcommand*{\@sDTLifeq}[4]{% +\dtl@testbothnumerical{#1}{#2}% +\if@dtl@condition + \DTLifnumeq{#1}{#2}{#3}{#4}% +\else + \@sDTLifstringeq{#1}{#2}{#3}{#4}% +\fi +} +\newcommand*{\DTLifSubString}[4]{% +\protected@edef\@dtl@tmp{\noexpand\dtl@testifsubstring +{#1}{#2}}% +\@dtl@tmp +\if@dtl@condition + #3% +\else + #4% +\fi +} +\newcommand*{\dtl@testifsubstring}[2]{% +\dtl@subnobrsp{#1}{\@dtl@argA}% +\dtl@subnobrsp{#2}{\@dtl@argB}% +\ifx\@dtl@argB\@empty + \@dtl@conditiontrue +\else + \ifx\@dtl@argA\@empty + \@dtl@conditionfalse + \else + \dtl@teststartswith{#1}{#2}% + \if@dtl@condition + \else + \DTLsubstituteall{\@dtl@argA}{ }{\space }% + \expandafter\dtl@getfirst\@dtl@argA\end + \expandafter\dtl@ifsingle\expandafter{\dtl@first}{% + \expandafter\dtl@testifsubstring\expandafter{\dtl@rest}{#2}% + }{% + \protected@edef\@dtl@donext{\noexpand\dtl@testifsubstring + {\dtl@first\dtl@rest}{\@dtl@argB}}% + \@dtl@donext + }% + \fi + \fi +\fi +} +\newcommand*{\DTLifStartsWith}[4]{% +\@dtl@conditionfalse +\protected@edef\@dtl@tmp{\noexpand\dtl@teststartswith{#1}{#2}}% +\@dtl@tmp +\if@dtl@condition + #3% +\else + #4% +\fi +} +\newcommand*{\dtl@teststartswith}[2]{% +\dtl@subnobrsp{#1}{\@dtl@argA}% +\dtl@subnobrsp{#2}{\@dtl@argB}% +\ifx\@dtl@argA\@empty + \ifx\@dtl@argB\@empty + \@dtl@conditiontrue + \else + \@dtl@conditionfalse + \fi +\else + \ifx\@dtl@argB\@empty + \@dtl@conditiontrue + \else + \DTLsubstituteall{\@dtl@argA}{ }{\space }% + \DTLsubstituteall{\@dtl@argB}{ }{\space }% + \expandafter\dtl@getfirst\@dtl@argA\end + \let\dtl@firstA=\dtl@first + \let\dtl@restA=\dtl@rest + \expandafter\dtl@getfirst\@dtl@argB\end + \let\dtl@firstB=\dtl@first + \let\dtl@restB=\dtl@rest + \expandafter\dtl@ifsingle\expandafter{\dtl@firstA}{% + \expandafter\dtl@ifsingle\expandafter{\dtl@firstB}{% + \expandafter\dtl@setcharcode\expandafter{\dtl@firstA}{\dtl@codeA}% + \expandafter\dtl@setcharcode\expandafter{\dtl@firstB}{\dtl@codeB}% + \ifnum\dtl@codeA=-1\relax + \ifnum\dtl@codeB=-1\relax + \protected@edef\dtl@donext{% + \noexpand\dtl@teststartswith{\dtl@restA}{\dtl@restB}}% + \dtl@donext + \else + \protected@edef\dtl@donext{% + \noexpand\dtl@teststartswith + {\dtl@restA}{\dtl@firstB\dtl@restB}}% + \dtl@donext + \fi + \else + \ifnum\dtl@codeB=-1\relax + \protected@edef\dtl@donext{% + \noexpand\dtl@teststartswith + {\dtl@firstA\dtl@restA}{\dtl@restB}}% + \dtl@donext + \else + \ifnum\dtl@codeA=\dtl@codeB + \protected@edef\dtl@donext{% + \noexpand\dtl@teststartswith{\dtl@restA}{\dtl@restB}}% + \dtl@donext + \else + \@dtl@conditionfalse + \fi + \fi + \fi + }{% + \protected@edef\dtl@donext{% + \noexpand\dtl@teststartswith + {\dtl@firstA\dtl@restA}{\dtl@firstB\dtl@restB}}% + \dtl@donext + }}{% + \protected@edef\dtl@donext{% + \noexpand\dtl@teststartswith + {\dtl@firstA\dtl@restA}{\dtl@firstB\dtl@restB}}% + }% + \fi +\fi +} +\newcommand*{\DTLifnumclosedbetween}[5]{% +\DTLconverttodecimal{#1}{\@dtl@numi}% +\DTLconverttodecimal{#2}{\@dtl@numii}% +\DTLconverttodecimal{#3}{\@dtl@numiii}% +\DTLifFPclosedbetween{\@dtl@numi}{\@dtl@numii}{\@dtl@numiii}{#4}{#5}% +} +\newcommand*{\DTLifstringclosedbetween}{% +\@ifstar\@sDTLifstringclosedbetween\@DTLifstringclosedbetween} +\newcommand*{\@DTLifstringclosedbetween}[5]{% +\protected@edef\@dtl@tmpcmp{% + \noexpand\dtlcompare{\noexpand\@dtl@tmpcount}{#1}{#2}}% +\@dtl@tmpcmp +\let\@dtl@dovalue\relax +\ifnum\@dtl@tmpcount<0\relax + \def\@dtl@dovalue{#5}% +\fi +\ifx\@dtl@dovalue\relax + \protected@edef\@dtl@tmpcmp{% + \noexpand\dtlcompare{\noexpand\@dtl@tmpcount}{#1}{#3}}% + \@dtl@tmpcmp + \ifnum\@dtl@tmpcount>0\relax + \def\@dtl@dovalue{#5}% + \else + \def\@dtl@dovalue{#4}% + \fi +\fi +\@dtl@dovalue +} +\newcommand*{\@sDTLifstringclosedbetween}[5]{% +\protected@edef\@dtl@tmpcmp{% + \noexpand\dtlicompare{\noexpand\@dtl@tmpcount}{#1}{#2}}% +\@dtl@tmpcmp +\let\@dtl@dovalue\relax +\ifnum\@dtl@tmpcount<0\relax + \def\@dtl@dovalue{#5}% +\fi +\ifx\@dtl@dovalue\relax + \protected@edef\@dtl@tmpcmp{% + \noexpand\dtlicompare{\noexpand\@dtl@tmpcount}{#1}{#3}}% + \@dtl@tmpcmp + \ifnum\@dtl@tmpcount>0\relax + \def\@dtl@dovalue{#5}% + \else + \def\@dtl@dovalue{#4}% + \fi +\fi +\@dtl@dovalue +} +\newcommand*{\DTLifclosedbetween}{% +\@ifstar\@sDTLifclosedbetween\@DTLifclosedbetween} +\newcommand*{\@DTLifclosedbetween}[5]{% +\dtl@testbothnumerical{#2}{#3}% +\if@dtl@condition + \dtl@ifsingle{#1}{% + \edef\@dtl@tmp{#1}}{% + \def\@dtl@tmp{#1}}% + \expandafter\@dtl@checknumerical\expandafter{\@dtl@tmp}% + \ifnum\@dtl@datatype>0\relax + \DTLifnumclosedbetween{#1}{#2}{#3}{#4}{#5}% + \else + \@DTLifstringclosedbetween{#1}{#2}{#3}{#4}{#5}% + \fi +\else + \@DTLifstringclosedbetween{#1}{#2}{#3}{#4}{#5}% +\fi +} +\newcommand*{\@sDTLifclosedbetween}[5]{% +\dtl@testbothnumerical{#2}{#3}% +\if@dtl@condition + \dtl@ifsingle{#1}{% + \edef\@dtl@tmp{#1}}{% + \def\@dtl@tmp{#1}}% + \expandafter\@dtl@checknumerical\expandafter{\@dtl@tmp}% + \ifnum\@dtl@datatype>0\relax + \DTLifnumclosedbetween{#1}{#2}{#3}{#4}{#5}% + \else + \@sDTLifstringclosedbetween{#1}{#2}{#3}{#4}{#5}% + \fi +\else + \@sDTLifstringclosedbetween{#1}{#2}{#3}{#4}{#5}% +\fi +} +\newcommand*{\DTLifnumopenbetween}[5]{% +\DTLconverttodecimal{#1}{\@dtl@numi}% +\DTLconverttodecimal{#2}{\@dtl@numii}% +\DTLconverttodecimal{#3}{\@dtl@numiii}% +\DTLifFPopenbetween{\@dtl@numi}{\@dtl@numii}{\@dtl@numiii}{#4}{#5}% +} +\newcommand*{\DTLifstringopenbetween}{% +\@ifstar\@sDTLifstringopenbetween\@DTLifstringopenbetween} +\newcommand*{\@DTLifstringopenbetween}[5]{% +\protected@edef\@dtl@tmpcmp{% + \noexpand\dtlcompare{\noexpand\@dtl@tmpcount}{#1}{#2}}% +\@dtl@tmpcmp +\let\@dtl@dovalue\relax +\ifnum\@dtl@tmpcount>0\relax +\else + \def\@dtl@dovalue{#5}% +\fi +\ifx\@dtl@dovalue\relax + \protected@edef\@dtl@tmpcmp{% + \noexpand\dtlcompare{\noexpand\@dtl@tmpcount}{#1}{#3}}% + \@dtl@tmpcmp + \ifnum\@dtl@tmpcount<0\relax + \def\@dtl@dovalue{#4}% + \else + \def\@dtl@dovalue{#5}% + \fi +\fi +\@dtl@dovalue +} +\newcommand*{\@sDTLifstringopenbetween}[5]{% +\protected@edef\@dtl@tmpcmp{% + \noexpand\dtlicompare{\noexpand\@dtl@tmpcount}{#1}{#2}}% +\@dtl@tmpcmp +\let\@dtl@dovalue\relax +\ifnum\@dtl@tmpcount>0\relax +\else + \def\@dtl@dovalue{#5}% +\fi +\ifx\@dtl@dovalue\relax + \protected@edef\@dtl@tmpcmp{% + \noexpand\dtlicompare{\noexpand\@dtl@tmpcount}{#1}{#3}}% + \@dtl@tmpcmp + \ifnum\@dtl@tmpcount<0\relax + \def\@dtl@dovalue{#4}% + \else + \def\@dtl@dovalue{#5}% + \fi +\fi +\@dtl@dovalue +} +\newcommand*{\DTLifopenbetween}{% +\@ifstar\@sDTLifopenbetween\@DTLifopenbetween} +\newcommand*{\@DTLifopenbetween}[5]{% +\dtl@testbothnumerical{#2}{#3}% +\if@dtl@condition + \dtl@ifsingle{#1}{% + \edef\@dtl@tmp{#1}}{% + \def\@dtl@tmp{#1}}% + \expandafter\@dtl@checknumerical\expandafter{\@dtl@tmp}% + \ifnum\@dtl@datatype>0\relax + \DTLifnumopenbetween{#1}{#2}{#3}{#4}{#5}% + \else + \@DTLifstringopenbetween{#1}{#2}{#3}{#4}{#5}% + \fi +\else + \@DTLifstringopenbetween{#1}{#2}{#3}{#4}{#5}% +\fi +} +\newcommand*{\@sDTLifopenbetween}[5]{% +\dtl@testbothnumerical{#2}{#3}% +\if@dtl@condition + \dtl@ifsingle{#1}{% + \edef\@dtl@tmp{#1}}{% + \def\@dtl@tmp{#1}}% + \expandafter\@dtl@checknumerical\expandafter{\@dtl@tmp}% + \ifnum\@dtl@datatype>0\relax + \DTLifnumopenbetween{#1}{#2}{#3}{#4}{#5}% + \else + \@sDTLifstringopenbetween{#1}{#2}{#3}{#4}{#5}% + \fi +\else + \@sDTLifstringopenbetween{#1}{#2}{#3}{#4}{#5}% +\fi +} +\newcommand*{\DTLifFPopenbetween}[5]{% + \let\@dtl@dovalue\relax + \FPifgt{#1}{#2}% + \else + \def\@dtl@dovalue{#5}% + \fi + \FPiflt{#1}{#3}% + \ifx\@dtl@dovalue\relax + \def\@dtl@dovalue{#4}% + \fi + \else + \def\@dtl@dovalue{#5}% + \fi +\@dtl@dovalue +} +\newcommand*{\DTLifFPclosedbetween}[5]{% + \let\@dtl@dovalue\relax + \FPifgt{#1}{#3}% + \def\@dtl@dovalue{#5}% + \fi + \FPiflt{#1}{#2}% + \ifx\@dtl@dovalue\relax + \def\@dtl@dovalue{#5}% + \fi + \else + \def\@dtl@dovalue{#4}% + \fi +\@dtl@dovalue +} +\newcommand{\DTLiffirstrow}[2]{% +\ifnum\dtlforeachlevel=0\relax + \PackageError{datatool}{\string\DTLiffirstrow\space can only + be used inside \string\DTLforeach}{}% +\else +\expandafter\ifnum\csname c@DTLrow\romannumeral +\dtlforeachlevel\endcsname +=1\relax#1\else#2\fi +\fi} +\newcommand{\DTLiflastrow}[2]{% +\ifnum\dtlforeachlevel=0\relax + \PackageError{datatool}{\string\DTLiflastrow\space can only + be used inside \string\DTLforeach}{}% +\else +\ifx\@dtl@nextrow\@nnil +#1\else #2\fi +\fi +} +\newcommand{\DTLifoddrow}[2]{% +\ifnum\dtlforeachlevel=0\relax + \PackageError{datatool}{\string\DTLifoddrow\space can only + be used inside \string\DTLforeach}{}% +\else +\expandafter\ifodd\csname c@DTLrow\romannumeral +\dtlforeachlevel\endcsname +#1\else #2\fi +\fi +} +\newif\if@dtl@condition +\newcommand*{\dtl@testlt}[2]{% +\DTLiflt{#1}{#2}{\@dtl@conditiontrue}{\@dtl@conditionfalse}} +\newcommand*{\DTLislt}[2]{% +\TE@throw\noexpand\dtl@testlt{#1}{#2}\noexpand\if@dtl@condition} +\newcommand*{\dtl@testiclt}[2]{% +\@sDTLiflt{#1}{#2}{\@dtl@conditiontrue}{\@dtl@conditionfalse}} +\newcommand*{\DTLisilt}[2]{% +\TE@throw\noexpand\dtl@testiclt{#1}{#2}\noexpand\if@dtl@condition} +\newcommand*{\dtl@testgt}[2]{% +\DTLifgt{#1}{#2}{\@dtl@conditiontrue}{\@dtl@conditionfalse}} +\newcommand*{\DTLisgt}[2]{% +\TE@throw\noexpand\dtl@testgt{#1}{#2}\noexpand\if@dtl@condition} +\newcommand*{\dtl@testicgt}[2]{% +\@sDTLifgt{#1}{#2}{\@dtl@conditiontrue}{\@dtl@conditionfalse}} +\newcommand*{\DTLisigt}[2]{% +\TE@throw\noexpand\dtl@testicgt{#1}{#2}\noexpand\if@dtl@condition} +\newcommand*{\dtl@testeq}[2]{% +\DTLifeq{#1}{#2}{\@dtl@conditiontrue}{\@dtl@conditionfalse}} +\newcommand*{\DTLiseq}[2]{% +\TE@throw\noexpand\dtl@testeq{#1}{#2}\noexpand\if@dtl@condition} +\newcommand*{\dtl@testiceq}[2]{% +\@sDTLifeq{#1}{#2}{\@dtl@conditiontrue}{\@dtl@conditionfalse}} +\newcommand*{\DTLisieq}[2]{% +\TE@throw\noexpand\dtl@testiceq{#1}{#2}\noexpand\if@dtl@condition} +\newcommand*{\DTLisSubString}[2]{% +\TE@throw\noexpand\dtl@testifsubstring{#1}{#2}% +\noexpand\if@dtl@condition} +\newcommand*{\DTLisPrefix}[2]{% +\TE@throw\noexpand\dtl@teststartswith{#1}{#2}% +\noexpand\if@dtl@condition} +\newcommand*{\dtl@testclosedbetween}[3]{% +\DTLifclosedbetween{#1}{#2}{#3}{\@dtl@conditiontrue}{\@dtl@conditionfalse}} +\newcommand*{\DTLisclosedbetween}[3]{% +\TE@throw\noexpand\dtl@testclosedbetween{#1}{#2}{#3}% +\noexpand\if@dtl@condition} +\newcommand*{\dtl@testiclosedbetween}[3]{% +\@sDTLifclosedbetween{#1}{#2}{#3}{\@dtl@conditiontrue}{\@dtl@conditionfalse}} +\newcommand*{\DTLisiclosedbetween}[3]{% +\TE@throw\noexpand\dtl@testiclosedbetween{#1}{#2}{#3}% +\noexpand\if@dtl@condition} +\newcommand*{\dtl@testopenbetween}[3]{% +\DTLifopenbetween{#1}{#2}{#3}{\@dtl@conditiontrue +}{\@dtl@conditionfalse}} +\newcommand*{\DTLisopenbetween}[3]{% +\TE@throw\noexpand\dtl@testopenbetween{#1}{#2}{#3}% +\noexpand\if@dtl@condition} +\newcommand*{\dtl@testiopenbetween}[3]{% +\@sDTLifopenbetween{#1}{#2}{#3}{\@dtl@conditiontrue +}{\@dtl@conditionfalse}} +\newcommand*{\DTLisiopenbetween}[3]{% +\TE@throw\noexpand\dtl@testiopenbetween{#1}{#2}{#3}% +\noexpand\if@dtl@condition} +\newcommand*{\dtl@testFPclosedbetween}[3]{% +\DTLifFPclosedbetween{#1}{#2}{#3}% +{\@dtl@conditiontrue}{\@dtl@conditionfalse}} +\newcommand*{\DTLisFPclosedbetween}[3]{% +\TE@throw\noexpand\dtl@testFPclosedbetween{#1}{#2}{#3}% +\noexpand\if@dtl@condition} +\newcommand*{\dtl@testFPopenbetween}[3]{% +\DTLifFPopenbetween{#1}{#2}{#3}{\@dtl@conditiontrue}{\@dtl@conditionfalse}} +\newcommand*{\DTLisFPopenbetween}[3]{% +\TE@throw\noexpand\dtl@testFPopenbetween{#1}{#2}{#3}% +\noexpand\if@dtl@condition} +\newcommand*{\dtl@testFPislt}[2]{% +\FPiflt{#1}{#2}\@dtl@conditiontrue\else\@dtl@conditionfalse\fi} +\newcommand*{\DTLisFPlt}[2]{% +\TE@throw\noexpand\dtl@testFPislt{#1}{#2}% +\noexpand\if@dtl@condition} +\newcommand*{\dtl@testFPisgt}[2]{% +\FPifgt{#1}{#2}\@dtl@conditiontrue\else\@dtl@conditionfalse\fi} +\newcommand*{\DTLisFPgt}[2]{% +\TE@throw\noexpand\dtl@testFPisgt{#1}{#2}% +\noexpand\if@dtl@condition} +\newcommand*{\dtl@testFPiseq}[2]{% +\FPifeq{#1}{#2}\@dtl@conditiontrue\else\@dtl@conditionfalse\fi} +\newcommand*{\DTLisFPeq}[2]{% +\TE@throw\noexpand\dtl@testFPiseq{#1}{#2}% +\noexpand\if@dtl@condition} +\newcommand*{\dtl@testFPislteq}[2]{% +\FPiflt{#1}{#2}\@dtl@conditiontrue\else\@dtl@conditionfalse\fi +\if@dtl@condition +\else + \dtl@testFPiseq{#1}{#2}% +\fi +} +\newcommand*{\DTLisFPlteq}[2]{% +\TE@throw\noexpand\dtl@testFPislteq{#1}{#2}% +\noexpand\if@dtl@condition} +\newcommand*{\dtl@testFPisgteq}[2]{% +\FPifgt{#1}{#2}\@dtl@conditiontrue\else\@dtl@conditionfalse\fi +\if@dtl@condition +\else + \dtl@testFPiseq{#1}{#2}% +\fi +} +\newcommand*{\DTLisFPgteq}[2]{% +\TE@throw\noexpand\dtl@testFPisgteq{#1}{#2}% +\noexpand\if@dtl@condition} +\newcommand*{\dtl@teststring}[1]{% +\DTLifstring{#1}{\@dtl@conditiontrue}{\@dtl@conditionfalse}} +\newcommand*{\DTLisstring}[1]{% +\TE@throw\noexpand\dtl@teststring{#1}\noexpand\if@dtl@condition} +\newcommand*{\dtl@testnumerical}[1]{% +\DTLifnumerical{#1}{\@dtl@conditiontrue}{\@dtl@conditionfalse}% +} +\newcommand*{\DTLisnumerical}[1]{% +\TE@throw\noexpand\dtl@testnumerical{#1}\noexpand\if@dtl@condition} +\newcommand*{\dtl@testint}[1]{% +\DTLifint{#1}{\@dtl@conditiontrue}{\@dtl@conditionfalse}} +\newcommand*{\DTLisint}[1]{% +\TE@throw\noexpand\dtl@testint{#1}\noexpand\if@dtl@condition} +\newcommand*{\dtl@testreal}[1]{% +\DTLifreal{#1}{\@dtl@conditiontrue}{\@dtl@conditionfalse}} +\newcommand*{\DTLisreal}[1]{% +\TE@throw\noexpand\dtl@testreal{#1}\noexpand\if@dtl@condition} +\newcommand*{\dtl@testcurrency}[1]{% +\DTLifcurrency{#1}{\@dtl@conditiontrue}{\@dtl@conditionfalse}} +\newcommand*{\DTLiscurrency}[1]{% +\TE@throw\noexpand\dtl@testcurrency{#1}\noexpand\if@dtl@condition} +\newcommand*{\dtl@testcurrencyunit}[2]{% +\DTLifcurrencyunit{#1}{#2}{\@dtl@conditiontrue}{\@dtl@conditionfalse}} +\newcommand*{\DTLiscurrencyunit}[2]{% +\TE@throw\noexpand\dtl@testcurrencyunit{#1}{#2}% +\noexpand\if@dtl@condition} +\newcommand*{\DTLnewdb}[1]{% +\DTLifdbexists{#1}{% +\PackageError{datatool}{Database `#1' already exists}{}}{% +\dtl@message{Creating database `#1'}% +\expandafter\gdef\csname dtldb@#1\endcsname{}% +\expandafter\gdef\csname dtlkeys@#1\endcsname{}% +\expandafter\global\expandafter\newcount\csname dtlrows@#1\endcsname}} +\newcommand*{\DTLrowcount}[1]{% +\expandafter\number\csname dtlrows@#1\endcsname} +\newcommand{\DTLifdbempty}[3]{% +\DTLifdbexists{#1}{% +\expandafter\ifx\csname dtldb@#1\endcsname\@empty + #2% +\else + #3% +\fi}{% +\PackageError{Database `#1' doesn't exist}{}{}}} +\newcommand*{\DTLnewrow}[1]{% +\DTLifdbempty{#1}{% + \expandafter\gdef\csname dtldb@#1\endcsname{{}}% + \expandafter\global\expandafter\advance + \csname dtlrows@#1\endcsname by 1\relax + \dtl@message{New row added to database `#1'}% +}{% + \expandafter\let\expandafter\@dtl@olddb\csname dtldb@#1\endcsname% + \expandafter\toks@\expandafter{\@dtl@olddb,{}}% + \expandafter\xdef\csname dtldb@#1\endcsname{\the\toks@}% + \expandafter\global\expandafter\advance + \csname dtlrows@#1\endcsname by 1\relax + \dtl@message{New row added to database `#1'}% +}} +\newcommand{\DTLnewdbentry}[3]{% +\@dtl@toks{#3}% +\edef\@dtl@dbvalue{\the\@dtl@toks}% +\edef\@dtl@dbid{#2}% +\edef\@dtl@dbentry{{\@dtl@dbid}{\the\@dtl@toks}}% +\DTLifdbempty{#1}{\DTLnewrow{#1}}{}% +\expandafter\dtl@choplast\expandafter{% +\csname dtldb@#1\endcsname}{\@dtl@dbrest}{\@dtl@dblastrow}% +\dtl@ifrowcontains{#2}{\@dtl@dblastrow}{% +\PackageError{datatool}{Can't add entry with ID `#2' to current +row of database `#1'}{There is already an entry with this ID on +the current row}}{% +\expandafter\@dtl@toks\expandafter{\@dtl@dbentry}% +\ifthenelse{\equal{}{\@dtl@dblastrow}}{% + \edef\@dtl@dblastrow{\the\@dtl@toks}% +}{% + \expandafter\toks@\expandafter{\@dtl@dblastrow}% + \edef\@dtl@dblastrow{\the\toks@,\the\@dtl@toks}% +}% +\expandafter\@dtl@toks\expandafter{\@dtl@dblastrow}% +\ifthenelse{\equal{}{\@dtl@dbrest}}{% + \expandafter\long\expandafter\xdef\csname dtldb@#1\endcsname{% + {\the\@dtl@toks}}% +}{% + \expandafter\toks@\expandafter{\@dtl@dbrest}% + \expandafter\long\expandafter\xdef\csname dtldb@#1\endcsname{% + \the\toks@,{\the\@dtl@toks}}% +}% +\@dtl@setidtype{#1}{#2}{#3}% +\expandafter\@dtl@setkeys\expandafter{#2}{#1}% +}% +\dtl@message{Added #2\space -> #3\space to database `#1'}% +} +\newcommand{\@dtl@setidtype}[3]{% +\@dtl@checknumerical{#3}% +\def\@dtl@value{#3}% +\@ifundefined{@dtl@idtype@#1@#2}{% +\ifx\@dtl@value\@empty + \expandafter\gdef\csname @dtl@idtype@#1@#2\endcsname{}% +\else + \expandafter\xdef\csname @dtl@idtype@#1@#2\endcsname{% + \the\@dtl@datatype}% +\fi +}{% +\ifx\@dtl@value\@empty +\else + \expandafter\ifx\csname @dtl@idtype@#1@#2\endcsname\@empty + \expandafter\xdef\csname @dtl@idtype@#1@#2\endcsname{% + \the\@dtl@datatype}% + \else + \expandafter\@dtl@tmpcount\expandafter= + \csname @dtl@idtype@#1@#2\endcsname\relax + \ifcase\@dtl@tmpcount + \or + \expandafter\xdef\csname @dtl@idtype@#1@#2\endcsname{% + \the\@dtl@datatype}% + \or + \ifnum\@dtl@datatype=0\relax + \expandafter\gdef\csname @dtl@idtype@#1@#2\endcsname{0}% + \else + \ifnum\@dtl@datatype=3\relax + \expandafter\gdef\csname @dtl@idtype@#1@#2\endcsname{3}% + \else + \expandafter\gdef\csname @dtl@idtype@#1@#2\endcsname{2}% + \fi + \fi + \or + \ifnum\@dtl@datatype=0\relax + \expandafter\gdef\csname @dtl@idtype@#1@#2\endcsname{0}% + \else + \expandafter\gdef\csname @dtl@idtype@#1@#2\endcsname{3}% + \fi + \fi + \fi +\fi +}% +} +\newcommand*{\@dtl@setkeys}[2]{% +\edef\@dtl@tmp{\csname dtlkeys@#2\endcsname}% +\expandafter\@dtl@toks\expandafter{\@dtl@tmp}% +\expandafter\ifx\csname dtlkeys@#2\endcsname\@empty + \expandafter\gdef\csname dtlkeys@#2\endcsname{#1}% +\else + \@for\dtl@key:=\@dtl@tmp\do{% + \ifthenelse{\equal{\dtl@key}{#1}}{\@endfortrue}{}% + }% + \if@endfor + \else + \expandafter\xdef\csname dtlkeys@#2\endcsname{\the\@dtl@toks,#1}% + \fi +\fi +} +\newcommand*{\@dtl@getidtype}[2]{% +\csname @dtl@idtype@#1@#2\endcsname} +\newcommand{\DTLifdbexists}[3]{% +\@ifundefined{dtldb@#1}{#3}{#2}} +\newcommand{\dtl@ifrowcontains}[4]{% +\@for\@dtl@element:=#2\do{% +\dtl@getentryid{\@dtl@element}{\@dtl@entryid}% +\ifthenelse{\equal{#1}{\@dtl@entryid}}{\@endfortrue}{}% +}% +\if@endfor #3\else #4\fi +} +\newcommand*{\dtl@getentryid}[2]{\expandafter\@dtl@getentryid#1#2} +\long\def\@dtl@getentryid#1#2#3{\def#3{#1}} +\newcommand*{\dtl@getentryvalue}[2]{% +\expandafter\@dtl@getentryvalue#1#2} +\long\def\@dtl@getentryvalue#1#2#3{\gdef#3{#2}} +\global\newcount\dtlforeachlevel +\newcounter{DTLrowi} +\newcounter{DTLrowii} +\newcounter{DTLrowiii} +\newcounter{DTLrow} +\def\theHDTLrow{\arabic{DTLrow}} +\def\theHDTLrowi{\theHDTLrow.\arabic{DTLrowi}} +\def\theHDTLrowii{\theHDTLrowi.\arabic{DTLrowii}} +\def\theHDTLrowiii{\theHDTLrowii.\arabic{DTLrowiii}} +\newcommand*{\DTLsavelastrowcount}[1]{% +\ifnum\dtlforeachlevel>2\relax + \def#1{0}% +\else + \ifnum\dtlforeachlevel<0\relax + \def#1{0}% + \else + \@dtl@tmpcount=\dtlforeachlevel + \advance\@dtl@tmpcount by 1\relax + \edef#1{\expandafter\number + \csname c@DTLrow\romannumeral\@dtl@tmpcount\endcsname}% + \fi +\fi} +\newcommand*{\DTLforeach}{\@ifstar\@sDTLforeach\@DTLforeach} +\newcommand{\@DTLforeach}[4][\boolean{true}]{% +\DTLifdbexists{#2}{% +\refstepcounter{DTLrow}% +\global\c@DTLrow=\c@DTLrow +\gdef\@dtl@dbname{#2}% +\global\advance\dtlforeachlevel by 1\relax +\ifnum\dtlforeachlevel>3\relax + \PackageError{datatool}{\string\DTLforeach\space nested too +deeply}{}% +\else + \expandafter\global + \csname c@DTLrow\romannumeral\dtlforeachlevel\endcsname = 0\relax + \expandafter\global\expandafter\let + \csname @dtl@foreachrows@\romannumeral\dtlforeachlevel\endcsname + =\@empty + \expandafter\global\expandafter\let + \csname @dtl@dbname@\romannumeral\dtlforeachlevel\endcsname + =\@dtl@dbname + \expandafter\let\expandafter\@dtl@db\csname dtldb@#2\endcsname% + \@for\@dtl@currentrow:=\@dtl@db\do{% + \expandafter\global\expandafter + \let\csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel + \endcsname=\@dtl@currentrow + \global\let\@dtl@nextrow\@xfor@nextelement + \ifx\relax#3\relax + \else + \@dtl@assign{#3}% + \fi + \ifthenelse{#1}{% + \refstepcounter{DTLrow\romannumeral\dtlforeachlevel}% + \expandafter\edef\expandafter\DTLcurrentindex\expandafter + {\arabic{DTLrow\romannumeral\dtlforeachlevel}}% + #4% + }{}% + \expandafter\let\expandafter\@dtl@thiscurrentrow + \csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel\endcsname + \ifx\@dtl@thiscurrentrow\@empty + \else + \expandafter\@dtl@toks\expandafter{\@dtl@thiscurrentrow}% + \expandafter + \ifx + \csname @dtl@foreachrows@\romannumeral\dtlforeachlevel\endcsname + \@empty + \expandafter + \xdef\csname @dtl@foreachrows@\romannumeral\dtlforeachlevel\endcsname{% + {\the\@dtl@toks}}% + \else + \expandafter\let\expandafter\@dtl@foreachrows\expandafter + =\csname @dtl@foreachrows@\romannumeral\dtlforeachlevel\endcsname + \expandafter\toks@\expandafter{\@dtl@foreachrows}% + \expandafter + \xdef\csname @dtl@foreachrows@\romannumeral\dtlforeachlevel\endcsname{% + \the\toks@,{\the\@dtl@toks}}% + \fi + \fi +\@endforfalse +}% +\expandafter\let\expandafter\@dtl@foreachrows\expandafter + =\csname @dtl@foreachrows@\romannumeral\dtlforeachlevel\endcsname +\expandafter\global + \expandafter\let\csname dtldb@#2\endcsname=\@dtl@foreachrows +\fi +\global\advance\dtlforeachlevel by -1\relax +}{% +\PackageError{datatool}{Database `#2' doesn't exist}{}}% +} +\newcommand{\@sDTLforeach}[4][\boolean{true}]{% +\DTLifdbexists{#2}{% +\refstepcounter{DTLrow}% +\global\c@DTLrow=\c@DTLrow +\gdef\@dtl@dbname{#2}% +\global\advance\dtlforeachlevel by 1\relax +\ifnum\dtlforeachlevel>3\relax + \PackageError{datatool}{\string\DTLforeach\space nested too +deeply}{}% +\else + \expandafter\global + \csname c@DTLrow\romannumeral\dtlforeachlevel\endcsname = 0\relax + \expandafter\global\expandafter\let + \csname @dtl@dbname@\romannumeral\dtlforeachlevel\endcsname + =\@nnil + \expandafter\let\expandafter\@dtl@db\csname dtldb@#2\endcsname% + \@for\@dtl@currentrow:=\@dtl@db\do{% + \expandafter\global\expandafter + \let\csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel + \endcsname=\@dtl@currentrow + \global\let\@dtl@nextrow\@xfor@nextelement + \ifx\relax#3\relax + \else + \@dtl@assign{#3}% + \fi + \ifthenelse{#1}{% + \refstepcounter{DTLrow\romannumeral\dtlforeachlevel}% + \expandafter\edef\expandafter\DTLcurrentindex\expandafter + {\arabic{DTLrow\romannumeral\dtlforeachlevel}}% + #4% + }{}% +\@endforfalse +}% +\fi +\global\advance\dtlforeachlevel by -1\relax +}{% +\PackageError{datatool}{Database `#2' doesn't exist}{}}% +} +\newcommand*{\DTLappendtorow}[2]{% +\ifnum\dtlforeachlevel=0\relax + \PackageError{datatool}{\string\DTLappendtorow\space can only + be used inside \string\DTLforeach}{}% +\else + \expandafter\let\expandafter\@dtl@thisdb + \csname @dtl@dbname@\romannumeral\dtlforeachlevel\endcsname + \ifx\@dtl@thisdb\@nnil + \PackageError{datatool}{\string\DTLappendtorow\space can't + be used inside \string\DTLforeach*}{The starred version of + \string\DTLforeach\space is read only}% + \else + \expandafter\@dtl@toks\expandafter{#2}% + \edef\@dtl@dbvalue{\the\@dtl@toks}% + \edef\@dtl@dbid{#1}% + \edef\@dtl@dbentry{{\@dtl@dbid}{\the\@dtl@toks}}% + \expandafter\let\expandafter\@dtl@thisrow + \csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel\endcsname + \dtl@ifrowcontains{#1}{\@dtl@thisrow}{% + \PackageError{datatool}{Can't add entry with ID `#1' to current + row of database `\@dtl@thisdb'}{There is already an entry with + this ID on the current row}}{% + \expandafter\@dtl@toks\expandafter{\@dtl@dbentry}% + \ifx\@dtl@thisrow\@empty + \expandafter + \xdef\csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel\endcsname{% + \the\@dtl@toks}% + \else + \expandafter\toks@\expandafter{\@dtl@thisrow}% + \expandafter + \xdef\csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel\endcsname{% + \the\toks@,\the\@dtl@toks}% + \fi + } + \@dtl@setidtype{\@dtl@thisdb}{#1}{#2}% + \expandafter\@dtl@setkeys\expandafter{#1}{\@dtl@thisdb}% + \fi +\fi +} +\newcommand*{\DTLremoveentryfromrow}[1]{% +\ifnum\dtlforeachlevel=0\relax + \PackageError{datatool}{\string\DTLremoveentryfromrow\space can only + be used inside \string\DTLforeach}{}% +\else + \expandafter\let\expandafter\@dtl@thisdb + \csname @dtl@dbname@\romannumeral\dtlforeachlevel\endcsname + \ifx\@dtl@thisdb\@nnil + \PackageError{datatool}{\string\DTLremoveentryfromrow\space can't + be used inside \string\DTLforeach*}{The starred version of + \string\DTLforeach\space is read only}% + \else + \expandafter\let\expandafter\@dtl@thisrow + \csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel\endcsname + \dtl@ifrowcontains{#1}{\@dtl@thisrow}{% + \let\@dtl@pre=\@empty + \@for\dtl@thisentry:=\@dtl@thisrow\do{% + \dtl@getentryid\dtl@thisentry\@dtl@id + \ifthenelse{\equal{\@dtl@id}{#1}}{% + }{% + \expandafter\@dtl@toks\expandafter{\dtl@thisentry}% + \ifx\@dtl@pre\@empty + \edef\@dtl@pre{{\the\@dtl@toks}}% + \else + \expandafter\toks@\expandafter{\@dtl@pre}% + \edef\@dtl@pre{\the\toks@,{\the\@dtl@toks}}% + \fi + } + }% + \expandafter\let + \csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel\endcsname + =\@dtl@pre + }{% + \PackageError{datatool}{Can't remove entry given by key `#1' + from current row in database `\@dtl@thisdb', no such entry}{}% + }% + \fi +\fi +} +\newcommand*{\DTLreplaceentryforrow}[2]{% +\ifnum\dtlforeachlevel=0\relax + \PackageError{datatool}{\string\DTLreplaceentryforrow\space can only + be used inside \string\DTLforeach}{}% +\else + \expandafter\let\expandafter\@dtl@thisdb + \csname @dtl@dbname@\romannumeral\dtlforeachlevel\endcsname + \ifx\@dtl@thisdb\@nnil + \PackageError{datatool}{\string\DTLreplaceentryforrow\space can't + be used inside \string\DTLforeach*}{The starred version of + \string\DTLforeach\space is read only}% + \else + \expandafter\@dtl@toks\expandafter{#2}% + \edef\@dtl@dbvalue{\the\@dtl@toks}% + \edef\@dtl@dbid{#1}% + \edef\dtl@newentry{{\@dtl@dbid}{\the\@dtl@toks}}% + \expandafter\let\expandafter\@dtl@thisrow + \csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel\endcsname + \dtl@ifrowcontains{#1}{\@dtl@thisrow}{% + \let\@dtl@pre=\@empty + \@for\dtl@thisentry:=\@dtl@thisrow\do{% + \dtl@getentryid\dtl@thisentry\@dtl@id + \ifthenelse{\equal{\@dtl@id}{#1}}{% + \expandafter\@dtl@toks\expandafter{\dtl@newentry}% + }{% + \expandafter\@dtl@toks\expandafter{\dtl@thisentry}% + } + \ifx\@dtl@pre\@empty + \edef\@dtl@pre{{\the\@dtl@toks}}% + \else + \expandafter\toks@\expandafter{\@dtl@pre}% + \edef\@dtl@pre{\the\toks@,{\the\@dtl@toks}}% + \fi + }% + \expandafter\let + \csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel\endcsname + =\@dtl@pre + }{% + \PackageError{datatool}{Can't remove entry given by key `#1' + from current row in database `\@dtl@thisdb', no such entry}{}% + }% + \fi +\fi +} +\newcommand*{\DTLremovecurrentrow}{% +\ifnum\dtlforeachlevel=0\relax + \PackageError{datatool}{\string\DTLremovecurrentrow\space can only + be used inside \string\DTLforeach}{}% +\else + \expandafter\ifx + \csname @dtl@dbname@\romannumeral\dtlforeachlevel\endcsname\@nnil + \PackageError{datatool}{\string\DTLremovecurrentrow\space can't + be used inside \string\DTLforeach*}{The starred version of + \string\DTLforeach\space is read only}% + \else + \expandafter\let + \csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel\endcsname + =\@empty + \fi +\fi +} +\newcommand*{\DTLforeachkeyinrow}[2]{% +\ifnum\dtlforeachlevel=0\relax + \PackageError{datatool}{\string\DTLforeachkeyinrow\space can only + be used inside \string\DTLforeach}{}% +\else + \expandafter\let\expandafter\@dtl@thisrow + \csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel\endcsname + \@for\dtl@thisentry:=\@dtl@thisrow\do{% + \dtl@getentryvalue\dtl@thisentry{#1}% + #2% + }% +\fi +} +\newcommand{\DTLaddentryforrow}[5]{% +\gdef\@dtl@dbname{#1}% +\DTLifdbexists{#1}{% + \expandafter\@dtl@toks\expandafter{#5}% + \edef\@dtl@dbvalue{\the\@dtl@toks}% + \edef\@dtl@dbid{#4}% + \edef\@dtl@dbentry{{\@dtl@dbid}{\the\@dtl@toks}}% + \expandafter + \let\expandafter\@dtl@db\csname dtldb@\@dtl@dbname\endcsname% + \let\@dtl@prerow=\@empty + \@for\@dtl@currentrow:=\@dtl@db\do{% + \@dtl@assign{#2}% + \ifthenelse{#3}{% + \expandafter\@dtl@toks\expandafter{\@dtl@dbentry}% + \ifx\@dtl@currentrow\@empty + \edef\@dtl@currentrow{{\the\@dtl@toks}}% + \else + \expandafter\toks@\expandafter{\@dtl@currentrow}% + \edef\@dtl@currentrow{\the\toks@,{\the\@dtl@toks}}% + \fi + \@endfortrue + }{% + }% + \expandafter\@dtl@toks\expandafter{\@dtl@currentrow}% + \ifx\@dtl@prerow\@empty + \edef\@dtl@prerow{{\the\@dtl@toks}}% + \else + \expandafter\toks@\expandafter{\@dtl@prerow}% + \edef\@dtl@prerow{\the\toks@,{\the\@dtl@toks}}% + \fi +}% +\if@endfor + \expandafter\@dtl@toks\expandafter{\@forremainder}% + \expandafter\toks@\expandafter{\@dtl@prerow}% + \edef\@dtl@prerow{\the\toks@,{\the\@dtl@toks}}% + \expandafter\global\expandafter + \let\csname dtldb@\@dtl@dbname\endcsname=\@dtl@prerow +\else + \PackageError{datatool}{Unable to add `#5' for key `#4' - condition + not met for any row in database `#1'}{}% +\fi +\@endforfalse +}{% +\PackageError{datatool}{Database `#1' doesn't exist}{}}% +} +\newcommand*{\@dtl@assign}[2][\@dtl@currentrow]{% +\@dtl@assigncmd#2,\relax\@@{#1}% +} +\def\@dtl@assigncmd#1=#2,#3\@@#4{% +\@for\@dtl@entry:=#4\do{% +\dtl@getentryid\@dtl@entry\@dtl@id +\ifthenelse{\equal{\@dtl@id}{#2}}{% +\dtl@getentryvalue\@dtl@entry#1% +\@endfortrue}{}% +}% +\if@endfor +\else + \@dtl@setnull{#1}{#2}% +\fi +\@endforfalse +\ifx\relax#3% + \let\@dtl@next=\@dtl@assigncmdnoop +\else + \let\@dtl@next=\@dtl@assigncmd +\fi +\@dtl@next#3\@@{#4}% +} +\def\@dtl@assigncmdnoop#1\@@#2{} +\newcommand*{\@dtl@setnull}[2]{% +\@ifundefined{@dtl@idtype@\@dtl@dbname @#2}{% +\global\let#1=\DTLstringnull}{% +\edef\@dtl@tmp{0\@dtl@getidtype{\@dtl@dbname}{#2}}% +\expandafter\ifnum\@dtl@tmp=0\relax + \global\let#1=\DTLstringnull +\else + \global\let#1=\DTLnumbernull +\fi +}} +\newcommand*{\DTLstringnull}{NULL} +\newcommand*{\DTLnumbernull}{0} +\newcommand*{\DTLifnull}[3]{% +\ifx\DTLstringnull#1\relax + #2% +\else + \ifx\DTLnumbernull#1\relax + #2% + \else + #3% + \fi +\fi} +\newcommand{\dtl@gathervalues}[3][key]{% +\expandafter\let\expandafter\@dtl@tmp\expandafter + =\csname dtlkeys@#2\endcsname% +\def\@dtl@list{}% +\@for\dtl@key:=\@dtl@tmp\do{% + \expandafter\@dtl@setnull\expandafter{% + \csname @dtl@#1@\dtl@key\endcsname}{\dtl@key}% + \@for\dtl@thiselement:=#3\do{% + \dtl@getentryid\dtl@thiselement\@dtl@id + \ifthenelse{\equal{\@dtl@id}{\dtl@key}}{% + \dtl@getentryvalue\dtl@thiselement\@dtl@value% + \expandafter\toks@\expandafter{\@dtl@value}% + \expandafter\edef\csname @dtl@#1@\dtl@key\endcsname{% + \the\toks@}% + \@endfortrue}{}% + }% +\@endforfalse +}% +} +\newcommand*{\DTLsumforkeys}[4][\boolean{true}\and +\DTLisnumerical{\DTLthisval}]{% +\def#4{0}% +\@for\@dtl@dbname:=#2\do{% + \DTLifdbexists{\@dtl@dbname}{% + \expandafter + \let\expandafter\@dtl@db\csname dtldb@\@dtl@dbname\endcsname% + \@for\@dtl@currentrow:=\@dtl@db\do{% + \dtl@gathervalues{\@dtl@dbname}{\@dtl@currentrow}% + \@for\@dtl@key:=#3\do{% + \protected@edef\DTLthisval{% + \csname @dtl@key@\@dtl@key\endcsname}% + \ifthenelse{#1}{\DTLadd{#4}{#4}{\DTLthisval}}{}% + }}% + }{\PackageError{datatool}{Database `\@dtl@dbname' doesn't exist}{}% + }% +}% +} +\newcommand*{\DTLmeanforkeys}[4][\boolean{true}\and +\DTLisnumerical{\DTLthisval}]{% +\def#4{0}% +\def\dtl@n{0}% +\@for\@dtl@dbname:=#2\do{% +\DTLifdbexists{\@dtl@dbname}{% + \expandafter + \let\expandafter\@dtl@db\csname dtldb@\@dtl@dbname\endcsname% + \@for\@dtl@currentrow:=\@dtl@db\do{% + \dtl@gathervalues{\@dtl@dbname}{\@dtl@currentrow}% + \@for\@dtl@key:=#3\do{% + \protected@edef\DTLthisval{% + \csname @dtl@key@\@dtl@key\endcsname}% + \ifthenelse{#1}{% + \DTLadd{#4}{#4}{\DTLthisval}% + \DTLadd{\dtl@n}{\dtl@n}{1}% + }{}% + }}% +}{\PackageError{datatool}{Database `\@dtl@dbname' doesn't exist}{}}}% +\ifnum\dtl@n=0\relax + \PackageError{datatool}{Can't compute mean, no data!}{}% +\else + \DTLdiv{#4}{#4}{\dtl@n}% +\fi +} +\newcommand*{\DTLvarianceforkeys}[4][\boolean{true}\and +\DTLisnumerical{\DTLthisval}]{% +\DTLmeanforkeys[#1]{#2}{#3}{\dtl@mean}% +\def#4{0}% +\@for\@dtl@dbname:=#2\do{% + \DTLifdbexists{\@dtl@dbname}{% + \expandafter + \let\expandafter\@dtl@db\csname dtldb@\@dtl@dbname\endcsname + \@for\@dtl@currentrow:=\@dtl@db\do{% + \dtl@gathervalues{\@dtl@dbname}{\@dtl@currentrow}% + \@for\@dtl@key:=#3\do{% + \protected@edef\DTLthisval{% + \csname @dtl@key@\@dtl@key\endcsname}% + \ifthenelse{#1}{% + \DTLsub{\dtl@diff}{\DTLthisval}{\dtl@mean}% + \DTLmul{\dtl@diff}{\dtl@diff}{\dtl@diff}% + \DTLadd{#4}{#4}{\dtl@diff}% + }{}% + }}% + }{\PackageError{datatool}{Database `\@dtl@dbname' doesn't exist}{}% + }% +}% +\ifnum\dtl@n=0\relax + \PackageError{datatool}{Can't compute variance, no data!}{}% +\else + \DTLdiv{#4}{#4}{\dtl@n}% +\fi +} +\newcommand*{\DTLsdforkeys}[4][\boolean{true}\and +\DTLisnumerical{\DTLthisval}]{% +\DTLvarianceforkeys[#1]{#2}{#3}{#4}% +\DTLsqrt{#4}{#4}% +} +\newcommand*{\DTLminforkeys}[4][\boolean{true}\and +\DTLisnumerical{\DTLthisval}]{% +\def#4{}% +\@for\@dtl@dbname:=#2\do{% +\DTLifdbexists{\@dtl@dbname}{% + \expandafter + \let\expandafter\@dtl@db\csname dtldb@\@dtl@dbname\endcsname% + \@for\@dtl@currentrow:=\@dtl@db\do{% + \dtl@gathervalues{\@dtl@dbname}{\@dtl@currentrow}% + \@for\@dtl@key:=#3\do{% + \protected@edef\DTLthisval{% + \csname @dtl@key@\@dtl@key\endcsname}% + \ifthenelse{#1}{% + \ifx#4\@empty + \let#4=\DTLthisval + \else + \DTLmin{#4}{#4}{\DTLthisval}% + \fi + }{}% +}}% + }{\PackageError{datatool}{Database `\@dtl@dbname' doesn't exist}{}% + }% +}} +\newcommand*{\DTLmaxforkeys}[4][\boolean{true}\and +\DTLisnumerical{\DTLthisval}]{% +\def#4{}% +\@for\@dtl@dbname:=#2\do{% +\DTLifdbexists{\@dtl@dbname}{% + \expandafter + \let\expandafter\@dtl@db\csname dtldb@\@dtl@dbname\endcsname% + \@for\@dtl@currentrow:=\@dtl@db\do{% + \dtl@gathervalues{\@dtl@dbname}{\@dtl@currentrow}% + \@for\@dtl@key:=#3\do{% + \protected@edef\DTLthisval{% + \csname @dtl@key@\@dtl@key\endcsname}% + \ifthenelse{#1}{% + \ifx#4\@empty + \let#4=\DTLthisval + \else + \DTLmax{#4}{#4}{\DTLthisval}% + \fi + }{}% +}}% + }{\PackageError{datatool}{Database `\@dtl@dbname' doesn't exist}{}% + }% +}} +\newcommand*{\DTLcomputebounds}[8][\boolean{true}]{% +\let#5=\relax +\let#6=\relax +\let#7=\relax +\let#8=\relax +\@for\dtl@thisdb:=#2\do{% + \@sDTLforeach[#1]{\dtl@thisdb}{\DTLthisX=#3,\DTLthisY=#4}{% + \DTLconverttodecimal{\DTLthisX}{\dtl@decx}% + \DTLconverttodecimal{\DTLthisY}{\dtl@decy}% + \ifx#5\relax + \let#5=\dtl@decx + \let#6=\dtl@decy + \let#7=\dtl@decx + \let#8=\dtl@decy + \else + \FPmin{#5}{#5}{\dtl@decx}% + \FPmin{#6}{#6}{\dtl@decy}% + \FPmax{#7}{#7}{\dtl@decx}% + \FPmax{#8}{#8}{\dtl@decy}% + \fi + }% +}% +} +\newcommand*{\DTLgetvalueforkey}[5]{% +{% +\global\let#1=\DTLstringnull +\@sDTLforeach{#3}{\dtl@valueA=#2,\dtl@refvalue=#4}{% +\DTLifnull{\dtl@refvalue}{}{% +\ifthenelse{\equal{\dtl@refvalue}{#5}}{% +\global\let#1=\dtl@valueA +\@endfortrue +}{}}}% +}} +\newcommand*{\DTLgetrowforkey}[4]{% +{% +\global\let#1=\@empty +\@sDTLforeach{#2}{\dtl@refvalue=#3}{% +\DTLifnull{\dtl@refvalue}{}{% +\ifthenelse{\equal{\dtl@refvalue}{#4}}{% +\expandafter\global\expandafter\let\expandafter#1 + \csname @dtl@thiscurrentrow@\romannumeral\dtlforeachlevel\endcsname +\@endfortrue +}{}}}% +}} +\newcommand*{\DTLsort}{\@ifstar\@sDTLsort\@DTLsort} +\newcommand*{\@DTLsort}[3][]{% +\edef\@dtl@replacementkeys{#1}% +\edef\@dtl@sortorder{#2}% +\edef\@dtl@dbname{#3}% +\let\@dtl@comparecs=\dtlcompare +\expandafter\let\expandafter\@dtl@list\csname dtldb@#3\endcsname +\dtl@sortlist{\@dtl@list}{\@dtl@sortcriteria}% +\expandafter\global\expandafter + \let\csname dtldb@#3\endcsname=\@dtl@list} +\newcommand*{\@sDTLsort}[3][]{% +\edef\@dtl@replacementkeys{#1}% +\edef\@dtl@sortorder{#2}% +\edef\@dtl@dbname{#3}% +\let\@dtl@comparecs=\dtlicompare +\expandafter\let\expandafter\@dtl@list\csname dtldb@#3\endcsname +\dtl@sortlist{\@dtl@list}{\@dtl@sortcriteria}% +\expandafter\global\expandafter + \let\csname dtldb@#3\endcsname=\@dtl@list} +\newcommand{\@dtl@sortcriteria}[2]{% +\@for\@dtl@level:=\@dtl@sortorder\do{% + \expandafter\@dtl@getsortdirection\@dtl@level=\relax% + \@ifundefined{@dtl@idtype@\@dtl@dbname @\@dtl@key}{% + \ifx\@dtl@replacementkeys\@empty + \PackageError{datatool}{Unknown key `\@dtl@key' for database + `\@dtl@dbname'}{}% + \else + \dtl@gathervalues[keya]{\@dtl@dbname}{#1}% + \dtl@gathervalues[keyb]{\@dtl@dbname}{#2}% + \@ifundefined{@dtl@keya@\@dtl@key}{% + \@dtl@setnull{\@dtl@tmpa}{\@dtl@key}% + }{% + \expandafter\let\expandafter\@dtl@tmpa\expandafter + =\csname @dtl@keya@\@dtl@key\endcsname}% + \@ifundefined{@dtl@keyb@\@dtl@key}{% + \@dtl@setnull{\@dtl@tmpb}{\@dtl@key}% + }{% + \expandafter\let\expandafter\@dtl@tmpb\expandafter + =\csname @dtl@keyb@\@dtl@key\endcsname}% + \let\@dtl@keya=\@dtl@key + \let\@dtl@keyb=\@dtl@key + \DTLifnull{\@dtl@tmpa}{% + % find first non null key in list of replacement keys + \@for\@dtl@keya:=\@dtl@replacementkeys\do{% + \@ifundefined{@dtl@keya@\@dtl@keya}{}{% + \expandafter\let\expandafter\@dtl@tmpa\expandafter + =\csname @dtl@keya@\@dtl@keya\endcsname + \DTLifnull{\@dtl@tmpa}{}{\@endfortrue}}% + }% + \if@endfor \else\let\@dtl@keya=\@dtl@key \fi + \@endforfalse + }{}% + \DTLifnull{\@dtl@tmpb}{% + % find first non null key in list of replacement keys + \@for\@dtl@keyb:=\@dtl@replacementkeys\do{% + \@ifundefined{@dtl@keyb@\@dtl@keyb}{}{% + \expandafter\let\expandafter\@dtl@tmpb\expandafter + =\csname @dtl@keyb@\@dtl@keyb\endcsname + \DTLifnull{\@dtl@tmpb}{}{\@endfortrue}}% + }% + \if@endfor \else\let\@dtl@keyb=\@dtl@key \fi + \@endforfalse + }{}% + \@ifundefined{@dtl@idtype@\@dtl@dbname @\@dtl@keya}{% + \@ifundefined{@dtl@idtype@\@dtl@dbname @\@dtl@keyb}{% + \dtl@sortresult=0\relax}{\dtl@sortresult=-1\relax}% + }{% + \@ifundefined{@dtl@idtype@\@dtl@dbname @\@dtl@keyb}{% + \dtl@sortresult=1\relax}{% + \dtl@compare@{\@dtl@keya}{\@dtl@keyb}{#1}{#2}% + }% + }% + \fi + }{% + \ifx\@dtl@replacementkeys\@empty + \dtl@compare{\@dtl@key}{#1}{#2}% + \else + \dtl@gathervalues[keya]{\@dtl@dbname}{#1}% + \dtl@gathervalues[keyb]{\@dtl@dbname}{#2}% + \@ifundefined{@dtl@keya@\@dtl@key}{% + \@dtl@setnull{\@dtl@tmpa}{\@dtl@key}% + }{% + \expandafter\let\expandafter\@dtl@tmpa\expandafter + =\csname @dtl@keya@\@dtl@key\endcsname}% + \@ifundefined{@dtl@keyb@\@dtl@key}{% + \@dtl@setnull{\@dtl@tmpb}{\@dtl@key}% + }{% + \expandafter\let\expandafter\@dtl@tmpb\expandafter + =\csname @dtl@keyb@\@dtl@key\endcsname}% + \let\@dtl@keya=\@dtl@key + \let\@dtl@keyb=\@dtl@key + \DTLifnull{\@dtl@tmpa}{% + % find first non null key in list of replacement keys + \@for\@dtl@keya:=\@dtl@replacementkeys\do{% + \@ifundefined{@dtl@keya@\@dtl@keya}{}{% + \expandafter\let\expandafter\@dtl@tmpa\expandafter + =\csname @dtl@keya@\@dtl@keya\endcsname + \DTLifnull{\@dtl@tmpa}{}{\@endfortrue}}% + }% + \if@endfor \else\let\@dtl@keya=\@dtl@key \fi + \@endforfalse + }{}% + \DTLifnull{\@dtl@tmpb}{% + % find first non null key in list of replacement keys + \@for\@dtl@keyb:=\@dtl@replacementkeys\do{% + \@ifundefined{@dtl@keyb@\@dtl@keyb}{}{% + \expandafter\let\expandafter\@dtl@tmpb\expandafter + =\csname @dtl@keyb@\@dtl@keyb\endcsname + \DTLifnull{\@dtl@tmpb}{}{\@endfortrue}}% + }% + \if@endfor \else\let\@dtl@keyb=\@dtl@key \fi + \@endforfalse + }{}% + \dtl@compare@{\@dtl@keya}{\@dtl@keyb}{#1}{#2}% + \fi + \multiply\dtl@sortresult by \@dtl@sortdirection\relax + \ifnum\dtl@sortresult=0\relax + \else + \@endfortrue + \fi + }% +}% +} +\def\@dtl@getsortdirection#1=#2\relax{% +\def\@dtl@key{#1}% +\def\@dtl@sortdirection{#2}% +\ifx\@dtl@sortdirection\@empty + \def\@dtl@sortdirection{-1}% +\else + \@dtl@get@sortdirection#2% + \ifthenelse{\equal{\@dtl@sortdirection}{ascending}}{% + \def\@dtl@sortdirection{-1}}{% + \ifthenelse{\equal{\@dtl@sortdirection}{descending}}{% + \def\@dtl@sortdirection{1}}{% + \PackageError{datatool}{Invalid sort direction + `\@dtl@sortdirection'}{% + The sort direction can only be one of `ascending' or + `descending'}\def\@dtl@sortdirection{-1}}}% +\fi +} +\def\@dtl@get@sortdirection#1={\def\@dtl@sortdirection{#1}} +\newtoks\@dtl@toksA\newtoks\@dtl@toksB +\newcommand{\dtl@compare}[3]{% +\dtl@gathervalues{\@dtl@dbname}{#2}% +\expandafter\let\expandafter\@dtl@tmp\expandafter + =\csname @dtl@key@#1\endcsname +\expandafter\@dtl@toksA\expandafter{\@dtl@tmp}% +\edef\@dtl@a{\the\@dtl@toksA}% +\dtl@gathervalues{\@dtl@dbname}{#3}% +\expandafter\let\expandafter\@dtl@tmp\expandafter + =\csname @dtl@key@#1\endcsname +\expandafter\@dtl@toksB\expandafter{\@dtl@tmp}% +\edef\@dtl@b{\the\@dtl@toksB}% +\expandafter\@dtl@datatype\expandafter= + \csname @dtl@idtype@\@dtl@dbname @#1\endcsname\relax +\ifnum\@dtl@datatype=0\relax + \edef\@dtl@tmpcmp{% + \noexpand\@dtl@comparecs{\noexpand\dtl@sortresult}% + {\the\@dtl@toksA}{\the\@dtl@toksB}}% + \@dtl@tmpcmp +\else + \DTLifnumlt{\@dtl@a}{\@dtl@b}{\dtl@sortresult=-1\relax}{% + \DTLifnumgt{\@dtl@a}{\@dtl@b}{\dtl@sortresult=1\relax}{% + \dtl@sortresult=0\relax}}% +\fi +\ifdtlverbose +\@onelevel@sanitize\@dtl@a +\@onelevel@sanitize\@dtl@b +\fi +\dtl@message{`\@dtl@a' <=> `\@dtl@b' = \number\dtl@sortresult}% +} +\newcommand{\dtl@compare@}[4]{% +\dtl@gathervalues{\@dtl@dbname}{#3}% +\expandafter\let\expandafter\@dtl@tmp\expandafter + =\csname @dtl@key@#1\endcsname +\expandafter\@dtl@toksA\expandafter{\@dtl@tmp}% +\edef\@dtl@a{\the\@dtl@toksA}% +\dtl@gathervalues{\@dtl@dbname}{#4}% +\expandafter\let\expandafter\@dtl@tmp\expandafter + =\csname @dtl@key@#2\endcsname +\expandafter\@dtl@toksB\expandafter{\@dtl@tmp}% +\edef\@dtl@b{\the\@dtl@toksB}% +\expandafter\@dtl@tmpcount\expandafter= + \csname @dtl@idtype@\@dtl@dbname @#1\endcsname\relax +\expandafter\@dtl@datatype\expandafter= + \csname @dtl@idtype@\@dtl@dbname @#2\endcsname\relax +\multiply\@dtl@datatype by \@dtl@tmpcount\relax +\ifnum\@dtl@datatype=0\relax + \edef\@dtl@tmpcmp{% + \noexpand\@dtl@comparecs{\noexpand\dtl@sortresult}% + {\the\@dtl@toksA}{\the\@dtl@toksB}}% + \@dtl@tmpcmp +\else + \DTLifnumlt{\@dtl@a}{\@dtl@b}{\dtl@sortresult=-1\relax}{% + \DTLifnumgt{\@dtl@a}{\@dtl@b}{\dtl@sortresult=1\relax}{% + \dtl@sortresult=0\relax}}% +\fi +\ifdtlverbose +\@onelevel@sanitize\@dtl@a +\@onelevel@sanitize\@dtl@b +\fi +\dtl@message{`\@dtl@a' <=> `\@dtl@b' = \number\dtl@sortresult}% +} +\newcommand*{\dtl@choplast}[3]{% +\let#2\@empty +\let#3\@empty +\@for\@dtl@element:=#1\do{% +\ifx#3\@empty +\else + \ifx#2\@empty + \expandafter\toks@\expandafter{#3}% + \edef#2{{\the\toks@}}% + \else + \expandafter\toks@\expandafter{#3}% + \expandafter\@dtl@toks\expandafter{#2}% + \edef#2{\the\@dtl@toks,{\the\toks@}}% + \fi +\fi +\let#3=\@dtl@element% +}% +} +\newcommand*{\dtl@chopfirst}[3]{% +\let#2=\@empty +\let#3=\@empty +\@for\@dtl@element:=#1\do{% + \let#2=\@dtl@element + \@endfortrue +}% +\if@endfor + \let#3=\@forremainder +\fi +\@endforfalse +} +\newcommand{\dtl@sortlist}[2]{% +\def\@dtl@sortedlist{}% +\@for\@dtl@currentrow:=#1\do{% +\expandafter\dtl@insertinto\expandafter + {\@dtl@currentrow}{\@dtl@sortedlist}{#2}% +\@endforfalse}% +\let#1=\@dtl@sortedlist +} +\newtoks\@dtl@toks +\newcommand{\dtl@insertinto}[3]{% +\def\@dtl@newsortedlist{}% +\@dtl@insertdonefalse +\@for\dtl@srtelement:=#2\do{% +\if@dtl@insertdone + \expandafter\toks@\expandafter{\dtl@srtelement}% + \edef\@dtl@newstuff{{\the\toks@}}% +\else + \expandafter#3\expandafter{\dtl@srtelement}{#1}% + \ifnum\dtl@sortresult<0\relax + \expandafter\toks@\expandafter{\dtl@srtelement}% + \@dtl@toks{#1}% + \edef\@dtl@newstuff{{\the\@dtl@toks},{\the\toks@}}% + \@dtl@insertdonetrue + \else + \expandafter\toks@\expandafter{\dtl@srtelement}% + \edef\@dtl@newstuff{{\the\toks@}}% + \fi +\fi +\ifx\@dtl@newsortedlist\@empty + \expandafter\toks@\expandafter{\@dtl@newstuff}% + \edef\@dtl@newsortedlist{\the\toks@}% +\else + \expandafter\toks@\expandafter{\@dtl@newsortedlist}% + \expandafter\@dtl@toks\expandafter{\@dtl@newstuff}% + \edef\@dtl@newsortedlist{\the\toks@,\the\@dtl@toks}% +\fi +\@endforfalse +}% + \ifx\@dtl@newsortedlist\@empty + \@dtl@toks{#1}% + \edef\@dtl@newsortedlist{{\the\@dtl@toks}}% + \else + \if@dtl@insertdone + \else + \expandafter\toks@\expandafter{\@dtl@newsortedlist}% + \@dtl@toks{#1}% + \edef\@dtl@newsortedlist{\the\toks@,{\the\@dtl@toks}}% + \fi + \fi +\global\let#2=\@dtl@newsortedlist +} +\newif\if@dtl@insertdone +\newcount\dtl@sortresult +\newcommand*{\DTLadd}[3]{% +\DTLconverttodecimal{#2}{\@dtl@numi}% +\DTLconverttodecimal{#3}{\@dtl@numii}% +\FPadd{\@dtl@tmp}{\@dtl@numi}{\@dtl@numii}% +\ifx\@dtl@replaced\@empty + \DTLdecimaltolocale{\@dtl@tmp}{#1}% +\else + \DTLdecimaltocurrency{\@dtl@tmp}{#1}% +\fi +} +\newcommand*{\DTLgadd}[3]{% +\DTLadd{\@dtl@tmpii}{#2}{#3}% +\global\let#1=\@dtl@tmpii +} +\newcommand*{\DTLaddall}[2]{% +\def\@dtl@sum{0}% +\@for\dtl@thisval:=#2\do{% + \DTLconverttodecimal{\dtl@thisval}{\@dtl@num}% + \FPadd{\@dtl@sum}{\@dtl@sum}{\@dtl@num}% +}% +\ifx\@dtl@replaced\@empty + \DTLdecimaltolocale{\@dtl@sum}{#1}% +\else + \DTLdecimaltocurrency{\@dtl@sum}{#1}% +\fi +} +\newcommand*{\DTLgaddall}[2]{% +\DTLaddall{\@dtl@tmpi}{#2}% +\global\let#1=\@dtl@tmpi +} +\newcommand*{\DTLsub}[3]{% +\DTLconverttodecimal{#2}{\@dtl@numi}% +\DTLconverttodecimal{#3}{\@dtl@numii}% +\FPsub{\@dtl@tmp}{\@dtl@numi}{\@dtl@numii}% +\ifx\@dtl@replaced\@empty + \DTLdecimaltolocale{\@dtl@tmp}{#1}% +\else + \DTLdecimaltocurrency{\@dtl@tmp}{#1}% +\fi +} +\newcommand*{\DTLgsub}[3]{% +\DTLsub{\@dtl@tmpii}{#2}{#3}% +\global\let#1=\@dtl@tmpii +} +\newcommand*{\DTLmul}[3]{% +\let\@dtl@thisreplaced=\@empty +\DTLconverttodecimal{#2}{\@dtl@numi}% +\ifx\@dtl@replaced\@empty +\else + \let\@dtl@thisreplaced=\@dtl@replaced +\fi +\DTLconverttodecimal{#3}{\@dtl@numii}% +\ifx\@dtl@replaced\@empty +\else + \let\@dtl@thisreplaced=\@dtl@replaced +\fi +\FPmul{\@dtl@tmp}{\@dtl@numi}{\@dtl@numii}% +\ifx\@dtl@thisreplaced\@empty + \DTLdecimaltolocale{\@dtl@tmp}{#1}% +\else + \DTLdecimaltocurrency{\@dtl@tmp}{#1}% +\fi +} +\newcommand*{\DTLgmul}[3]{% +\DTLmul{\@dtl@tmpii}{#2}{#3}% +\global\let#1=\@dtl@tmpii +} +\newcommand*{\DTLdiv}[3]{% +\let\@dtl@thisreplaced=\@empty +\DTLconverttodecimal{#2}{\@dtl@numi}% +\ifx\@dtl@replaced\@empty +\else + \let\@dtl@thisreplaced=\@dtl@replaced +\fi +\DTLconverttodecimal{#3}{\@dtl@numii}% +\FPdiv{\@dtl@tmp}{\@dtl@numi}{\@dtl@numii}% +\ifx\@dtl@thisreplaced\@empty + \DTLdecimaltolocale{\@dtl@tmp}{#1}% +\else + \ifx\@dtl@thisreplaced\@dtl@replaced + \DTLdecimaltolocale{\@dtl@tmp}{#1}% + \else + \DTLdecimaltocurrency{\@dtl@tmp}{#1}% + \fi +\fi +} +\newcommand*{\DTLgdiv}[3]{% +\DTLdiv{\@dtl@tmpii}{#2}{#3}% +\global\let#1=\@dtl@tmpii +} +\newcommand*{\DTLabs}[2]{% +\DTLconverttodecimal{#2}{\@dtl@numi}% +\FPabs{\@dtl@tmp}{\@dtl@numi}% +\ifx\@dtl@replaced\@empty + \DTLdecimaltolocale{\@dtl@tmp}{#1}% +\else + \DTLdecimaltocurrency{\@dtl@tmp}{#1}% +\fi +} +\newcommand*{\DTLgabs}[2]{% +\DTLabs{\@dtl@tmpii}{#2}% +\global\let#1=\@dtl@tmpii +} +\newcommand*{\DTLneg}[2]{% +\DTLconverttodecimal{#2}{\@dtl@numi}% +\FPneg{\@dtl@tmp}{\@dtl@numi}% +\ifx\@dtl@replaced\@empty + \DTLdecimaltolocale{\@dtl@tmp}{#1}% +\else + \DTLdecimaltocurrency{\@dtl@tmp}{#1}% +\fi +} +\newcommand*{\DTLgneg}[2]{% +\DTLneg{\@dtl@tmpii}{#2}% +\global\let#1=\@dtl@tmpii +} +\newcommand*{\DTLsqrt}[2]{% +\DTLconverttodecimal{#2}{\@dtl@numi}% +\FProot{\@dtl@tmpi}{\@dtl@numi}{2}% +\ifx\@dtl@replaced\@empty + \DTLdecimaltolocale{\@dtl@tmpi}{#1}% +\else + \DTLdecimaltocurrency{\@dtl@tmpi}{#1}% +\fi +} +\newcommand*{\DTLgsqrt}[2]{% +\DTLsqrt{\@dtl@tmpii}{#2}% +\global\let#1=\@dtl@tmpii +} +\newcommand*{\DTLmin}[3]{% +\DTLconverttodecimal{#2}{\@dtl@numi}% +\DTLconverttodecimal{#3}{\@dtl@numii}% +\FPiflt{\@dtl@numi}{\@dtl@numii}% + \dtl@ifsingle{#2}{% + \let#1=#2}{% + \def#1{#2}}% +\else + \dtl@ifsingle{#3}{% + \let#1=#3}{% + \def#1{#3}}% +\fi +} +\newcommand*{\DTLgmin}[3]{% +\DTLmin{\@dtl@tmpii}{#2}{#3}% +\global\let#1=\@dtl@tmpii +} +\newcommand*{\DTLminall}[2]{% +\let\@dtl@min=\@empty +\@for\dtl@thisval:=#2\do{% + \DTLconverttodecimal{\dtl@thisval}{\@dtl@num}% + \ifx\@dtl@min\@empty + \let\@dtl@min=\@dtl@num + \else + \FPmin{\@dtl@min}{\@dtl@min}{\@dtl@num}% + \fi +}% +\ifx\@dtl@replaced\@empty + \DTLdecimaltolocale{\@dtl@min}{#1}% +\else + \DTLdecimaltocurrency{\@dtl@min}{#1}% +\fi +} +\newcommand*{\DTLgminall}[2]{% +\DTLminall{\@dtl@tmpi}{#2}% +\global\let#1=\@dtl@tmpi +} +\newcommand*{\DTLmax}[3]{% +\DTLconverttodecimal{#2}{\@dtl@numi}% +\DTLconverttodecimal{#3}{\@dtl@numii}% +\FPmax{\@dtl@tmp}{\@dtl@numi}{\@dtl@numii}% +\FPifgt{\@dtl@numi}{\@dtl@numii}% + \dtl@ifsingle{#2}{% + \let#1=#2}{% + \def#1{#2}}% +\else + \dtl@ifsingle{#3}{% + \let#1=#3}{% + \def#1{#3}}% +\fi +} +\newcommand*{\DTLgmax}[3]{% +\DTLmax{\@dtl@tmpii}{#2}{#3}% +\global\let#1=\@dtl@tmpii +} +\newcommand*{\DTLmaxall}[2]{% +\let\@dtl@max=\@empty +\@for\dtl@thisval:=#2\do{% + \DTLconverttodecimal{\dtl@thisval}{\@dtl@num}% + \ifx\@dtl@max\@empty + \let\@dtl@max\@dtl@num + \else + \FPmax{\@dtl@max}{\@dtl@max}{\@dtl@num}% + \fi +}% +\ifx\@dtl@replaced\@empty + \DTLdecimaltolocale{\@dtl@max}{#1}% +\else + \DTLdecimaltocurrency{\@dtl@max}{#1}% +\fi +} +\newcommand*{\DTLgmaxall}[2]{% +\DTLmaxall{\@dtl@tmpi}{#2}% +\global\let#1=\@dtl@tmpi +} +\newcommand*{\DTLmeanforall}[2]{% +\def\@dtl@mean{0}% +\def\@dtl@n{0}% +\@for\dtl@thisval:=#2\do{% + \DTLconverttodecimal{\dtl@thisval}{\@dtl@num}% + \FPadd{\@dtl@mean}{\@dtl@mean}{\@dtl@num}% + \FPadd{\@dtl@n}{\@dtl@n}{1}% +}% +\FPdiv{\@dtl@mean}{\@dtl@mean}{\@dtl@n}% +\ifx\@dtl@replaced\@empty + \DTLdecimaltolocale{\@dtl@mean}{#1}% +\else + \DTLdecimaltocurrency{\@dtl@mean}{#1}% +\fi +} +\newcommand*{\DTLgmeanforall}[2]{% +\DTLmeanforall{\@dtl@tmpi}{#2}% +\global\let#1=\@dtl@tmpi +} +\newcommand*{\DTLvarianceforall}[2]{% +\def\@dtl@mean{0}% +\def\@dtl@n{0}% +\let\@dtl@decvals=\@empty +\@for\dtl@thisval:=#2\do{% + \DTLconverttodecimal{\dtl@thisval}{\@dtl@num}% + \ifx\@dtl@decvals\@empty + \let\@dtl@decvals=\@dtl@num + \else + \expandafter\toks@\expandafter{\@dtl@decvals}% + \edef\@dtl@decvals{\the\toks@,\@dtl@num}% + \fi + \FPadd{\@dtl@mean}{\@dtl@mean}{\@dtl@num}% + \FPadd{\@dtl@n}{\@dtl@n}{1}% +}% +\FPdiv{\@dtl@mean}{\@dtl@mean}{\@dtl@n}% +\def\@dtl@var{0}% +\@for\@dtl@num:=\@dtl@decvals\do{% + \FPsub{\@dtl@diff}{\@dtl@num}{\@dtl@mean}% + \FPmul{\@dtl@diff}{\@dtl@diff}{\@dtl@diff}% + \FPadd{\@dtl@var}{\@dtl@var}{\@dtl@diff}% +}% +\FPdiv{\@dtl@var}{\@dtl@var}{\@dtl@n}% +\ifx\@dtl@replaced\@empty + \DTLdecimaltolocale{\@dtl@var}{#1}% +\else + \DTLdecimaltocurrency{\@dtl@var}{#1}% +\fi +} +\newcommand*{\DTLgvarianceforall}[2]{% +\DTLvarianceforall{\@dtl@tmpi}{#2}% +\global\let#1=\@dtl@tmpi +} +\newcommand*{\DTLsdforall}[2]{% +\def\@dtl@mean{0}% +\def\@dtl@n{0}% +\let\@dtl@decvals=\@empty +\@for\dtl@thisval:=#2\do{% + \DTLconverttodecimal{\dtl@thisval}{\@dtl@num}% + \ifx\@dtl@decvals\@empty + \let\@dtl@decvals=\@dtl@num + \else + \expandafter\toks@\expandafter{\@dtl@decvals}% + \edef\@dtl@decvals{\the\toks@,\@dtl@num}% + \fi + \FPadd{\@dtl@mean}{\@dtl@mean}{\@dtl@num}% + \FPadd{\@dtl@n}{\@dtl@n}{1}% +}% +\FPdiv{\@dtl@mean}{\@dtl@mean}{\@dtl@n}% +\def\@dtl@sd{0}% +\@for\@dtl@num:=\@dtl@decvals\do{% + \FPsub{\@dtl@diff}{\@dtl@num}{\@dtl@mean}% + \FPmul{\@dtl@diff}{\@dtl@diff}{\@dtl@diff}% + \FPadd{\@dtl@sd}{\@dtl@sd}{\@dtl@diff}% +}% +\FPdiv{\@dtl@sd}{\@dtl@sd}{\@dtl@n}% +\FProot{\@dtl@sd}{\@dtl@sd}{2}% +\ifx\@dtl@replaced\@empty + \DTLdecimaltolocale{\@dtl@sd}{#1}% +\else + \DTLdecimaltocurrency{\@dtl@sd}{#1}% +\fi +} +\newcommand*{\DTLgsdforall}[2]{% +\DTLsdforall{\@dtl@tmpi}{#2}% +\global\let#1=\@dtl@tmpi +} +\newcommand*{\DTLround}[3]{% +\DTLconverttodecimal{#2}{\@dtl@numi}% +\FPround{\@dtl@tmp}{\@dtl@numi}{#3}% +\ifx\@dtl@replaced\@empty + \DTLdecimaltolocale{\@dtl@tmp}{#1}% +\else + \DTLdecimaltocurrency{\@dtl@tmp}{#1}% +\fi +} +\newcommand*{\DTLground}[3]{% +\DTLround{\@dtl@tmpii}{#2}{#3}% +\global\let#1=\@dtl@tmpii +} +\newcommand*{\DTLtrunc}[3]{% +\DTLconverttodecimal{#2}{\@dtl@numi}% +\FPtrunc{\@dtl@tmp}{\@dtl@numi}{#3}% +\ifx\@dtl@replaced\@empty + \DTLdecimaltolocale{\@dtl@tmp}{#1}% +\else + \DTLdecimaltocurrency{\@dtl@tmp}{#1}% +\fi +} +\newcommand*{\DTLgtrunc}[3]{% +\DTLtrunc{\@dtl@tmpii}{#2}{#3}% +\global\let#1=\@dtl@tmpii +} +\newcommand*{\DTLclip}[2]{% +\DTLconverttodecimal{#2}{\@dtl@numi}% +\FPclip{\@dtl@tmp}{\@dtl@numi}% +\ifx\@dtl@replaced\@empty + \DTLdecimaltolocale{\@dtl@tmp}{#1}% +\else + \DTLdecimaltocurrency{\@dtl@tmp}{#1}% +\fi +} +\newcommand*{\DTLgclip}[3]{% +\DTLclip{\@dtl@tmpii}{#2}% +\global\let#1=\@dtl@tmpii +} +\newcommand*\DTLinitials[1]{% +\def\dtl@initialscmd{}% +\dtl@subnobrsp{#1}{\dtl@string}% +\DTLsubstituteall{\dtl@string}{~}{ }% +\DTLsubstituteall{\dtl@string}{\ }{ }% +\DTLsubstituteall{\dtl@string}{\space}{ }% +\expandafter\dtl@initials\dtl@string{} \@nil% +\dtl@initialscmd}% +\edef\dtl@construct@subnobrsp{% +\noexpand\def\noexpand\@dtl@subnobrsp##1\noexpand\protect +\expandafter\noexpand\csname nobreakspace \endcsname ##2{% +\noexpand\toks@{##1}% +\noexpand\expandafter\noexpand\@dtl@toks\noexpand\expandafter{% +\noexpand\@dtl@string}% +\noexpand\edef\noexpand\@dtl@string{\noexpand\the\noexpand\@dtl@toks +\noexpand\the\noexpand\toks@}% +\noexpand\def\noexpand\@dtl@tmp{##2}% +\noexpand\ifx\noexpand\@dtl@tmp\noexpand\@nnil + \noexpand\let\noexpand\@dtl@subnobrspnext=\noexpand\relax +\noexpand\else + \noexpand\toks@{ }% + \noexpand\expandafter\noexpand\@dtl@toks\noexpand\expandafter{% + \noexpand\@dtl@string}% + \noexpand\edef\noexpand\@dtl@string{\noexpand\the\noexpand\@dtl@toks + \noexpand\the\noexpand\toks@}% + \noexpand\let\noexpand\@dtl@subnobrspnext=\noexpand\@dtl@subnobrsp +\noexpand\fi +\noexpand\@dtl@subnobrspnext +}% +\noexpand\def\noexpand\dtl@subnobrsp##1##2{% +\noexpand\def\noexpand\@dtl@string{}% +\noexpand\@dtl@subnobrsp ##1\noexpand\protect\expandafter\noexpand +\csname nobreakspace \endcsname \noexpand\@nil +\noexpand\let##2=\noexpand\@dtl@string +}} +\dtl@construct@subnobrsp +\newcommand*{\DTLstoreinitials}[2]{% +\def\dtl@initialscmd{}% +\dtl@subnobrsp{#1}{\dtl@string}% +\DTLsubstituteall{\dtl@string}{~}{ }% +\DTLsubstituteall{\dtl@string}{\ }{ }% +\DTLsubstituteall{\dtl@string}{\space}{ }% +\expandafter\dtl@initials\dtl@string{} \@nil +\let#2=\dtl@initialscmd +} +\def\dtl@initials#1#2 #3{% +\dtl@ifsingle{#1}{% +\ifcat\noexpand#1\relax\relax + \def\@dtl@donextinitials{\@dtl@initials#2 {#3}}% +\else + \def\@dtl@donextinitials{\@dtl@initials#1#2 {#3}}% +\fi +}{% + \def\@dtl@donextinitials{\@dtl@initials{#1}#2 {#3}}% +}% +\@dtl@donextinitials +} +\def\@dtl@initials#1#2 #3{% +\dtl@initialshyphen#2-{}\dtl@endhyp +\expandafter\@dtl@toks\expandafter{\dtl@initialscmd}% +\toks@{#1}% +\ifx\dtl@inithyphen\@empty +\else + \edef\dtl@initialscmd{\the\@dtl@toks\the\toks@}% + \expandafter\@dtl@toks\expandafter{\dtl@initialscmd}% + \expandafter\toks@\expandafter{\dtl@inithyphen}% +\fi +\def\dtl@tmp{#3}% +\ifx\@nnil\dtl@tmp + \edef\dtl@initialscmd{\the\@dtl@toks\the\toks@\DTLafterinitials}% + \let\dtl@initialsnext=\@gobble +\else + \edef\dtl@initialscmd{\the\@dtl@toks\the\toks@\DTLbetweeninitials}% + \let\dtl@initialsnext=\dtl@initials +\fi +\dtl@initialsnext{#3}} +\def\dtl@initialshyphen#1-#2#3\dtl@endhyp{% +\def\dtl@inithyphen{#2}% +\ifx\dtl@inithyphen\@empty +\else + \edef\dtl@inithyphen{% + \DTLafterinitialbeforehyphen\DTLinitialhyphen#2}% +\fi +} +\newcommand*{\DTLafterinitials}{.} +\newcommand*{\DTLbetweeninitials}{.} +\newcommand*{\DTLafterinitialbeforehyphen}{.} +\newcommand*{\DTLinitialhyphen}{-} +\newcommand*{\DTLifAllUpperCase}[3]{% +\protected@edef\dtl@tuc{#1}% +\expandafter\dtl@testifuppercase\dtl@tuc\@nil\relax +\if@dtl@condition#2\else#3\fi +} +\def\dtl@testifuppercase#1#2{% +\def\dtl@argi{#1}% +\def\dtl@argii{#2}% +\def\dtl@tc@rest{}% +\ifx\dtl@argi\@nnil + \let\dtl@testifuppernext=\@nnil +\else + \ifx#1\protect + \let\dtl@testifuppernext=\dtl@testifuppercase + \else + \ifx\uppercase#1\relax + \@dtl@conditiontrue + \def\dtl@tc@rest{}% + \let\dtl@testifuppernext=\relax + \else + \edef\dtl@tc@arg{\string#1}% + \expandafter\dtl@test@ifuppercase\dtl@tc@arg\end + \ifx\dtl@argii\@nnil + \let\dtl@testifuppernext=\@dtl@gobbletonil + \fi + \fi + \fi +\fi +\ifx\dtl@testifuppernext\relax + \edef\dtl@dotestifuppernext{% + \noexpand\dtl@testifuppercase}% +\else + \ifx\dtl@testifuppernext\@nnil + \edef\dtl@dotestifuppernext{#2}% + \else + \expandafter\toks@\expandafter{\dtl@tc@rest}% + \@dtl@toks{#2}% + \edef\dtl@dotestifuppernext{% + \noexpand\dtl@testifuppernext\the\toks@\the\@dtl@toks}% + \fi +\fi +\dtl@dotestifuppernext +} +\def\dtl@test@ifuppercase#1#2\end{% +\def\dtl@tc@rest{#2}% +\IfSubStringInString{\string\MakeUppercase}{#1#2}{% + \@dtl@conditiontrue + \def\dtl@tc@rest{}% + \let\dtl@testifuppernext=\relax +}{% + \IfSubStringInString{\string\MakeTextUppercase}{#1#2}{% + \@dtl@conditiontrue + \def\dtl@tc@rest{}% + \let\dtl@testifuppernext=\relax + }{% + \edef\dtl@uccode{\the\uccode`#1}% + \edef\dtl@code{\number`#1}% + \ifnum\dtl@code=\dtl@uccode\relax + \@dtl@conditiontrue + \let\dtl@testifuppernext=\dtl@testifuppercase + \else + \ifnum\dtl@uccode=0\relax + \@dtl@conditiontrue + \let\dtl@testifuppernext=\dtl@testifuppercase + \else + \@dtl@conditionfalse + \let\dtl@testifuppernext=\@dtl@gobbletonil + \fi + \fi +}}} +\newcommand*{\DTLifAllLowerCase}[3]{% +\protected@edef\dtl@tlc{#1}% +\expandafter\dtl@testiflowercase\dtl@tlc\@nil\relax +\if@dtl@condition#2\else#3\fi +} +\def\dtl@testiflowercase#1#2{% +\def\dtl@argi{#1}% +\def\dtl@argii{#2}% +\ifx\dtl@argi\@nnil + \let\dtl@testiflowernext=\@nnil +\else + \ifx#1\protect + \let\dtl@testiflowernext=\dtl@testiflowercase + \else + \ifx\lowercase#1\relax + \@dtl@conditiontrue + \def\dtl@tc@rest{}% + \let\dtl@testiflowernext=\relax + \else + \edef\dtl@tc@arg{\string#1}% + \expandafter\dtl@test@iflowercase\dtl@tc@arg\end + \ifx\dtl@argii\@nnil + \let\dtl@testiflowernext=\@dtl@gobbletonil + \fi + \fi + \fi +\fi +\ifx\dtl@testiflowernext\relax + \edef\dtl@dotestiflowernext{% + \noexpand\dtl@testiflowercase}% +\else + \ifx\dtl@testiflowernext\@nnil + \edef\dtl@dotestiflowernext{#2}% + \else + \expandafter\toks@\expandafter{\dtl@tc@rest}% + \@dtl@toks{#2}% + \edef\dtl@dotestiflowernext{% + \noexpand\dtl@testiflowernext\the\toks@\the\@dtl@toks}% + \fi +\fi +\dtl@dotestiflowernext +} +\def\dtl@test@iflowercase#1#2\end{% +\def\dtl@tc@rest{#2}% +\IfSubStringInString{\string\MakeLowercase}{#1#2}{% + \@dtl@conditiontrue + \def\dtl@tc@rest{}% + \let\dtl@testiflowernext=\relax +}{% + \IfSubStringInString{\string\MakeTextLowercase}{#1#2}{% + \@dtl@conditiontrue + \def\dtl@tc@rest{}% + \let\dtl@testiflowernext=\relax + }{% + \edef\dtl@lccode{\the\lccode`#1}% + \edef\dtl@code{\number`#1}% + \ifnum\dtl@code=\dtl@lccode\relax + \@dtl@conditiontrue + \let\dtl@testiflowernext=\dtl@testiflowercase + \else + \ifnum\dtl@lccode=0\relax + \@dtl@conditiontrue + \let\dtl@testiflowernext=\dtl@testiflowercase + \else + \@dtl@conditionfalse + \let\dtl@testiflowernext=\@dtl@gobbletonil + \fi + \fi +}}} +\newwrite\@dtl@write +\newcommand*{\DTLsavedb}[2]{% +\DTLifdbexists{#1}{% +\openout\@dtl@write=#2% +\edef\@dtl@keys{\csname dtlkeys@#1\endcsname}% +\def\@dtl@header{}% +\@for\@dtl@key:=\@dtl@keys\do{% +\expandafter\@dtl@toks\expandafter{\@dtl@header}% +\ifx\@dtl@header\@empty + \IfSubStringInString{\@dtl@separator}{\@dtl@key}{% + \protected@edef\@dtl@header{% + \@dtl@delimiter\@dtl@key\@dtl@delimiter}% + }{% + \protected@edef\@dtl@header{\@dtl@key}% + }% +\else + \IfSubStringInString{\@dtl@separator}{\@dtl@key}{% + \protected@edef\@dtl@header{\the\@dtl@toks\@dtl@separator + \@dtl@delimiter\@dtl@key\@dtl@delimiter}% + }{% + \protected@edef\@dtl@header{\the\@dtl@toks\@dtl@separator + \@dtl@key}% + }% +\fi +}% +\protected@write\@dtl@write{}{\@dtl@header}% +\expandafter\let\expandafter\@dtl@db\csname dtldb@#1\endcsname% +\@for\@dtl@currentrow:=\@dtl@db\do{% +\dtl@gathervalues{#1}{\@dtl@currentrow}% +\def\@dtl@outputrow{}% +\@for\@dtl@key:=\@dtl@keys\do{% +\protected@edef\@dtl@element{\csname @dtl@key@\@dtl@key\endcsname}% +\expandafter\@dtl@toks\expandafter{\@dtl@outputrow}% +\ifx\@dtl@outputrow\@empty + \IfSubStringInString{\@dtl@separator}{\@dtl@element}{% + \protected@edef\@dtl@outputrow{% + \@dtl@delimiter\@dtl@element\@dtl@delimiter}% + }{% + \protected@edef\@dtl@outputrow{\@dtl@element}% + }% +\else + \IfSubStringInString{\@dtl@separator}{\@dtl@element}{% + \protected@edef\@dtl@outputrow{\the\@dtl@toks\@dtl@separator + \@dtl@delimiter\@dtl@element\@dtl@delimiter}% + }{% + \protected@edef\@dtl@outputrow{\the\@dtl@toks\@dtl@separator + \@dtl@element}% + }% +\fi +}% +\protected@write\@dtl@write{}{\@dtl@outputrow}% +}% +\closeout\@dtl@write +}{% +\PackageError{datatool}{Database `#1' doesn't exist}{}% +}} +\newcommand*{\DTLsavetexdb}[2]{% +\DTLifdbexists{#1}{% +\def\@dtl@dbname{#1}% +\openout\@dtl@write=#2% +\edef\@dtl@keys{\csname dtlkeys@#1\endcsname}% +\protected@write\@dtl@write{}{\string\DTLnewdb{#1}}% +\expandafter\let\expandafter\@dtl@db\csname dtldb@#1\endcsname% +\@for\@dtl@currentrow:=\@dtl@db\do{% +\dtl@gathervalues{#1}{\@dtl@currentrow}% +\protected@write\@dtl@write{}{\string\DTLnewrow{#1}}% +\@for\@dtl@key:=\@dtl@keys\do{% +\expandafter\DTLifnull\csname @dtl@key@\@dtl@key\endcsname +{}{% +\protected@edef\@dtl@element{\csname @dtl@key@\@dtl@key\endcsname}% +\protected@write\@dtl@write{}{\string\DTLnewdbentry + {#1}{\@dtl@key}{\@dtl@element}}% +}% +}% +}% +\closeout\@dtl@write +}{% +\PackageError{datatool}{Database `#1' doesn't exist}{}% +}} +\newread\@dtl@read +\newcount\dtl@entrycr +\gdef\DTLloaddb#1#2{% +\IfFileExists{#2}{% +\begingroup +\catcode`\"12\relax +\openin\@dtl@read=#2% +\dtl@message{Reading `#2'}% +\DTLnewdb{#1}% +\ifeof\@dtl@read +\else + \loop + \@dtl@conditionfalse + \ifeof\@dtl@read + \else + \read\@dtl@read to \@dtl@line + \dtl@trim\@dtl@line + \if\@dtl@line\par + \@dtl@conditiontrue + \fi + \fi + \if@dtl@condition + \repeat + \ifeof\@dtl@read + \else + \protected@edef\@dtl@lin@{\@dtl@separator\@dtl@line\@dtl@separator}% + \@dtl@tmpcount=0\relax + \whiledo{\not\equal{\@dtl@lin@}{\@dtl@separator}}{% + \expandafter\@dtl@lopoff\@dtl@lin@\to\@dtl@lin@\@dtl@key + \advance\@dtl@tmpcount by 1\relax + \expandafter\@dtl@toks\expandafter{\@dtl@key}% + \expandafter + \edef\csname @dtl@inky@\romannumeral\@dtl@tmpcount\endcsname{% + \the\@dtl@toks}% + }% + \ifeof\@dtl@read + \else + \@dtl@conditiontrue + \loop + \read\@dtl@read to \@dtl@line + \dtl@trim\@dtl@line + \ifthenelse{\equal{\@dtl@line}{}}{}% + {% + \DTLnewrow{#1}% + \expandafter\@dtl@toks\expandafter{\@dtl@line}% + \edef\@dtl@lin@{\@dtl@separator\the\@dtl@toks + \@dtl@separator}% + \dtl@entrycr=0\relax + \whiledo{\not\equal{\@dtl@lin@}{\@dtl@separator}}{% + \expandafter\@dtl@lopoff\@dtl@lin@\to + \@dtl@lin@\@dtl@thisentry + \advance\dtl@entrycr by 1\relax + \edef\@dtl@thiskey{% + \csname @dtl@inky@\romannumeral\dtl@entrycr\endcsname}% + \expandafter\@dtl@toks\expandafter{\@dtl@thisentry}% + \edef\@do@dtlnewentry{\noexpand\DTLnewdbentry + {#1}{\@dtl@thiskey}{\the\@dtl@toks}}% + \@do@dtlnewentry + }% + }% + \ifeof\@dtl@read \@dtl@conditionfalse\fi + \if@dtl@condition + \repeat + \fi + \fi +\fi +\closein\@dtl@read +\endgroup +}{% +\PackageError{datatool}{Can't load database `#1' (file `#2' +doesn't exist)}{}% +}} +\newcommand{\dtl@trim}[1]{% +\def\@dtl@trmstr{}% +\expandafter\@dtl@starttrim#1\@nil% +\let#1=\@dtl@trmstr +} +\long\def\@dtl@starttrim#1#2{% +\ifx\par#1% + \def\@dtl@dotrim{\@dtl@trim{} #2}% +\else + \def\@dtl@dotrim{\@dtl@trim#1#2}% +\fi +\@dtl@dotrim% +} +\long\def\@dtl@trim#1 \@nil{\long\def\@dtl@trmstr{#1}} +\gdef\DTLloadrawdb#1#2{% +\IfFileExists{#2}{% +\openin\@dtl@read=#2% +\dtl@message{Reading `#2'}% +\DTLnewdb{#1}% +\ifeof\@dtl@read +\else + \loop + \@dtl@conditionfalse + \ifeof\@dtl@read + \else + \@dtl@rawread\@dtl@read to\@dtl@line + \dtl@trim\@dtl@line + \if\@dtl@line\par + \@dtl@conditiontrue + \fi + \fi + \if@dtl@condition + \repeat + \ifeof\@dtl@read + \else + \dtl@domappings\@dtl@line + \protected@edef\@dtl@lin@{\@dtl@separator\@dtl@line\@dtl@separator}% + \@dtl@tmpcount=0\relax + \whiledo{\not\equal{\@dtl@lin@}{\@dtl@separator}}{% + \expandafter\@dtl@lopoff\@dtl@lin@\to\@dtl@lin@\@dtl@key + \advance\@dtl@tmpcount by 1\relax + \expandafter\@dtl@toks\expandafter{\@dtl@key}% + \expandafter + \edef\csname @dtl@inky@\romannumeral\@dtl@tmpcount\endcsname{% + \the\@dtl@toks}% + }% + \ifeof\@dtl@read + \else + \@dtl@conditiontrue + \loop + \@dtl@rawread\@dtl@read to\@dtl@line + \dtl@trim\@dtl@line + \ifthenelse{\equal{\@dtl@line}{}}{}% + {% + \DTLnewrow{#1}% + \dtl@domappings\@dtl@line + \expandafter\@dtl@toks\expandafter{\@dtl@line}% + \edef\@dtl@lin@{\@dtl@separator\the\@dtl@toks + \@dtl@separator}% + \dtl@entrycr=0\relax + \whiledo{\not\equal{\@dtl@lin@}{\@dtl@separator}}{% + \expandafter\@dtl@lopoff\@dtl@lin@\to + \@dtl@lin@\@dtl@thisentry + \advance\dtl@entrycr by 1\relax + \edef\@dtl@thiskey{% + \csname @dtl@inky@\romannumeral\dtl@entrycr\endcsname}% + \expandafter\@dtl@toks\expandafter{\@dtl@thisentry}% + \edef\@do@dtlnewentry{\noexpand\DTLnewdbentry + {#1}{\@dtl@thiskey}{\the\@dtl@toks}}% + \@do@dtlnewentry + }% + }% + \ifeof\@dtl@read \@dtl@conditionfalse\fi + \if@dtl@condition + \repeat + \fi + \fi +\fi +\closein\@dtl@read +}{% +\PackageError{datatool}{Can't load database `#1' (file `#2' +doesn't exist)}{}% +}} +\begingroup +\catcode`\%=\active +\catcode`$=\active +\catcode`&=\active +\catcode`~=\active +\catcode`_=\active +\catcode`^=\active +\catcode`#=\active +\catcode`?=6\relax +\catcode`<=1\relax +\catcode`>=2\relax +\catcode`\{=\active +\catcode`\}=\active +\gdef\@dtl@rawread?1to?2<\relax +<<\catcode`\%=\active +\catcode`$=\active +\catcode`&=\active +\catcode`~=\active +\catcode`_=\active +\catcode`^=\active +\catcode`#=\active +\catcode`\{=\active +\catcode`\}=\active +\def%<\noexpand\%>\relax +\def$<\noexpand\$>\relax +\def&<\&>\relax +\def#<\#>\relax +\def~<\noexpand\textasciitilde>\relax +\def_<\noexpand\_>\relax +\def^<\noexpand\textasciicircum>\relax +\@dtl@activatebraces +\@dtl@doreadraw?1?2>>> +\gdef\@dtl@doreadraw?1?2<\relax +\read?1 to \tmp +\xdef?2<\tmp>\relax +> +\endgroup +\begingroup +\catcode`\{=\active +\catcode`\}=\active +\catcode`<=1\relax +\catcode`>=2\relax +\gdef\@dtl@activatebraces<% + \catcode`\{=\active + \catcode`\}=\active + \def{<\noexpand\{>% + \def}<\noexpand\}>% +>% +\endgroup +\newcommand*{\DTLrawmap}[2]{% +\expandafter\@dtl@toks\expandafter{\@dtl@rawmappings}% +\ifx\@dtl@rawmappings\@empty + \def\@dtl@rawmappings{{#1}{#2}}% +\else + \def\@dtl@tmp{{#1}{#2}} + \protected@edef\@dtl@rawmappings{\the\@dtl@toks,\@dtl@tmp} +\fi +} +\newcommand*{\@dtl@rawmappings}{} +\newcommand*{\dtl@domappings}[1]{% +\@for\@dtl@map:=\@dtl@rawmappings\do{% + \expandafter\DTLsubstitute\expandafter#1\@dtl@map +}} +\newcommand{\DTLsubstitute}[3]{% +\expandafter\DTLsplitstring\expandafter + {#1}{#2}{\@dtl@beforepart}{\@dtl@afterpart}% +\ifx\@dtl@replaced\@empty +\else + \def#1{}% + \expandafter\@dtl@toks\expandafter{\@dtl@beforepart}% + \expandafter\toks@\expandafter{#1}% + \protected@edef#1{\the\toks@\the\@dtl@toks#3}% + \expandafter\@dtl@toks\expandafter{\@dtl@afterpart}% + \expandafter\toks@\expandafter{#1}% + \edef#1{\the\toks@\the\@dtl@toks}% +\fi +} +\newcommand*{\DTLsplitstring}[4]{% +\def\dtl@splitstr##1#2##2\@nil{% +\def#3{##1}% +\def#4{##2}% +\ifx#4\@empty + \let\@dtl@replaced=\@empty +\else + \def\@dtl@replaced{#2}% + \dtl@split@str##2\@nil +\fi +}% +\def\dtl@split@str##1#2\@nil{% +\def#4{##1}}% +\dtl@splitstr#1#2\@nil +} +\newcommand{\DTLsubstituteall}[3]{% +\def\@dtl@splitsubstr{}% +\let\@dtl@afterpart=#1\relax +\@dtl@dosubstitute{#2}{#3}% +\expandafter\toks@\expandafter{\@dtl@splitsubstr}% +\expandafter\@dtl@toks\expandafter{\@dtl@afterpart}% +\edef#1{\the\toks@\the\@dtl@toks}% +} +\def\@dtl@dosubstitute#1#2{% +\expandafter\DTLsplitstring\expandafter + {\@dtl@afterpart}{#1}{\@dtl@beforepart}{\@dtl@afterpart}% +\expandafter\toks@\expandafter{\@dtl@splitsubstr}% +\expandafter\@dtl@toks\expandafter{\@dtl@beforepart}% +\edef\@dtl@splitsubstr{\the\toks@\the\@dtl@toks}% +\ifx\@dtl@replaced\@empty + \let\@dtl@dosubstnext=\@dtl@dosubstitutenoop +\else + \expandafter\toks@\expandafter{\@dtl@splitsubstr}% + \@dtl@toks{#2}% + \edef\@dtl@splitsubstr{\the\toks@\the\@dtl@toks}% + \let\@dtl@dosubstnext=\@dtl@dosubstitute +\fi +\@dtl@dosubstnext{#1}{#2}% +} +\def\@dtl@dosubstitutenoop#1#2{} +\newcommand*{\@dtl@currencies}{\$,\pounds} +\newcommand*{\DTLnewcurrencysymbol}[1]{% +\expandafter\toks@\expandafter{\@dtl@currencies}% +\@dtl@toks{#1}% +\edef\@dtl@currencies{\the\@dtl@toks,\the\toks@}% +} +\AtBeginDocument{% +\@ifundefined{texteuro}{}{\DTLnewcurrencysymbol{\texteuro}}% +\@ifundefined{textdollar}{}{\DTLnewcurrencysymbol{\textdollar}}% +\@ifundefined{textstirling}{}{\DTLnewcurrencysymbol{\textstirling}}% +\@ifundefined{textyen}{}{\DTLnewcurrencysymbol{\textyen}}% +\@ifundefined{textwon}{}{\DTLnewcurrencysymbol{\textwon}}% +\@ifundefined{textcurrency}{}{\DTLnewcurrencysymbol{\textcurrency}}% +\@ifundefined{euro}{}{\DTLnewcurrencysymbol{\euro}}% +\@ifundefined{yen}{}{\DTLnewcurrencysymbol{\yen}}% +} +\newcommand{\@dtl@standardize@currency}[1]{% +\def\@dtl@org@currency{}% +\@for\@dtl@thiscurrency:=\@dtl@currencies\do{% + \expandafter\toks@\expandafter{\@dtl@thiscurrency}% + \edef\@dtl@dosubs{\noexpand\DTLsubstitute{\noexpand#1}% + {\the\toks@}{\noexpand\$}}% + \@dtl@dosubs + \ifx\@dtl@replaced\@empty + \else + \let\@dtl@org@currency=\@dtl@replaced + \@endfortrue + \fi +}% +\@endforfalse} +\newcommand*{\@dtl@currency}{\$} +\newcommand*{\DTLsetdefaultcurrency}[1]{% +\renewcommand*{\@dtl@currency}{#1}} +\newcommand{\dtl@ifsingle}[3]{% +\def\@dtl@arg{#1}% +\ifx\@dtl@arg\@empty + #3% +\else + \@dtl@ifsingle#1\@nil{#2}{#3}% +\fi +} +\def\@dtl@ifsingle#1#2\@nil#3#4{% +\def\dtl@sg@arg{#2}% +\ifx\dtl@sg@arg\@empty + #3% +\else + #4% +\fi +} +\newcommand*{\dtlshowdb}[1]{% +\expandafter\show\csname dtldb@#1\endcsname} +\newcommand*{\dtlshowdbkeys}[1]{% +\expandafter\show\csname dtlkeys@#1\endcsname} +\newcommand*{\dtlshowtype}[2]{% +\expandafter\show\csname @dtl@idtype@#1@#2\endcsname} +\endinput +%% +%% End of file `datatool.sty'. |