From 5b1c9fe4a8686f1d474467ad220e0714515d2a73 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Mon, 3 Feb 2014 23:45:48 +0000 Subject: datatool (3feb14) git-svn-id: svn://tug.org/texlive/trunk@32860 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/tex/latex/datatool/datatool.sty | 101 +++++++++++++++++----- 1 file changed, 80 insertions(+), 21 deletions(-) (limited to 'Master/texmf-dist/tex/latex/datatool') diff --git a/Master/texmf-dist/tex/latex/datatool/datatool.sty b/Master/texmf-dist/tex/latex/datatool/datatool.sty index 7d85323adc7..af902a2cf02 100644 --- a/Master/texmf-dist/tex/latex/datatool/datatool.sty +++ b/Master/texmf-dist/tex/latex/datatool/datatool.sty @@ -39,7 +39,7 @@ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~} \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{datatool}[2014/01/17 v2.19 (NLCT)] +\ProvidesPackage{datatool}[2014/02/03 v2.20 (NLCT)] \RequirePackage{xkeyval} \RequirePackage{ifthen} \RequirePackage{xfor} @@ -614,24 +614,62 @@ \newcommand{\DTLifdbexists}[3]{% \@ifundefined{dtldb@#1}{#3}{#2}} \newcommand*{\DTLassign}[3]{% + \DTLifdbexists{#1} {% - \dtlgetrow{#1}{#2}% + {% + \dtlgetrow{#1}{#2}% \@dtl@assign{#3}{#1}% + }% + }% + {% + \PackageError{datatool}{Database `#1' doesn't exist}{}% + }% +} +\newcommand*{\DTLassignfirstmatch}[4]{% + \dtl@assignfirstmatch{#3}{#1}{#2}{#4}% +} +\newcommand*{\xDTLassignfirstmatch}[4]{% + \protected@edef\@dtl@asg@value{\expandonce{#3}}% + \expandafter\dtl@assignfirstmatch\expandafter + {\@dtl@asg@value}{#1}{#2}{#4}% +} +\newcommand*{\dtl@assignfirstmatch}[4]{% + \DTLifdbexists{#2}% + {% + {% + \dtlgetrowindex{\dtl@asg@rowidx}{#2}{\dtlcolumnindex{#2}{#3}}{#1}% + \ifx\dtl@asg@rowidx\dtlnovalue + \PackageError{datatool}{No match found for + \string\DTLassignfirstmatch{#2}{#3}{#1}{#4}}{}% + \else + \dtlgetrow{#2}{\dtl@asg@rowidx}% + \@dtl@assign{#4}{#2}% + \fi + }% + }% + {% + \PackageError{datatool}{Data base `#2' doesn't exist}{}% }% } \newcommand*{\@dtl@assign}[2]{% - \@dtl@assigncmd#1,\@nil\@@{#2}% + \ifstrempty{#1}{}% + {% + \@dtl@assigncmd#1,\@nil\@@{#2}% + }% } \def\@dtl@assigncmd#1#2=#3,#4\@@#5{% + \edef\@dtl@dbname{#5}% \@sDTLifhaskey{#5}{#3}% {% \edef\@dtl@dogetentry{% \noexpand\dtlgetentryfromcurrentrow {\noexpand#1}{\dtlcolumnindex{#5}{#3}}}% \@dtl@dogetentry - \ifx#1\dtlnovalue + \ifdefequal{#1}{\dtlnovalue}% + {% \@@dtl@setnull{#1}{#3}% - \fi + }% + {}% \global\let#1=#1\relax }% {% @@ -684,6 +722,9 @@ \fi \fi } +\newcommand*{\DTLifnullorempty}[3]{% + \ifdefempty{#1}{#2}{\DTLifnull{#1}{#2}{#3}}% +} \def\@dtlnovalue{Undefined Value} \def\dtlnovalue{\@dtlnovalue} \newcommand*{\DTLgetkeydata}{% @@ -1237,7 +1278,7 @@ {% \refstepcounter{DTLrow}% \global\c@DTLrow=\c@DTLrow\relax - \gdef\@dtl@dbname{#2}% + \xdef\@dtl@dbname{#2}% \global\advance\dtlforeachlevel by 1\relax \ifnum\dtlforeachlevel>3\relax \PackageError{datatool}{\string\DTLforeach\space nested too @@ -1391,6 +1432,7 @@ {% \refstepcounter{DTLrow}% \global\c@DTLrow=\c@DTLrow + \xdef\@dtl@dbname{#2}% \global\advance\dtlforeachlevel by 1\relax \ifnum\dtlforeachlevel>3\relax \PackageError{datatool}{\string\DTLforeach\space nested too @@ -2108,12 +2150,12 @@ } \newcommand*{\@dtlsumforkeys}[4][]{% \def#4{0}% - \@for\@dtl@dbname:=#2\do{% - \@sDTLforeach{\@dtl@dbname}% + \@for\@dtl@db@name:=#2\do{% + \@sDTLforeach{\@dtl@db@name}% {#1}% assignment list {% \@for\@dtl@key:=#3\do{% - \@sdtl@getcolumnindex{\@dtl@col}{\@dtl@dbname}{\@dtl@key}% + \@sdtl@getcolumnindex{\@dtl@col}{\@dtl@db@name}{\@dtl@key}% \dtlcurrentrow=\expandafter{\dtl@thisrow}% \dtlgetentryfromrow{\DTLthisval}{\@dtl@col}{\dtlcurrentrow}% \expandafter\ifthenelse\expandafter{\@dtl@cond}% @@ -2152,12 +2194,12 @@ \newcommand*{\@dtlmeanforkeys}[4][]{% \def#4{0}% \@dtl@elements=0\relax - \@for\@dtl@dbname:=#2\do{% - \@sDTLforeach{\@dtl@dbname}% + \@for\@dtl@db@name:=#2\do{% + \@sDTLforeach{\@dtl@db@name}% {#1}% assignment list {% \@for\@dtl@key:=#3\do{% - \@sdtl@getcolumnindex{\@dtl@col}{\@dtl@dbname}{\@dtl@key}% + \@sdtl@getcolumnindex{\@dtl@col}{\@dtl@db@name}{\@dtl@key}% \dtlcurrentrow=\expandafter{\dtl@thisrow}% \dtlgetentryfromrow{\DTLthisval}{\@dtl@col}{\dtlcurrentrow}% \expandafter\ifthenelse\expandafter{\@dtl@cond}% @@ -2214,12 +2256,12 @@ \@dtlmeanforkeys[#1]{#2}{#3}{\dtl@mean}% \def#4{0}% \@dtl@elements=0\relax - \@for\@dtl@dbname:=#2\do{% - \@sDTLforeach{\@dtl@dbname}% + \@for\@dtl@db@name:=#2\do{% + \@sDTLforeach{\@dtl@db@name}% {#1}% assignment list {% \@for\@dtl@key:=#3\do{% - \@sdtl@getcolumnindex{\@dtl@col}{\@dtl@dbname}{\@dtl@key}% + \@sdtl@getcolumnindex{\@dtl@col}{\@dtl@db@name}{\@dtl@key}% \dtlcurrentrow=\expandafter{\dtl@thisrow}% \dtlgetentryfromrow{\DTLthisval}{\@dtl@col}{\dtlcurrentrow}% \expandafter\ifthenelse\expandafter{\@dtl@cond}% @@ -2292,12 +2334,12 @@ } \newcommand*{\@dtlminforkeys}[4][]{% \def#4{}% - \@for\@dtl@dbname:=#2\do{% - \@sDTLforeach{\@dtl@dbname}% + \@for\@dtl@db@name:=#2\do{% + \@sDTLforeach{\@dtl@db@name}% {#1}% assignment list {% \@for\@dtl@key:=#3\do{% - \@sdtl@getcolumnindex{\@dtl@col}{\@dtl@dbname}{\@dtl@key}% + \@sdtl@getcolumnindex{\@dtl@col}{\@dtl@db@name}{\@dtl@key}% \dtlcurrentrow=\expandafter{\dtl@thisrow}% \dtlgetentryfromrow{\DTLthisval}{\@dtl@col}{\dtlcurrentrow}% \expandafter\ifthenelse\expandafter{\@dtl@cond}% @@ -2348,12 +2390,12 @@ } \newcommand*{\@dtlmaxforkeys}[4][]{% \def#4{}% - \@for\@dtl@dbname:=#2\do{% - \@sDTLforeach{\@dtl@dbname}% + \@for\@dtl@db@name:=#2\do{% + \@sDTLforeach{\@dtl@db@name}% {#1}% assignment list {% \@for\@dtl@key:=#3\do{% - \@sdtl@getcolumnindex{\@dtl@col}{\@dtl@dbname}{\@dtl@key}% + \@sdtl@getcolumnindex{\@dtl@col}{\@dtl@db@name}{\@dtl@key}% \dtlcurrentrow=\expandafter{\dtl@thisrow}% \dtlgetentryfromrow{\DTLthisval}{\@dtl@col}{\dtlcurrentrow}% \expandafter\ifthenelse\expandafter{\@dtl@cond}% @@ -2972,6 +3014,23 @@ database}{}% }% } +\newcommand*{\DTLloaddbtex}[2]{% + \IfFileExists{#2}% + {% + \input{#2}% + \ifdef#1% + {% + \PackageError{datatool}{Command \string#1\space is already defined}% + {}% + }% + {% + \let#1\dtllastloadeddb + }% + }% + {% + \PackageError{datatool}{File `#2' doesn't exist.}{}% + }% +} \newread\@dtl@read \newcount\dtl@entrycr \define@boolkey{loaddb}[dtl]{noheader}[true]{} -- cgit v1.2.3