%% %% 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'.