xeps/deps/adjcalc.sty

156 lines
5.3 KiB
TeX

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