From 51dd85fd0039ad102b4c0551cefc94c2dc7b46c0 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Wed, 18 Dec 2013 22:01:05 +0000 Subject: dataref (18dec13) git-svn-id: svn://tug.org/texlive/trunk@32438 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/tex/latex/dataref/dataref.sty | 348 ++++++++++++++++++++++++ 1 file changed, 348 insertions(+) create mode 100644 Master/texmf-dist/tex/latex/dataref/dataref.sty (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 new file mode 100644 index 00000000000..d35434d5189 --- /dev/null +++ b/Master/texmf-dist/tex/latex/dataref/dataref.sty @@ -0,0 +1,348 @@ +%% +%% This is file `dataref.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% dataref.dtx (with options: `package') +%% dataref.dtx +%% Copyright 2013 Christian Dietrich +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3 +%% of this license or (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 Christian Dietrich +%% +%% This work consists of the files dataref.dtx and dataref.ins +%% and the derived file dataref.sty. +\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\ProvidesPackage{dref} + [2013/12/06 v0.1 dref] +\ifx\drefloaded\undefined + \let\drefloaded=\relax +\else + \expandafter\endinput +\fi +\ifx\PackageError\undefined + \def\dref@error#1{\immediate\write-1{Package dref: Error! #1.}}% +\else + \def\dref@error#1{\PackageError{dref}{#1}{}}% +\fi +\RequirePackage{pgf} +\RequirePackage{kvoptions} +\RequirePackage{xparse} +\RequirePackage{etoolbox} +\RequirePackage{etextools} +\SetupKeyvalOptions{ + family=dref, + prefix=dref@ +} +\DeclareStringOption[/data]{datapath} +\DeclareStringOption[1]{defaultvalue} +\DeclareStringOption[none]{annotate} +\DeclareBoolOption{usagereport} +\DeclareBoolOption{ignoremissing} +\DeclareBoolOption{noassert} +\ProcessKeyvalOptions* +\newcommand{\dref@set}[2]{% + \pgfkeys@temptoks{#2}% + \expandafter\xdef\csname pgfk@\dref@datapath#1\endcsname{\the\pgfkeys@temptoks}% +} +\def\drefset#1#2{\dref@set{#1}{#2}} + +\long\def\dref@expandable#1{% + \pgfkeysifdefined{\dref@datapath#1}{% + \pgfkeysvalueof{\dref@datapath#1}% + }{% + \dref@defaultvalue% + }% +} +\long\def\dref@unexpandable#1{% + \def\drefcurrentkey{\dref@datapath#1}% + \pgfkeysifdefined{\drefcurrentkey}{% + \immediate\write\@auxout{\noexpand\dref@found{\drefcurrentkey}{\thepage}}% + }{% + \immediate\write\@auxout{\noexpand\dref@notfound{\drefcurrentkey}{\thepage}}% + \ifdref@ignoremissing% + \typeout{Dref warning: undefined key `\drefcurrentkey'}% + \dref@mkannotate{UNDEFINED: \drefcurrentkey}% + \else% + \dref@error{Dref error: undefined key `\drefcurrentkey'}% + \fi% + }% + \immediate\write\@auxout{\noexpand\dref@referenced{\drefcurrentkey}{\thepage}}% +} +\DeclareDocumentCommand{\dref}{o m}{% + \dref@unexpandable{#2}% + \IfNoValueTF {#1}{% + \gdef\dref@dref@output{\dref@expandable{#2}}% + }{% + \gdef\dref@dref@output{% + \pgfmathparse{\dref@expandable{#2}}% + \dref@format[#1]{\pgfmathresult}% + }% + }% + \dref@dref@output% + \dref@mkannotate{#2}% +} +\def\drefvalueof#1{% + \dref@expandable{#1}% +} +\def\drefref#1{% + \dref@unexpandable{#1}% +} +\newcommand{\dref@help@match}[2]{% + \ifstrmatch{#1}{#2}% +} +\newcommand{\dref@help}[2][]{% + \pgfkeysifdefined{#2/help}{% + \pgfkeysvalueof{#2/help}% + }{#1}% +} +\csdef{dref@helps}{} +\newcommand{\drefsethelp}[2]{ + \csdef{dref@help@#1}{#2}% + \listcsadd{dref@helps}{#1}% +} +\newcommand{\drefhelp}[1]{ + \renewcommand{\do}[1]{% + \dref@help@match{##1}{#1}{% + \csuse{dref@help@##1}% + \listbreak}{}% + }% + \ifcsvoid{dref@helps}{}{% + \dolistcsloop{dref@helps}% + }% +} +\long\def\dref@notfound#1#2{ + \ifdref@usagereport% + \dref@usagereport@notfound{#1}{#2}% + \else\relax\fi% +} +\long\def\dref@found#1#2{ + \ifdref@usagereport% + \dref@usagereport@found{#1}{#2}% + \else\relax\fi% +} +\long\def\dref@referenced#1#2{ + \ifdref@usagereport% + \dref@usagereport@referenced{#1}{#2}% + \else\relax\fi% +} +\def\dref@let#1{% + \def\@tmp##1=##2;{\pgfmathdeclarefunction*{##1}{0}{\pgfmathparse{##2}}}% + \renewcommand*{\do}[1]{\@tmp##1;}% + \docsvlist{#1}% +} +\def\dreflet#1{% + \dref@let{#1}% +} +\DeclareDocumentCommand{\dref@calc}{o m}{% + \IfNoValueTF {#1}{}{% + \dref@let{#1}% + }% + \pgfmathparse{#2}% +} +\def\drefresult{0.0} +\DeclareDocumentCommand{\drefcalc}{s O{} m O{}}{% + \begingroup% + \dref@calc[#2]{#3}% + \xdef\drefresult{\pgfmathresult}% + \IfBooleanTF {#1} {}% Wit star do not print anything + {% + \dref@format[#4]{\pgfmathresult}% + \dref@mkannotate{#3}% + }% + \endgroup% +} +\newcommand{\dref@format}[2][]{% + \pgfmathprintnumber[#1]{#2}% +} +\DeclareDocumentCommand{\drefformat}{O{} m}{% + \dref@format[#1]{#2}% +} + +\gdef\dref@data@math@prefix{} +\pgfmathdeclarefunction{data}{1}{% + \begingroup% + \dref@unexpandable{\dref@data@math@prefix#1}% + \pgfmathparse{\dref@expandable{\dref@data@math@prefix#1}}% + \pgfmath@smuggleone\pgfmathresult% + \endgroup% +} +\DeclareDocumentCommand{\drefprojection}{m m m}{% + \begingroup% + \def\dref@data@math@prefix{#1}% + \def\rename##1##2{\dref@unexpandable{#1/##1}\drefset{#2/##2}{\dref@expandable{#1/##1}}}% + \def\id##1{\rename{##1}{##1}}% + \def\calc##1##2{% + \begingroup% + \dref@calc{##1}% + \xdef\dref@project@result{\pgfmathresult} + \endgroup% + \drefset{#2/##2}{\dref@project@result}% + }% + #3% + \endgroup% +} + + +\newtoks\dref@toks + +\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}}% + }% + \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}% + }% + \the\dref@toks} +\DeclareDocumentCommand{\drefrow}{s m m}{% + \IfBooleanTF {#1} {% + \dref@makerow{#2}{#3}% + }{% Wit star do not print anything + \dref@makerow{#2}{\dref[]{#3}}% + }% +} + +\expandafter\ifstrequal\expandafter{\dref@annotate}{pdfcomment}{ + \RequirePackage{pdfcomment} +} + +\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'}% + }}}}% + +\newcommand{\drefannotate}[1]{% + \renewcommand{\dref@annotate}{#1}% +} + +%% Usagereport +\ifdref@usagereport + \RequirePackage{longtable} + \RequirePackage{booktabs} +\fi +\newcommand{\dref@usagereport@notfound}[2]{} +\newcommand{\dref@usagereport@found}[2]{} + +\csdef{pgfdat@usagereport@keys}{} +\csdef{pgfdat@usagereport@matchedkeys}{} + +\newcommand{\dref@usagereport@referenced}[2]{ + \ifinlistcs{#2}{dref@usagereport@referenced@#1}{}{ + \listcsgadd{dref@usagereport@referenced@#1}{#2} + } + \ifinlistcs{#1}{dref@usagereport@keys}{}{ + \listcsgadd{dref@usagereport@keys}{#1} + } +} +\expandafter\def\expandafter\dref@usagereport@strippath@\dref@datapath#1\blanktest{#1} + +\newcommand{\dref@usagereport@strippath}[1]{% + \expandafter\ifstrmatch\expandafter{\expandafter^\dref@datapath.*$}{#1}% + {\dref@usagereport@strippath@#1\blanktest}% + {#1}% +} +\newcommand{\dref@usagereport@formatreferencelist}[1]{% + \begingroup% + \def\sep{}% + \renewcommand{\do}[1]{\sep\ifdef{\hyperlink}{\hyperlink{page.##1}{##1}}{##1}\def\sep{, }}% + \dolistcsloop{dref@usagereport@referenced@#1}% + \endgroup% +} +\newcommand{\dref@usagereport@keyheader}[1]{% + \textbf{\ifdef{\hypertarget}% + {\hypertarget{#1}{\dref@usagereport@strippath{#1}}}% + {\dref@usagereport@strippath{#1}}}% + & \dref@usagereport@formatreferencelist{#1}% + & \pgfkeysifdefined{#1}{\pgfkeysvalueof{#1}}{\textbf{\red{undefined}}} \\% +} +\newcommand{\dref@usagereport@forhelp}[1]{% + \begingroup% + \noindent\csuse{dref@help@#1} + \renewcommand{\do}[1]{% + \dref@help@match{#1}{##1}{% + \dref@usagereport@keyheader{##1}% + \ifinlistcs{##1}{dref@usagereport@matchedkeys}{}{% + \listcsgadd{dref@usagereport@matchedkeys}{##1}% + }% + }{}% + }% + \begin{longtable}{lll}\toprule% + & Page(s) & Value \\ \midrule + \dolistcsloop{dref@usagereport@keys}% + \end{longtable}% + \endgroup% +} +\newcommand{\dref@usagereport@withouthelp}{% + \renewcommand{\do}[1]{% + \ifinlistcs{##1}{dref@usagereport@matchedkeys}{}{% + \dref@usagereport@keyheader{##1}% + }% + }% + \begin{longtable}{lll}\toprule% + Keys without Help & Page(s) & Value \\\midrule + \endhead + \dolistcsloop{dref@usagereport@keys}% + \end{longtable}% +} +\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 + \fi% +} +\newcommand{\drefassert}[1]{% + \begingroup% + \pgfmathsetmacro{\result}{(#1) ? 1 : 0} + \expandafter\ifstrequal\expandafter{\result}{1.0}{% + \typeout{Assertion holds: #1}% + }{% + \ifdref@noassert% + \typeout{Assertion failed: #1}% + \else% + \dref@error{Assertion failed: #1}% + \fi% + }% + \endgroup% +} +\endinput +%% +%% End of file `dataref.sty'. -- cgit v1.2.3