From 31e38ed81d818c82a28f783476266f8945dac537 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Thu, 9 Oct 2014 21:36:07 +0000 Subject: dataref (9oct14) git-svn-id: svn://tug.org/texlive/trunk@35341 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/tex/latex/dataref/dataref.sty | 280 ++++++++++++++---------- 1 file changed, 168 insertions(+), 112 deletions(-) (limited to 'Master/texmf-dist/tex/latex/dataref') diff --git a/Master/texmf-dist/tex/latex/dataref/dataref.sty b/Master/texmf-dist/tex/latex/dataref/dataref.sty index 1b9e1d2c32d..a08d450e1be 100644 --- a/Master/texmf-dist/tex/latex/dataref/dataref.sty +++ b/Master/texmf-dist/tex/latex/dataref/dataref.sty @@ -25,7 +25,7 @@ \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{dataref} - [2014/08/20 v0.2 dataref] + [2014/10/09 v0.3 dataref] \ifx\drefloaded\undefined \let\drefloaded=\relax @@ -70,8 +70,8 @@ \def\drefset#1#2{\dref@set{#1}{#2}} \def\dref@expandable#1{% - \pgfkeysifdefined{\dref@datapath#1}{% - \pgfkeysvalueof{\dref@datapath#1}% + \pgfkeysifdefined{\dref@datapath\csuse{dref@prefix}#1}{% + \pgfkeysvalueof{\dref@datapath\csuse{dref@prefix}#1}% }{% \ifdref@ignoremissing% \dref@defaultvalue% @@ -81,11 +81,12 @@ }% } \def\dref@unexpandable#1{% - \def\drefcurrentkey{\dref@datapath#1}% + \def\drefcurrentkey{\dref@datapath\csuse{dref@prefix}#1}% \pgfkeysifdefined{\drefcurrentkey}{% - \immediate\write\@auxout{\noexpand\dref@found{\drefcurrentkey}{\thepage}}% + \edef\dref@thepage{\arabic{page}}% + \immediate\write\@auxout{\noexpand\dref@found{\drefcurrentkey}{\dref@thepage}}% }{% - \immediate\write\@auxout{\noexpand\dref@notfound{\drefcurrentkey}{\thepage}}% + \immediate\write\@auxout{\noexpand\dref@notfound{\drefcurrentkey}{\dref@thepage}}% \ifdref@ignoremissing% \typeout{Dref warning: undefined key `\drefcurrentkey'}% \dref@mkannotate{UNDEFINED: \drefcurrentkey}% @@ -93,26 +94,26 @@ \dref@error{Dref error: undefined key `\drefcurrentkey'}% \fi% }% - \immediate\write\@auxout{\noexpand\dref@referenced{\drefcurrentkey}{\thepage}}% + \immediate\write\@auxout{\noexpand\dref@referenced{\drefcurrentkey}{\dref@thepage}}% } \newcommand{\drefifdefined}[3]{ - \def\drefcurrentkey{\dref@datapath#1}% + \def\drefcurrentkey{\dref@datapath\csuse{dref@prefix}#1}% \pgfkeysifdefined{\drefcurrentkey}{#2}{#3}% } \def\dref{\@ifstar\@@dref\@dref} \newcommand{\@dref}[2][]{% Unstarred - \edef\dref@argument{#2} + \edef\dref@argument{#2}% \expandafter\dref@unexpandable\expandafter{\dref@argument}% \pgfmathparse{\dref@expandable{#2}}% \dref@format[#1]{\pgfmathresult}% - \dref@mkannotate{#2}% + \dref@mkannotate{\textbackslash dref\{#2\}}% } -\newcommand{\@@dref}[2][]{ % Starred - \edef\dref@argument{#2} +\newcommand{\@@dref}[2][]{% Starred + \edef\dref@argument{#2}% \expandafter\dref@unexpandable\expandafter{\dref@argument}% \expandafter\gdef\expandafter\dref@dref@output\expandafter{\expandafter\dref@expandable\expandafter{\dref@argument}}% \dref@dref@output% - \dref@mkannotate{#2}% + \dref@mkannotate{\textbackslash dref*\{#2\}}% } \def\drefvalueof#1{% \dref@expandable{#1}% @@ -170,71 +171,64 @@ \dref@let{#1}% } -\def\dref@calc@parser@d#1#2\@nnil{% - \ifx\else% - \if#1d% - \dref@calc@parser@a #2\@nnil% - \else% - #1\dref@calc@parser@d #2\@nnil% - \fi\fi -} - -\def\dref@calc@parser@a#1#2\@nnil{% - \ifx\else% - \if#1a% - \dref@calc@parser@t #2\@nnil% - \else% - #1\dref@calc@parser@d #2\@nnil% - \fi\fi +\def\dref@parser#1#2{% + \edef\@tempa{#1}% + \csdef{dref@parser@result}{}% + \csdef{dref@parser@state}{}% + \expandafter\dref@parser@parse\@tempa\@nnil% + \xdef#2{\csuse{dref@parser@result}}% } -\def\dref@calc@parser@t#1#2\@nnil{% - \ifx\else% - \if#1t% - \dref@calc@parser@A #2\@nnil% - \else% - #1\dref@calc@parser@d #2\@nnil% - \fi\fi +\def\dref@parser@parse#1#2\@nnil{% + %\typeout{#1 State: \csuse{dref@parser@state}}% + \ifblank{#1#2}{% + \csxdef{dref@parser@result}{\csuse{dref@parser@result}\csuse{dref@parser@state}}% + }{% + \ifcsdef{dref@parser@\csuse{dref@parser@state}@#1}{% + \csuse{dref@parser@\csuse{dref@parser@state}@#1}#2\@nnil% + }{% + \csxdef{dref@parser@result}{\csuse{dref@parser@result}\csuse{dref@parser@state}#1}% + \csdef{dref@parser@state}{}% + \ifblank{#2}{}{% + \dref@parser@parse#2\@nnil% + }% + }% + }% } -\def\dref@calc@parser@A#1#2\@nnil{% - \ifx\else% - \if#1a% - \dref@calc@parser@P #2\@nnil% - \else% - #1\dref@calc@parser@d #2\@nnil% - \fi\fi -} +\csdef{dref@parser@@d}{\csdef{dref@parser@state}{d}\dref@parser@parse} +\csdef{dref@parser@d@a}{\csdef{dref@parser@state}{da}\dref@parser@parse} +\csdef{dref@parser@da@t}{\csdef{dref@parser@state}{dat}\dref@parser@parse} +\csdef{dref@parser@dat@a}{\csdef{dref@parser@state}{data}\dref@parser@parse} +\csdef{dref@parser@data@(}{\csdef{dref@parser@state}{data(}\dref@parser@parse} +\csdef{dref@parser@data(@"}{\dref@parser@tillquote} +\csdef{dref@parser@d@(}{\dref@parser@tillparen} -\def\dref@calc@parser@P#1#2\@nnil{% - \ifx\else% - \if#1(% - \dref@calc@parser@Q #2\@nnil% - \else% - #1\dref@calc@parser@d #2\@nnil% - \fi\fi -} +\def\dref@parser@tillquote#1")#2\@nnil{% + \drefref{\dref@data@math@prefix #1}% + \csxdef{dref@parser@result}{\csuse{dref@parser@result}(\drefvalueof{\dref@data@math@prefix #1})}% + \csdef{dref@parser@state}{}% + \ifblank{#2}{}{\dref@parser@parse#2\@nnil}} -\def\dref@calc@parser@Q#1#2\@nnil{% - \ifx\else% - \if#1"% - \dref@calc@parser@E #2\@nnil% - \else% - #1\dref@calc@parser@d #2\@nnil% - \fi\fi -} +\def\dref@parser@tillparen#1)#2\@nnil{% + \drefref{\dref@data@math@prefix #1}% + \csxdef{dref@parser@result}{\csuse{dref@parser@result}(\drefvalueof{\dref@data@math@prefix #1})}% + \csdef{dref@parser@state}{}% + \ifblank{#2}{}{\dref@parser@parse#2\@nnil}}% -\def\dref@calc@parser@E#1")#2\@nnil{% - (\drefvalueof{\dref@data@math@prefix#1})\ifx&\else\dref@calc@parser@d #2\@nnil\fi% -} +\def\dref@parser@end#1#2\@nnil{} +\csdef{dref@parser@@}{\typeout{end}\dref@parser@end} \newcommand{\dref@calc}[1]{% - \xdef\dref@calc@argA{#1}% - \xdef\dref@calc@@argA{\expandafter\dref@calc@parser@d \dref@calc@argA\@nnil}%% - % \typeout{>>>> \dref@calc@argA -> \dref@calc@@argA}% - \pgfmathparse{\dref@calc@@argA} + %\typeout{Before: '#1'}% + \dref@parser{#1}{\dref@calc@@argA}% + %\typeout{After: \dref@calc@@argA}% + \pgfmathparse{\dref@calc@@argA}% } + \pgfset{/dref/let/.code={\dref@let{#1}}} +\pgfset{/dref/prefix/.code={\csdef{dref@prefix}{#1}}} +\def\drefprefix#1{\csdef{dref@prefix}{#1}} \def\drefresult{0} \def\drefcalc{\@ifstar\@@drefcalc\@drefcalc} \newcommand{\@drefcalc}[2][]{% Unstarred @@ -244,7 +238,7 @@ \pgfmathprintnumberto[fixed,assume math mode=true,precision=10,1000 sep={}]{\pgfmathresult}{\drefresult} \xdef\drefresult{\drefresult}% \dref@format{\pgfmathresult}% - \dref@mkannotate{#2}% + \dref@mkannotate{\textbackslash drefcalc\{#2\}}% \endgroup% } \newcommand{\@@drefcalc}[2][]{ % Starred @@ -286,44 +280,62 @@ \newtoks\dref@toks +\newcount\drefcellcount \newcommand{\dref@makerow}[2]{% {\global\dref@toks={}% - \@tempcnta=\z@% - \def\inner##1##2{#2}% - \renewcommand*{\do}[1]{% - \advance\@tempcnta\@ne% - \csdef{@cell\number\@tempcnta}{\inner{##1}{\number\@tempcntb}}% + \drefcellcount=\z@% + \def\do##1{% + \advance\drefcellcount\@ne% + \def\@tempa{\doX{##1}}% + \expandafter\@tempa\expandafter{\the\drefcellcount}% + }% + \def\doX##1##2{% + \csxdef{@cell\the\drefcellcount}{\detokenize{% + #2% + }}% }% \expandafter\def\expandafter\arglist\expandafter{#1}% \expandafter\docsvlist\expandafter{\arglist}% - \@tempcntb=\z@ - {\loop\ifnum\@tempcntb<\@tempcnta - \advance\@tempcntb\@ne - \edef\next{% - \ifnum\@tempcntb=\@ne\else&\fi - \csuse{@cell\number\@tempcntb}}% - \global\dref@toks=\expandafter{\the\expandafter\dref@toks\next}% - \repeat}% + \@tempcntb=0\relax + {\loop\ifnum\@tempcntb<\drefcellcount + \advance\@tempcntb by 1\relax% + \ifnum \@tempcntb = 1% + \edef\@@next{\csuse{@cell\the\@tempcntb}}% + \else% + \edef\@@next{&\csuse{@cell\the\@tempcntb}}% + \fi% + \global% + \dref@toks% + \expandafter=% + \expandafter{% + \the% + \expandafter\dref@toks% + \@@next}% + \repeat}% }% - \the\dref@toks} + \typeout{LINE: \the\dref@toks}% + \expandafter\scantokens\expandafter{\the\dref@toks}} + \long\def\drefrow{\@ifstar\@@drefrow\@drefrow} -\def\@drefrow#1#2{\dref@makerow{#1}{\drefvalueof{#2}}} % Unstarred +\def\@drefrow#1#2{\dref@makerow{#1}{\dref{#2}}} % Unstarred \def\@@drefrow#1#2{\dref@makerow{#1}{#2}} % Starred \expandafter\ifstrequal\expandafter{\dref@annotate}{pdfcomment}{ \RequirePackage{pdfcomment} } +\def\dref@mkannotate@none#1{\relax} +\def\dref@mkannotate@footnote#1{\footnote{\texttt{#1}}} +\def\dref@mkannotate@pdfcomment#1{\pdfcomment[opacity=0.4,voffset=2ex]{#1}} + \newcommand{\dref@mkannotate}[1]{% - \expandafter\ifstrequal\expandafter{\dref@annotate}{none}% - {\relax}% - {\expandafter\ifstrequal\expandafter{\dref@annotate}{footnote}% - {\footnote{#1}}% - {\expandafter\ifstrequal\expandafter{\dref@annotate}{pdfcomment}% - {\pdfcomment[opacity=0.4,voffset=2ex]{#1}}% - {\dref@error{Value for annotate not supported: '\dref@annotate'}% - }}}}% + \ifcsdef{dref@mkannotate@\dref@annotate}{% + \csuse{dref@mkannotate@\dref@annotate}{#1}% + }{% + \dref@error{Value for annotate not supported: '\dref@annotate'}% + }% +} \newcommand{\drefannotate}[1]{% \renewcommand{\dref@annotate}{#1}% @@ -331,7 +343,7 @@ %% Usagereport \ifdref@usagereport - \RequirePackage{longtable} + \RequirePackage{xtab} \RequirePackage{booktabs} \fi \newcommand{\dref@usagereport@notfound}[2]{} @@ -362,16 +374,33 @@ \dolistcsloop{dref@usagereport@referenced@#1}% \endgroup% } +\newif\ifdref@usagereport@keyheader@first +\dref@usagereport@keyheader@firsttrue \newcommand{\dref@usagereport@keyheader}[1]{% + \ifdref@usagereport@keyheader@first% + \global\dref@usagereport@keyheader@firstfalse% + \else% + \\% + \fi% \textbf{\ifdef{\hypertarget}% {\hypertarget{#1}{\dref@usagereport@strippath{#1}}}% {\dref@usagereport@strippath{#1}}}% & \dref@usagereport@formatreferencelist{#1}% - & \pgfkeysifdefined{#1}{\pgfkeysvalueof{#1}}{\textbf{\color{red}undefined}} \\% + & \pgfkeysifdefined{#1}{\pgfkeysvalueof{#1}}{\textbf{\color{red}undefined}}% } +\newif\ifdref@withhelp +\errorcontextlines=23 +\newlength{\dreflinewidth}% \newcommand{\dref@usagereport@forhelp}[1]{% \begingroup% - \noindent\csuse{dref@help@#1} + \dref@withhelpfalse% + \renewcommand{\do}[1]{% + \dref@help@match{#1}{##1}{% + \dref@withhelptrue% + }{}% + }% + \dolistcsloop{dref@usagereport@keys}% + \dref@usagereport@keyheader@firsttrue% \renewcommand{\do}[1]{% \dref@help@match{#1}{##1}{% \dref@usagereport@keyheader{##1}% @@ -380,42 +409,56 @@ }% }{}% }% - \begin{longtable}{@{\extracolsep{\fill}}lll@{}}\toprule% - & Page(s) & Value \\ \midrule - \endhead - \bottomrule% - \endfoot - \dolistcsloop{dref@usagereport@keys}% - \end{longtable}% + \ifdref@withhelp + \tablehead{\hline & Page & Value \\\hline}% + \setlength\tabcolsep{3pt}% + \dreflinewidth=\linewidth% + \advance\dreflinewidth by -6\tabcolsep% + \begin{xtabular}{|p{0.7\dreflinewidth}|p{0.15\dreflinewidth}|p{0.15\dreflinewidth}|}% + \dolistcsloop{dref@usagereport@keys}\\\hline + \multicolumn{3}{|p{\linewidth}|}{\csuse{dref@help@#1}}\\\hline + \end{xtabular}% + \fi% + \endgroup% } +\newif\ifdref@withouthelp \newcommand{\dref@usagereport@withouthelp}{% + \begingroup% + \dref@withouthelpfalse% + \renewcommand{\do}[1]{% + \ifinlistcs{##1}{dref@usagereport@matchedkeys}{}{% + \dref@withouthelptrue% + }% + }% + \dolistcsloop{dref@usagereport@keys}% + \dref@usagereport@keyheader@firsttrue% \renewcommand{\do}[1]{% \ifinlistcs{##1}{dref@usagereport@matchedkeys}{}{% \dref@usagereport@keyheader{##1}% }% }% - \begin{longtable}{@{\extracolsep{\fill}}lll@{}}\toprule% - Keys without Help & Page(s) & Value \\\midrule - \endhead - \bottomrule - \endfoot - \dolistcsloop{dref@usagereport@keys}% - \end{longtable}% + \ifdref@withouthelp% + \tablehead{\hline Keys without Description & Page & Value \\\hline}% + \setlength\tabcolsep{3pt}% + \dreflinewidth=\linewidth% + \advance\dreflinewidth by -6\tabcolsep% + \begin{xtabular}{|p{0.7\dreflinewidth}|p{0.15\dreflinewidth}|p{0.15\dreflinewidth}|}% + \dolistcsloop{dref@usagereport@keys}\\\hline + \end{xtabular}% + \fi% + \endgroup% } \newcommand{\drefusagereport}{% \ifdref@usagereport% \ifcsvoid{dref@usagereport@keys}{\typeout{EMPTY}}{% \begingroup% - \setlength{\LTleft}{2em}% - \setlength{\LTright}{0pt}% \renewcommand{\do}[1]{% \ifinlistcs{##1}{dref@usagereport@matchedkeys}{}{% \dref@usagereport@forhelp{##1}% }% }% \dolistcsloop{dref@helps} % For all help text - \setlength{\LTleft}{0em}% \dref@usagereport@withouthelp\relax \endgroup% }% csempty @keys @@ -438,6 +481,7 @@ \newif\if@dref@valuemustderef% \newif\if@dref@basemustderef% \newif\if@dref@increase% +\newif\if@dref@product% \newif\if@dref@factor% \newif\if@dref@delta% \newif\if@dref@percent% @@ -463,6 +507,12 @@ delta/.is if=@dref@delta,% delta/.default=true,% delta=false,% + scale/.is if=@dref@product,% + scale/.default=true,% + scale=false,% + product/.is if=@dref@product,% + product/.default=true,% + product=false,% increase/.is if=@dref@increase,% increase/.default=true,% increase=false,% @@ -485,6 +535,7 @@ \newcommand{\@drefrel}[2][]{% \@@drefrel[#1]{#2}% \@@drefrel@result% + \dref@mkannotate{\textbackslash{}drefrel[#1]\{#2\}}% } \newcommand{\@@drefrel}[2][]{% @@ -517,7 +568,12 @@ \pgfmathparse{(\drefvalue) - (\drefbase)}% \def\drefresult{\pgfmathresult}% \else% - \def\drefresult{\drefvalue}% + \if@dref@product% + \pgfmathparse{(\drefvalue) * (\drefbase)}% + \def\drefresult{\pgfmathresult}% + \else + \def\drefresult{\drefvalue}% + \fi \fi% \fi% \fi% -- cgit v1.2.3