%% Copyright (C) 2011-2012 by Martin Scharrer <martin@scharrer-online.de>
%% ----------------------------------------------------------------------
%% 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 Martin Scharrer.
%%
%% This work consists of the files adjcalc.dtx, adjustbox.ins
%% and the derived file adjcalc.sty.
%% It is part of the larger adjustbox bundle.
%%
\ProvidesPackage{adjcalc}[%
    2012/05/16
    v1.1
    Provides advanced setlength with multiple back-ends (calc, etex, pgfmath)]
\RequirePackage{xkeyval}
\def\adjcalc@atend{%
\begingroup
\expandafter\ifx\csname glueexpr\endcsname\relax
    \endgroup
    \RequirePackage{calc}%
    \adjcalc@calc
    \def\adjcalc@etex{\PackageError{adjcalc}{e-TeX not available for current compiler!}}%
\else
    \endgroup
    \adjcalc@etex
\fi
}
\def\adjcalc@pgfmath{\AtEndOfPackage{\RequirePackage{pgf}}\def\adjcalc@atend{\adjcalc@pgfmath}}
\def\adjcalc@etex{\def\adjcalc@atend{\adjcalc@etex}}
\def\adjcalc@calc{\AtEndOfPackage{\RequirePackage{calc}}\def\adjcalc@atend{\adjcalc@calc}}
\def\adjcalc@overwrite{\AtEndOfPackage{\adjcalc@overwrite}}
\def\adjcalc@defaultunit{bp}%
\DeclareOptionX<adjcalc>{pgfmath}{\adjcalc@pgfmath}
\DeclareOptionX<adjcalc>{etex}{\adjcalc@etex}
\DeclareOptionX<adjcalc>{calc}{\adjcalc@calc}
\DeclareOptionX<adjcalc>{none}{%
    \let\adjcalc@atend\relax
    \let\adjcalc@overwrite\relax
    \def\adjsetlength{\setlength}%
    \def\adjaddtolength{\addtolength}%
    \def\adjsetcounter{\setcounter}%
    \def\adjaddtocounter{\addtocounter}%
}
\DeclareOptionX<adjcalc>{overwrite}{\adjcalc@overwrite}
\DeclareOptionX<adjcalc>{defaultunit}[bp]{%
    \begingroup
    \def\@tempa{#1}%
    \def\@tempb{none}%
    \ifx\@tempa\@tempb% 'none':
        \endgroup
        \def\adjsetlengthdefault{\adjsetlength}%
    \else
        \ifx\@tempb\adjcalc@defaultunit
            \endgroup
            % was 'none' before
            \let\adjsetlengthdefault\adjsetlengthdefault@
        \else
            \endgroup
        \fi
    \fi
    \def\adjcalc@defaultunit{#1}%
}
\ProcessOptionsX*<adjcalc>
\disable@keys{adjcalc}{none}
\def\adjcalcset{%
    \setkeys{adjcalc}%
}
\def\adjcalc@etex{%
    \protected\def\adjsetlength##1##2{%
        ##1=\glueexpr(##2)\relax
    }%
    \protected\def\adjaddtolength##1##2{%
        \advance##1 by \glueexpr(##2)\relax
    }%
    \protected\def\adjsetcounter##1##2{%
        \@ifundefined{c@##1}%
            {\@nocounterr{##1}}%
            {\global\csname c@##1\endcsname\numexpr(##2)\relax}%
    }%
    \protected\def\adjaddtocounter##1##2{%
        \@ifundefined{c@##1}%
            {\@nocounterr{##1}}%
            {\global\advance\csname c@##1\endcsname\numexpr(##2)\relax}%
    }%
    \def\adjsetlengthdefault@##1##2{%
        \@defaultunits##1=\glueexpr##2 \adjcalc@defaultunit\relax\@nnil
    }%
    \let\adjsetlengthdefault\adjsetlengthdefault@
}
\newif\if@adjcalc@needsdefault
\def\adjcalc@calc{%
    \DeclareRobustCommand\adjsetlength{\calc@assign@skip}%
    \DeclareRobustCommand\adjaddtolength[1]{\calc@assign@skip{\advance ##1}}%
    \DeclareRobustCommand\adjsetcounter[2]{\@ifundefined{c@##1}{\@nocounterr{##1}}{\calc@assign@count{\global\csname c@##1\endcsname}{##2}}}%
    \DeclareRobustCommand\adjaddtocounter[2]{\@ifundefined{c@##1}{\@nocounterr{##1}}{\calc@assign@count{\global\advance\csname c@##1\endcsname}{##2}}}%
    \def\adjsetlengthdefault@##1##2{%
        \begingroup
        \def\calc@post@scan####1!{%
            \def\@tempa{####1}%
            \ifx\@tempa\@empty
              \endgroup% to end calc processing
              % is number only
              \global\@adjcalc@needsdefaulttrue
            \else
              \endgroup% to end calc processing
              % full expression
              \global\@adjcalc@needsdefaultfalse
            \fi
        }%
        \calc@assign@skip{##1}{##2 \adjcalc@defaultunit}%
        \endgroup
        \if@adjcalc@needsdefault
            ##1=##2 \adjcalc@defaultunit\relax
        \else
            \calc@assign@skip{##1}{##2}%
        \fi
    }%
    \def\adjcalc@checkdefault##1\@nnil##2##3{%
        \ifx\relax##1\relax\else
            \calc@assign@skip{##2}{##3}%
        \fi
    }%
    \let\adjsetlengthdefault\adjsetlengthdefault@
}
\def\adjcalc@pgfmath{%
    \DeclareRobustCommand\adjsetlength{\pgfmathsetlength}%
    \DeclareRobustCommand\adjaddtolength{\pgfmathaddtolength}%
    \DeclareRobustCommand\adjsetcounter{\pgfmathsetcounter}%
    \DeclareRobustCommand\adjaddtocounter{\pgfmathaddtocounter}%
    \def\adjsetlengthdefault@##1##2{%
        \edef\pgfmathresultunitscale{1\adjcalc@defaultunit}%
        \let\pgfmathpostparse\pgfmathscaleresult
        \pgfmathparse{##2}%
        ##1=\pgfmathresult pt\relax
    }%
    \let\adjsetlengthdefault\adjsetlengthdefault@
}
\def\adjcalc@overwrite{%
    \let\setlength\adjsetlength
    \let\addtolength\adjaddtolength
    \let\setcounter\adjsetcounter
    \let\addtocounter\adjaddtocounter
}
\adjcalc@atend
\endinput
%%
%% End of file `adjcalc.sty'.
