summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/datatool/datatool.sty
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/datatool/datatool.sty')
-rw-r--r--Master/texmf-dist/tex/latex/datatool/datatool.sty3318
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'.