adjcalc.sty (5413B)
1 %% Copyright (C) 2011-2012 by Martin Scharrer <martin@scharrer-online.de> 2 %% ---------------------------------------------------------------------- 3 %% This work may be distributed and/or modified under the 4 %% conditions of the LaTeX Project Public License, either version 1.3 5 %% of this license or (at your option) any later version. 6 %% The latest version of this license is in 7 %% http://www.latex-project.org/lppl.txt 8 %% and version 1.3 or later is part of all distributions of LaTeX 9 %% version 2005/12/01 or later. 10 %% 11 %% This work has the LPPL maintenance status `maintained'. 12 %% 13 %% The Current Maintainer of this work is Martin Scharrer. 14 %% 15 %% This work consists of the files adjcalc.dtx, adjustbox.ins 16 %% and the derived file adjcalc.sty. 17 %% It is part of the larger adjustbox bundle. 18 %% 19 \ProvidesPackage{adjcalc}[% 20 2012/05/16 21 v1.1 22 Provides advanced setlength with multiple back-ends (calc, etex, pgfmath)] 23 \RequirePackage{xkeyval} 24 \def\adjcalc@atend{% 25 \begingroup 26 \expandafter\ifx\csname glueexpr\endcsname\relax 27 \endgroup 28 \RequirePackage{calc}% 29 \adjcalc@calc 30 \def\adjcalc@etex{\PackageError{adjcalc}{e-TeX not available for current compiler!}}% 31 \else 32 \endgroup 33 \adjcalc@etex 34 \fi 35 } 36 \def\adjcalc@pgfmath{\AtEndOfPackage{\RequirePackage{pgf}}\def\adjcalc@atend{\adjcalc@pgfmath}} 37 \def\adjcalc@etex{\def\adjcalc@atend{\adjcalc@etex}} 38 \def\adjcalc@calc{\AtEndOfPackage{\RequirePackage{calc}}\def\adjcalc@atend{\adjcalc@calc}} 39 \def\adjcalc@overwrite{\AtEndOfPackage{\adjcalc@overwrite}} 40 \def\adjcalc@defaultunit{bp}% 41 \DeclareOptionX<adjcalc>{pgfmath}{\adjcalc@pgfmath} 42 \DeclareOptionX<adjcalc>{etex}{\adjcalc@etex} 43 \DeclareOptionX<adjcalc>{calc}{\adjcalc@calc} 44 \DeclareOptionX<adjcalc>{none}{% 45 \let\adjcalc@atend\relax 46 \let\adjcalc@overwrite\relax 47 \def\adjsetlength{\setlength}% 48 \def\adjaddtolength{\addtolength}% 49 \def\adjsetcounter{\setcounter}% 50 \def\adjaddtocounter{\addtocounter}% 51 } 52 \DeclareOptionX<adjcalc>{overwrite}{\adjcalc@overwrite} 53 \DeclareOptionX<adjcalc>{defaultunit}[bp]{% 54 \begingroup 55 \def\@tempa{#1}% 56 \def\@tempb{none}% 57 \ifx\@tempa\@tempb% 'none': 58 \endgroup 59 \def\adjsetlengthdefault{\adjsetlength}% 60 \else 61 \ifx\@tempb\adjcalc@defaultunit 62 \endgroup 63 % was 'none' before 64 \let\adjsetlengthdefault\adjsetlengthdefault@ 65 \else 66 \endgroup 67 \fi 68 \fi 69 \def\adjcalc@defaultunit{#1}% 70 } 71 \ProcessOptionsX*<adjcalc> 72 \disable@keys{adjcalc}{none} 73 \def\adjcalcset{% 74 \setkeys{adjcalc}% 75 } 76 \def\adjcalc@etex{% 77 \protected\def\adjsetlength##1##2{% 78 ##1=\glueexpr(##2)\relax 79 }% 80 \protected\def\adjaddtolength##1##2{% 81 \advance##1 by \glueexpr(##2)\relax 82 }% 83 \protected\def\adjsetcounter##1##2{% 84 \@ifundefined{c@##1}% 85 {\@nocounterr{##1}}% 86 {\global\csname c@##1\endcsname\numexpr(##2)\relax}% 87 }% 88 \protected\def\adjaddtocounter##1##2{% 89 \@ifundefined{c@##1}% 90 {\@nocounterr{##1}}% 91 {\global\advance\csname c@##1\endcsname\numexpr(##2)\relax}% 92 }% 93 \def\adjsetlengthdefault@##1##2{% 94 \@defaultunits##1=\glueexpr##2 \adjcalc@defaultunit\relax\@nnil 95 }% 96 \let\adjsetlengthdefault\adjsetlengthdefault@ 97 } 98 \newif\if@adjcalc@needsdefault 99 \def\adjcalc@calc{% 100 \DeclareRobustCommand\adjsetlength{\calc@assign@skip}% 101 \DeclareRobustCommand\adjaddtolength[1]{\calc@assign@skip{\advance ##1}}% 102 \DeclareRobustCommand\adjsetcounter[2]{\@ifundefined{c@##1}{\@nocounterr{##1}}{\calc@assign@count{\global\csname c@##1\endcsname}{##2}}}% 103 \DeclareRobustCommand\adjaddtocounter[2]{\@ifundefined{c@##1}{\@nocounterr{##1}}{\calc@assign@count{\global\advance\csname c@##1\endcsname}{##2}}}% 104 \def\adjsetlengthdefault@##1##2{% 105 \begingroup 106 \def\calc@post@scan####1!{% 107 \def\@tempa{####1}% 108 \ifx\@tempa\@empty 109 \endgroup% to end calc processing 110 % is number only 111 \global\@adjcalc@needsdefaulttrue 112 \else 113 \endgroup% to end calc processing 114 % full expression 115 \global\@adjcalc@needsdefaultfalse 116 \fi 117 }% 118 \calc@assign@skip{##1}{##2 \adjcalc@defaultunit}% 119 \endgroup 120 \if@adjcalc@needsdefault 121 ##1=##2 \adjcalc@defaultunit\relax 122 \else 123 \calc@assign@skip{##1}{##2}% 124 \fi 125 }% 126 \def\adjcalc@checkdefault##1\@nnil##2##3{% 127 \ifx\relax##1\relax\else 128 \calc@assign@skip{##2}{##3}% 129 \fi 130 }% 131 \let\adjsetlengthdefault\adjsetlengthdefault@ 132 } 133 \def\adjcalc@pgfmath{% 134 \DeclareRobustCommand\adjsetlength{\pgfmathsetlength}% 135 \DeclareRobustCommand\adjaddtolength{\pgfmathaddtolength}% 136 \DeclareRobustCommand\adjsetcounter{\pgfmathsetcounter}% 137 \DeclareRobustCommand\adjaddtocounter{\pgfmathaddtocounter}% 138 \def\adjsetlengthdefault@##1##2{% 139 \edef\pgfmathresultunitscale{1\adjcalc@defaultunit}% 140 \let\pgfmathpostparse\pgfmathscaleresult 141 \pgfmathparse{##2}% 142 ##1=\pgfmathresult pt\relax 143 }% 144 \let\adjsetlengthdefault\adjsetlengthdefault@ 145 } 146 \def\adjcalc@overwrite{% 147 \let\setlength\adjsetlength 148 \let\addtolength\adjaddtolength 149 \let\setcounter\adjsetcounter 150 \let\addtocounter\adjaddtocounter 151 } 152 \adjcalc@atend 153 \endinput 154 %% 155 %% End of file `adjcalc.sty'.