diff options
Diffstat (limited to 'Master/texmf-dist/tex/generic/oberdiek/intcalc.sty')
-rw-r--r-- | Master/texmf-dist/tex/generic/oberdiek/intcalc.sty | 1569 |
1 files changed, 1569 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/generic/oberdiek/intcalc.sty b/Master/texmf-dist/tex/generic/oberdiek/intcalc.sty new file mode 100644 index 00000000000..e92da6bba91 --- /dev/null +++ b/Master/texmf-dist/tex/generic/oberdiek/intcalc.sty @@ -0,0 +1,1569 @@ +%% +%% This is file `intcalc.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% intcalc.dtx (with options: `package') +%% +%% This is a generated file. +%% +%% Copyright (C) 2007 by Heiko Oberdiek <oberdiek@uni-freiburg.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". +%% +%% This Current Maintainer of this work is Heiko Oberdiek. +%% +%% This work consists of the main source file intcalc.dtx +%% and the derived files +%% intcalc.sty, intcalc.pdf, intcalc.ins, intcalc.drv, +%% intcalc-test1.tex, intcalc-test2.tex, intcalc-test3.tex, +%% intcalc-test4.tex. +%% +\begingroup + \catcode44 12 % , + \catcode45 12 % - + \catcode46 12 % . + \catcode58 12 % : + \catcode64 11 % @ + \expandafter\let\expandafter\x\csname ver@intcalc.sty\endcsname + \ifcase 0% + \ifx\x\relax % plain + \else + \ifx\x\empty % LaTeX + \else + 1% + \fi + \fi + \else + \expandafter\ifx\csname PackageInfo\endcsname\relax + \def\x#1#2{% + \immediate\write-1{Package #1 Info: #2.}% + }% + \else + \def\x#1#2{\PackageInfo{#1}{#2, stopped}}% + \fi + \x{intcalc}{The package is already loaded}% + \endgroup + \expandafter\endinput + \fi +\endgroup +\begingroup + \catcode40 12 % ( + \catcode41 12 % ) + \catcode44 12 % , + \catcode45 12 % - + \catcode46 12 % . + \catcode47 12 % / + \catcode58 12 % : + \catcode64 11 % @ + \expandafter\ifx\csname ProvidesPackage\endcsname\relax + \def\x#1#2#3[#4]{\endgroup + \immediate\write-1{Package: #3 #4}% + \xdef#1{#4}% + }% + \else + \def\x#1#2[#3]{\endgroup + #2[{#3}]% + \ifx#1\relax + \xdef#1{#3}% + \fi + }% + \fi +\expandafter\x\csname ver@intcalc.sty\endcsname +\ProvidesPackage{intcalc}% + [2007/09/09 v1.0 Expandable integer calculations (HO)] +\expandafter\edef\csname IntCalc@AtEnd\endcsname{% + \catcode64 \the\catcode64\relax +} +\catcode64 11 % @ +\def\TMP@EnsureCode#1#2{% + \edef\IntCalc@AtEnd{% + \IntCalc@AtEnd + \catcode#1 \the\catcode#1\relax + }% + \catcode#1 #2\relax +} +\TMP@EnsureCode{33}{12}% ! +\TMP@EnsureCode{40}{12}% ( +\TMP@EnsureCode{41}{12}% ) +\TMP@EnsureCode{42}{12}% * +\TMP@EnsureCode{43}{12}% + +\TMP@EnsureCode{45}{12}% - +\TMP@EnsureCode{47}{12}% / +\TMP@EnsureCode{58}{11}% : (letter!) +\TMP@EnsureCode{60}{12}% < +\TMP@EnsureCode{61}{12}% = +\TMP@EnsureCode{62}{12}% > +\TMP@EnsureCode{63}{14}% ? (comment!) +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname IntCalc@TestMode\endcsname\relax +\else + \catcode63=9 % ? (ignore) +\fi +? \let\IntCalc@@TestMode\IntCalc@TestMode +\def\IntCalc@Space{ } +\def\IntCalc@Abs#1#2!{% + \ifx#1-% + #2% + \else + #1#2% + \fi +} +\def\IntCalc@Sgn#1#2!{% + \ifx#1-% + -1% + \else + \ifx#10% + 0% + \else + 1% + \fi + \fi +} +\def\IntCalc@Min#1!#2!{% + \ifnum#1<#2 % + #1% + \else + #2% + \fi +} +\def\IntCalc@Max#1!#2!{% + \ifnum#1>#2 % + #1% + \else + #2% + \fi +} +\def\IntCalc@Cmp#1!#2!{% + \ifnum#1=#2 % + 0% + \else + \ifnum#1<#2 % + -% + \fi + 1% + \fi +} +\def\IntCalc@Fac#1!{% + \ifcase#1 1% 0! + \or 1% 1! + \or 2% 2! + \or 6% 3! + \or 24% 4! + \or 120% 5! + \or 720% 6! + \or 5040% 7! + \or 40320% 8! + \or 362880% 9! + \or 3628800% 10! + \or 39916800% 11! + \or 479001600% 12! + \else + \ifnum#1<\z@ + 0\IntCalcError:FacNegative% + \else + 0\IntCalcError:FacOverflow% + \fi + \fi +} +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname numexpr\endcsname\relax +\else + \def\intcalcInv#1{% + \number-\the\numexpr#1\relax\IntCalc@Space + }% + \def\intcalcAbs#1{% + \number\expandafter\IntCalc@Abs\the\numexpr#1! % + }% + \def\intcalcSgn#1{% + \number\expandafter\IntCalc@Sgn\the\numexpr#1! % + }% + \def\intcalcMin#1#2{% + \number\expandafter\IntCalc@Min + \the\numexpr#1\expandafter!% + \the\numexpr#2! % + }% + \def\intcalcMax#1#2{% + \number\expandafter\IntCalc@Max + \the\numexpr#1\expandafter!% + \the\numexpr#2! % + }% + \def\intcalcCmp#1#2{% + \number\expandafter\IntCalc@Cmp + \the\numexpr#1\expandafter!\the\numexpr#2! % + }% + \def\intcalcInc#1{% + \the\numexpr#1+1\relax + }% + \def\intcalcDec#1{% + \the\numexpr#1-1\relax + }% + \def\intcalcAdd#1#2{% + \the\numexpr#1+(#2)\relax + }% + \def\intcalcSub#1#2{% + \the\numexpr#1-(#2)\relax + }% + \def\intcalcShl#1{% + \number\expandafter\IntCalc@Shl\the\numexpr#1! % + }% + \def\IntCalc@Shl#1#2!{% + \ifx#1-% + 0\IntCalcError:ShlNegativeNumber% + \else + \the\numexpr#1#2*2\relax + \fi + }% + \def\intcalcShr#1{% + \number\expandafter\IntCalc@Shr\the\numexpr#1! % + }% + \def\IntCalc@Shr#1#2!{% + \ifx#1-% + 0\IntCalcError:ShrNegativeNumber% + \else + \ifodd#1#2 % + \the\numexpr(#1#2-1)/2\relax + \else + \the\numexpr#1#2/2\relax + \fi + \fi + }% + \def\intcalcMul#1#2{% + \the\numexpr(#1)*(#2)\relax + }% + \def\intcalcSqr#1{% + \number\expandafter\IntCalc@Sqr\the\numexpr#1! % + }% + \def\IntCalc@Sqr#1!{% + \the\numexpr#1*#1\relax + }% + \def\intcalcFac#1{% + \number\expandafter\IntCalc@Fac\the\numexpr#1! % + }% + \def\intcalcPow#1#2{% + \number\expandafter\IntCalc@Pow + \the\numexpr#1\expandafter!% + \the\numexpr#2! % + }% + \def\IntCalc@Pow#1#2!#3#4!{% + \ifcase#3#4 % power = 0 + 1% + \or % power = 1 + #1#2% + \or % power = 2 + \the\numexpr#1#2*#1#2\relax + \else + \ifcase#1#2 % basis = 0, power <> 0 + 0% + \ifx#3-% power < 0 + 0\IntCalcError:DivisionByZero% + \fi + \or + 1% basis = 1 + \else + \ifnum#1#2=\m@ne % basis = -1 + \ifodd#3#4 % + -% + \fi + 1% + \else % |basis| > 1 + \ifx#3-% power < 0 + 0% + \else % power > 2 + \IntCalc@PowRec#1#2!#3#4!1!% + \fi + \fi + \fi + \fi + }% + \def\IntCalc@PowRec#1!#2!#3!{% + \ifnum#2=\@ne + \the\numexpr#1*#3\relax + \else + \ifodd#2 % + \expandafter\IntCalc@PowRec + \the\numexpr#1*#1\expandafter!% + \the\numexpr(#2-1)/2\expandafter!% + \the\numexpr#1*#3\expandafter\expandafter\expandafter!% + \else + \expandafter\IntCalc@PowRec + \the\numexpr#1*#1\expandafter!% + \the\numexpr(#2-1)/2\expandafter!% + \number#3\expandafter\expandafter\expandafter!% + \fi + \fi + }% + \def\intcalcDiv#1#2{% + \number\expandafter\IntCalc@Div + \the\numexpr#1\expandafter!% + \the\numexpr#2! % + }% + \def\IntCalc@Div#1!#2!{% + \ifcase#2 % + 0\IntCalcError:DivisionByZero% + \else + \ifcase#1 % + 0% + \else + \expandafter\IntCalc@@Div + \romannumeral 0% + \ifnum#1<\z@ + \expandafter-\number-#1% + \else + \expandafter+\number#1% + \fi + \expandafter!% + \romannumeral 0% + \ifnum#2<\z@ + \expandafter-\number-#2% + \else + \expandafter+\number#2% + \fi + !% + \fi + \fi + }% + \def\IntCalc@@Div#1#2!#3#4!{% + #1#3% + \the\numexpr(#2-(#4-1)/2)/#4\relax + }% + \def\intcalcMod#1#2{% + \number\expandafter\IntCalc@Mod + \the\numexpr#1\expandafter!% + \the\numexpr#2! % + }% + \def\IntCalc@Mod#1!#2!{% + \ifcase#2 % + 0\IntCalcError:DivisionByZero% + \else + \ifcase#1 % + 0% + \else + \expandafter\IntCalc@@Mod + \romannumeral 0% + \ifnum#1<\z@ + \expandafter-\number-#1% + \else + \expandafter+\number#1% + \fi + \expandafter!% + \romannumeral 0% + \ifnum#2<\z@ + \expandafter-\number-#2% + \else + \expandafter+\number#2% + \fi + !% + \fi + \fi + }% + \def\IntCalc@@Mod#1#2!#3#4!{% + \if#3+% + \if#1+% + \the\numexpr#2-\IntCalc@@Div+#2!+#4!*#4\relax + \else + \expandafter\IntCalc@ModX + \the\numexpr-#2+\IntCalc@@Div+#2!+#4!*#4!#4!% + \fi + \else + -% + \if#1+% + \expandafter\IntCalc@ModX + \the\numexpr-#2+\IntCalc@@Div+#2!+#4!*#4!#4!% + \else + \the\numexpr#2-\IntCalc@@Div+#2!+#4!*#4\relax + \fi + \fi + }% + \def\IntCalc@ModX#1!#2!{% + \ifcase#1 % + 0% + \else + \the\numexpr#1+#2\relax + \fi + }% + \IntCalc@AtEnd + \expandafter\endinput +\fi +\def\intcalcInv#1{% + \number\expandafter\IntCalc@Inv\number-#1! % +} +\def\IntCalc@Inv#1!{#1} +\def\intcalcAbs#1{% + \number\expandafter\IntCalc@Abs\number#1! % +} +\def\intcalcSgn#1{% + \number\expandafter\IntCalc@Sgn\number#1! % +} +\def\intcalcMin#1#2{% + \number\expandafter\IntCalc@Min + \number\number#1\expandafter!\number#2! % +} +\def\intcalcMax#1#2{% + \number\expandafter\IntCalc@Max + \number\number#1\expandafter!\number#2! % +} +\def\intcalcCmp#1#2{% + \number\expandafter\IntCalc@Cmp + \number\number#1\expandafter!\number#2! % +}% +\def\intcalcInc#1{% + \number\expandafter\IntCalc@IncSwitch\number#1! % +} +\def\IntCalc@IncSwitch#1#2!{% + \ifx#1-% + -% + \csname IntCalc@Empty% + \IntCalc@Dec#2!% + \else + \csname IntCalc@Empty% + \IntCalc@Inc#1#2!% + \fi +} +\def\intcalcDec#1{% + \number\expandafter\IntCalc@DecSwitch\number#1! % +} +\def\IntCalc@DecSwitch#1#2!{% + \ifx#1-% + -% + \csname IntCalc@Empty% + \expandafter\IntCalc@Inc#2!% + \else + \ifx#10% + -1% + \else + \csname IntCalc@Empty% + \IntCalc@Dec#1#2!% + \fi + \fi +} +\def\IntCalc@Inc#1#2{% + \ifx#2!% + \csname IntCalc@IncDigit#1\endcsname1% + \else + \csname IntCalc@IncDigit#1% + \expandafter\IntCalc@Inc\expandafter#2% + \fi +} +\def\IntCalc@Temp#1#2{% + \expandafter\def\csname IntCalc@IncDigit#1\endcsname##1{% + \endcsname + 0% + \ifcase##1 % + #1% + \else + #2% + \fi + }% +} +\IntCalc@Temp 01 +\IntCalc@Temp 12 +\IntCalc@Temp 23 +\IntCalc@Temp 34 +\IntCalc@Temp 45 +\IntCalc@Temp 56 +\IntCalc@Temp 67 +\IntCalc@Temp 78 +\IntCalc@Temp 89 +\expandafter\def\csname IntCalc@IncDigit9\endcsname#1{% + \expandafter\endcsname + \ifcase#1 % + 09% + \else + 10% + \fi +} +\def\IntCalc@Dec#1#2{% + \ifx#2!% + \csname IntCalc@DecDigit#1\endcsname1% + \else + \csname IntCalc@DecDigit#1% + \expandafter\IntCalc@Dec\expandafter#2% + \fi +} +\def\IntCalc@Temp#1#2{% + \expandafter\def\csname IntCalc@DecDigit#1\endcsname##1{% + \endcsname + 0% + \ifcase##1 % + #1% + \else + #2% + \fi + }% +} +\IntCalc@Temp 98 +\IntCalc@Temp 87 +\IntCalc@Temp 76 +\IntCalc@Temp 65 +\IntCalc@Temp 54 +\IntCalc@Temp 43 +\IntCalc@Temp 32 +\IntCalc@Temp 21 +\IntCalc@Temp 10 +\expandafter\def\csname IntCalc@DecDigit0\endcsname#1{% + \expandafter\endcsname + \ifcase#1 % + 00% + \else + 19% + \fi +} +\def\intcalcAdd#1#2{% + \number + \expandafter\IntCalc@AddSwitch + \number\number#1\expandafter!% + \number#2!% + \IntCalc@Space +} +\def\intcalcSub#1#2{% + \number + \expandafter\IntCalc@AddSwitch + \number\number#1\expandafter!% + \number-\number#2!% + \IntCalc@Space +} +\def\IntCalc@AddSwitch#1!#2!{% + \ifnum#1<\z@ + \ifnum#2<\z@ + -% + \ifnum#1<#2 % + \expandafter\IntCalc@Add\number-#1\expandafter!% + \IntCalc@Gobble#2!% + \else + \expandafter\IntCalc@Add\number-#2\expandafter!% + \IntCalc@Gobble#1!% + \fi + \else + \ifnum-#1>#2 % + -% + \expandafter\IntCalc@Sub\IntCalc@Gobble#1!#2!% + \else + \expandafter\IntCalc@Sub\number#2\expandafter!% + \IntCalc@Gobble#1!% + \fi + \fi + \else + \ifnum#2<\z@ + \ifnum#1>-#2 % + \expandafter\IntCalc@Sub\number#1\expandafter!% + \IntCalc@Gobble#2!% + \else + -% + \expandafter\IntCalc@Sub\IntCalc@Gobble#2!#1!% + \fi + \else + \ifnum#1>#2 % + \IntCalc@Add#1!#2!% + \else + \IntCalc@Add#2!#1!% + \fi + \fi + \fi +} +\def\IntCalc@Add#1!#2!{% + \ifcase#2 % + #1% + \else + \IntCalc@@Add#1!#2!000000000\IntCalc@Space + \fi +} +\def\IntCalc@Sub#1!#2!{% + \ifnum#1=#2 % + 0% + \else + \IntCalc@@Sub#1!#2!000000000\IntCalc@Space + \fi +} +\def\IntCalc@@Add#1!#2#3!{% + \ifx\IntCalc@Empty#3\IntCalc@Empty + \@ReturnAfterElseFi{% + \IntCalc@@@Add!!#1!#2% + }% + \else + \@ReturnAfterFi{% + \IntCalc@@Add#1!#3!#2% + }% + \fi +} +\def\IntCalc@@Sub#1!#2#3!{% + \ifx\IntCalc@Empty#3\IntCalc@Empty + \@ReturnAfterElseFi{% + \IntCalc@@@Sub!!#1!#2% + }% + \else + \@ReturnAfterFi{% + \IntCalc@@Sub#1!#3!#2% + }% + \fi +} +\def\IntCalc@@@Add#1!#2!#3#4!#5{% + \ifx\IntCalc@Empty#4\IntCalc@Empty + \csname IntCalc@Empty% + \@ReturnAfterElseFi{% + \IntCalc@ProcessAdd#1#3!#5#2% + }% + \else + \@ReturnAfterFi{% + \IntCalc@@@Add#1#3!#5#2!#4!% + }% + \fi +} +\def\IntCalc@@@Sub#1!#2!#3#4!#5{% + \ifx\IntCalc@Empty#4\IntCalc@Empty + \csname IntCalc@Gobble% + \@ReturnAfterElseFi{% + \IntCalc@ProcessSub#1#3!#5#2% + }% + \else + \@ReturnAfterFi{% + \IntCalc@@@Sub#1#3!#5#2!#4!% + }% + \fi +} +\def\IntCalc@ProcessAdd#1#2!#3#4{% + \ifx\IntCalc@Empty#2\IntCalc@Empty + \csname IntCalc@AddDigit#1\endcsname#3% + \romannumeral0#4% + \else + \csname IntCalc@AddDigit#1\csname IntCalc@DigitCarry#3% + \@ReturnAfterFi{% + \IntCalc@ProcessAdd#2!#4% + }% + \fi +} +\def\IntCalc@ProcessSub#1#2!#3#4{% + \ifx\IntCalc@Empty#2\IntCalc@Empty + \csname IntCalc@SubDigit#1\endcsname#3% + \romannumeral0#4% + \else + \csname IntCalc@SubDigit#1\csname IntCalc@DigitCarry#3% + \@ReturnAfterFi{% + \IntCalc@ProcessSub#2!#4% + }% + \fi +} +\def\IntCalc@Temp#1#2{% + \expandafter\def\csname IntCalc@DigitCarry#1\endcsname##1{% + \ifcase##1 % + \endcsname#1% + \else + \endcsname#2% + \fi + }% +} +\IntCalc@Temp 01 +\IntCalc@Temp 12 +\IntCalc@Temp 23 +\IntCalc@Temp 34 +\IntCalc@Temp 45 +\IntCalc@Temp 56 +\IntCalc@Temp 67 +\IntCalc@Temp 78 +\IntCalc@Temp 89 +\IntCalc@Temp 9{{10}} +\expandafter\def\csname IntCalc@AddDigit0\endcsname#1{% + \ifnum#1>9 % + \endcsname10% + \else + \endcsname0#1% + \fi +} +\def\IntCalc@Temp#1#2#3{% + \expandafter\def\csname IntCalc@AddDigit#1\endcsname##1{% + \ifnum##1>#2 % + \endcsname 1% + \else + \endcsname 0% + \fi + \ifcase##1 #1% 0 + #3% + \else #1% 10 + \fi + }% +} +\IntCalc@Temp 18{% + \or 2% 1 + \or 3% 2 + \or 4% 3 + \or 5% 4 + \or 6% 5 + \or 7% 6 + \or 8% 7 + \or 9% 8 + \or 0% 9 +}% +\IntCalc@Temp 27{% + \or 3% 1 + \or 4% 2 + \or 5% 3 + \or 6% 4 + \or 7% 5 + \or 8% 6 + \or 9% 7 + \or 0% 8 + \or 1% 9 +}% +\IntCalc@Temp 36{% + \or 4% 1 + \or 5% 2 + \or 6% 3 + \or 7% 4 + \or 8% 5 + \or 9% 6 + \or 0% 7 + \or 1% 8 + \or 2% 9 +}% +\IntCalc@Temp 45{% + \or 5% 1 + \or 6% 2 + \or 7% 3 + \or 8% 4 + \or 9% 5 + \or 0% 6 + \or 1% 7 + \or 2% 8 + \or 3% 9 +}% +\IntCalc@Temp 54{% + \or 6% 1 + \or 7% 2 + \or 8% 3 + \or 9% 4 + \or 0% 5 + \or 1% 6 + \or 2% 7 + \or 3% 8 + \or 4% 9 +}% +\IntCalc@Temp 63{% + \or 7% 1 + \or 8% 2 + \or 9% 3 + \or 0% 4 + \or 1% 5 + \or 2% 6 + \or 3% 7 + \or 4% 8 + \or 5% 9 +}% +\IntCalc@Temp 72{% + \or 8% 1 + \or 9% 2 + \or 0% 3 + \or 1% 4 + \or 2% 5 + \or 3% 6 + \or 4% 7 + \or 5% 8 + \or 6% 9 +}% +\IntCalc@Temp 81{% + \or 9% 1 + \or 0% 2 + \or 1% 3 + \or 2% 4 + \or 3% 5 + \or 4% 6 + \or 5% 7 + \or 6% 8 + \or 7% 9 +}% +\IntCalc@Temp 90{% + \or 0% 1 + \or 1% 2 + \or 2% 3 + \or 3% 4 + \or 4% 5 + \or 5% 6 + \or 6% 7 + \or 7% 8 + \or 8% 9 +}% +\def\IntCalc@Temp#1#2{% + \expandafter\def\csname IntCalc@SubDigit#1\endcsname##1{% + \ifnum##1>#1 % + \endcsname 1% + \else + \endcsname 0% + \fi + \ifcase##1 #1% 0 + #2% + \else #1% 10 + \fi + }% +} +\IntCalc@Temp 0{% + \or 9% 1 + \or 8% 2 + \or 7% 3 + \or 6% 4 + \or 5% 5 + \or 4% 6 + \or 3% 7 + \or 2% 8 + \or 1% 9 +} +\IntCalc@Temp 1{% + \or 0% 1 + \or 9% 2 + \or 8% 3 + \or 7% 4 + \or 6% 5 + \or 5% 6 + \or 4% 7 + \or 3% 8 + \or 2% 9 +} +\IntCalc@Temp 2{% + \or 1% 1 + \or 0% 2 + \or 9% 3 + \or 8% 4 + \or 7% 5 + \or 6% 6 + \or 5% 7 + \or 4% 8 + \or 3% 9 +} +\IntCalc@Temp 3{% + \or 2% 1 + \or 1% 2 + \or 0% 3 + \or 9% 4 + \or 8% 5 + \or 7% 6 + \or 6% 7 + \or 5% 8 + \or 4% 9 +} +\IntCalc@Temp 4{% + \or 3% 1 + \or 2% 2 + \or 1% 3 + \or 0% 4 + \or 9% 5 + \or 8% 6 + \or 7% 7 + \or 6% 8 + \or 5% 9 +} +\IntCalc@Temp 5{% + \or 4% 1 + \or 3% 2 + \or 2% 3 + \or 1% 4 + \or 0% 5 + \or 9% 6 + \or 8% 7 + \or 7% 8 + \or 6% 9 +} +\IntCalc@Temp 6{% + \or 5% 1 + \or 4% 2 + \or 3% 3 + \or 2% 4 + \or 1% 5 + \or 0% 6 + \or 9% 7 + \or 8% 8 + \or 7% 9 +} +\IntCalc@Temp 7{% + \or 6% 1 + \or 5% 2 + \or 4% 3 + \or 3% 4 + \or 2% 5 + \or 1% 6 + \or 0% 7 + \or 9% 8 + \or 8% 9 +} +\IntCalc@Temp 8{% + \or 7% 1 + \or 6% 2 + \or 5% 3 + \or 4% 4 + \or 3% 5 + \or 2% 6 + \or 1% 7 + \or 0% 8 + \or 9% 9 +} +\IntCalc@Temp 9{% + \or 8% 1 + \or 7% 2 + \or 6% 3 + \or 5% 4 + \or 4% 5 + \or 3% 6 + \or 2% 7 + \or 1% 8 + \or 0% 9 +} +\def\intcalcShl#1{% + \number\expandafter\IntCalc@ShlSwitch\number#1! % +} +\def\IntCalc@ShlSwitch#1!{% + \ifnum#1<\z@ + 0\IntCalcError:ShlNegativeNumber% + \else + \csname IntCalc@Empty% + \IntCalc@Shl#1!% + \fi +} +\def\IntCalc@Shl#1#2{% + \ifx#2!% + \csname IntCalc@ShlDigit#1\endcsname0% + \else + \csname IntCalc@ShlDigit#1% + \@ReturnAfterFi{% + \IntCalc@Shl#2% + }% + \fi +} +\expandafter\def\csname IntCalc@ShlDigit0\endcsname{% + \endcsname0% +} +\def\IntCalc@Temp#1#2#3#4#5{% + \expandafter\def\csname IntCalc@ShlDigit#1\endcsname##1{% + \expandafter\endcsname + \ifcase##1 % + #2#3% + \else + #4#5% + \fi + }% +} +\IntCalc@Temp 10203 +\IntCalc@Temp 20405 +\IntCalc@Temp 30607 +\IntCalc@Temp 40809 +\IntCalc@Temp 51011 +\IntCalc@Temp 61213 +\IntCalc@Temp 71415 +\IntCalc@Temp 81617 +\IntCalc@Temp 91819 +\def\intcalcShr#1{% + \number\expandafter\IntCalc@ShrSwitch\number#1! % +} +\def\IntCalc@ShrSwitch#1!{% + \ifnum#1<\z@ + 0\IntCalcError:ShrNegativeNumber% + \else + \IntCalc@Shr#1!% + \fi +} +\def\IntCalc@Shr#1#2{% + \IntCalc@ShrDigit#1!% + \ifx#2!% + \else + \@ReturnAfterFi{% + \ifodd#1 % + \@ReturnAfterElseFi{% + \IntCalc@Shr{1#2}% + }% + \else + \expandafter\IntCalc@Shr\expandafter#2% + \fi + }% + \fi +} +\def\IntCalc@ShrDigit#1!{% + \ifcase#1 0% 0 + \or 0% 1 + \or 1% 2 + \or 1% 3 + \or 2% 4 + \or 2% 5 + \or 3% 6 + \or 3% 7 + \or 4% 8 + \or 4% 9 + \or 5% 10 + \or 5% 11 + \or 6% 12 + \or 6% 13 + \or 7% 14 + \or 7% 15 + \or 8% 16 + \or 8% 17 + \or 9% 18 + \or 9% 19 + \fi +} +\def\IntCalc@Tim#1#2{% + \number + \ifcase#2 % 0 + 0% + \or % 1 + #1% + \else % 2-9 + \csname IntCalc@Empty% + \IntCalc@ProcessTim#2#1!% + \fi + \IntCalc@Space +} +\def\IntCalc@ProcessTim#1#2#3{% + \ifx#3!% + \csname IntCalc@TimDigit#2\endcsname#10% + \else + \csname IntCalc@TimDigit#2\csname IntCalc@Param#1% + \@ReturnAfterFi{% + \IntCalc@ProcessTim#1#3% + }% + \fi +} +\def\IntCalc@Temp#1{% + \expandafter\def\csname IntCalc@Param#1\endcsname{% + \endcsname#1% + }% +} +\IntCalc@Temp 0% +\IntCalc@Temp 1% +\IntCalc@Temp 2% +\IntCalc@Temp 3% +\IntCalc@Temp 4% +\IntCalc@Temp 5% +\IntCalc@Temp 6% +\IntCalc@Temp 7% +\IntCalc@Temp 8% +\IntCalc@Temp 9% +\expandafter\def\csname IntCalc@TimDigit0\endcsname#1#2{% + \endcsname + 0#2% +} +\expandafter\def\csname IntCalc@TimDigit1\endcsname#1#2{% + \ifcase#2 % + \endcsname 0#1% + \else + \csname IntCalc@AddDigit#1\endcsname #2% + \fi +} +\def\IntCalc@Temp#1#2{% + \expandafter\def\csname IntCalc@TimDigit#1\endcsname##1{% + \expandafter\IntCalc@TimDigitCarry + \number + \ifcase##1 0% 0 + #2% + \fi + !% + }% +} +\IntCalc@Temp 2{% + \or 2% 1 + \or 4% 2 + \or 6% 3 + \or 8% 4 + \or 10% 5 + \or 12% 6 + \or 14% 7 + \or 16% 8 + \or 18% 9 +} +\IntCalc@Temp 3{% + \or 3% 1 + \or 6% 2 + \or 9% 3 + \or 12% 4 + \or 15% 5 + \or 18% 6 + \or 21% 7 + \or 24% 8 + \or 27% 9 +} +\IntCalc@Temp 4{% + \or 4% 1 + \or 8% 2 + \or 12% 3 + \or 16% 4 + \or 20% 5 + \or 24% 6 + \or 28% 7 + \or 32% 8 + \or 36% 9 +} +\IntCalc@Temp 5{% + \or 5% 1 + \or 10% 2 + \or 15% 3 + \or 20% 4 + \or 25% 5 + \or 30% 6 + \or 35% 7 + \or 40% 8 + \or 45% 9 +} +\IntCalc@Temp 6{% + \or 6% 1 + \or 12% 2 + \or 18% 3 + \or 24% 4 + \or 30% 5 + \or 36% 6 + \or 42% 7 + \or 48% 8 + \or 54% 9 +} +\IntCalc@Temp 7{% + \or 7% 1 + \or 14% 2 + \or 21% 3 + \or 28% 4 + \or 35% 5 + \or 42% 6 + \or 49% 7 + \or 56% 8 + \or 63% 9 +} +\IntCalc@Temp 8{% + \or 8% 1 + \or 16% 2 + \or 24% 3 + \or 32% 4 + \or 40% 5 + \or 48% 6 + \or 56% 7 + \or 64% 8 + \or 72% 9 +} +\IntCalc@Temp 9{% + \or 9% 1 + \or 18% 2 + \or 27% 3 + \or 36% 4 + \or 45% 5 + \or 54% 6 + \or 63% 7 + \or 72% 8 + \or 81% 9 +} +\def\IntCalc@TimDigitCarry#1!{% + \ifnum#1<10 % + \csname IntCalc@AddDigit#1\expandafter\endcsname + \else + \@ReturnAfterFi{% + \IntCalc@@TimDigitCarry#1!% + }% + \fi +} +\def\IntCalc@@TimDigitCarry#1#2!#3{% + \csname IntCalc@DigitCarry#1% + \csname IntCalc@AddDigit#2\endcsname #3% +} +\def\intcalcMul#1#2{% + \number + \expandafter\IntCalc@MulSwitch + \number\number#1\expandafter!% + \number#2!% + \IntCalc@Space +} +\def\IntCalc@MulSwitch#1!#2!{% + \ifnum#1<\z@ + \ifnum#2<\z@ + \ifnum#1<#2 % + \expandafter\IntCalc@Mul\number-#1\expandafter!% + \IntCalc@Gobble#2!% + \else + \expandafter\IntCalc@Mul\number-#2\expandafter!% + \IntCalc@Gobble#1!% + \fi + \else + -% + \ifnum-#1>#2 % + \expandafter\IntCalc@Mul\IntCalc@Gobble#1!#2!% + \else + \expandafter\IntCalc@Mul\number#2\expandafter!% + \IntCalc@Gobble#1!% + \fi + \fi + \else + \ifnum#2<\z@ + -% + \ifnum#1>-#2 % + \expandafter\IntCalc@Mul\number#1\expandafter!% + \IntCalc@Gobble#2!% + \else + \expandafter\IntCalc@Mul\IntCalc@Gobble#2!#1!% + \fi + \else + \ifnum#1>#2 % + \IntCalc@Mul#1!#2!% + \else + \IntCalc@Mul#2!#1!% + \fi + \fi + \fi +} +\def\IntCalc@Mul#1!#2!{% + \ifcase#2 % + 0% + \or + #1% + \or + \csname IntCalc@Empty% + \expandafter\IntCalc@Shl#1!% + \else + \ifnum#2<10 % + \IntCalc@Tim{#1}#2% + \else + \IntCalc@ProcessMul!#2!#1!% + \fi + \fi +} +\def\IntCalc@ProcessMul#1!#2#3!#4!{% + \ifx\IntCalc@Empty#3\IntCalc@Empty + \expandafter\IntCalc@Add\number + #10\expandafter\expandafter\expandafter!% + \IntCalc@Tim{#4}#2!% + \else + \ifx\IntCalc@Empty#1\IntCalc@Empty + \expandafter\expandafter\expandafter\IntCalc@ProcessMul + \IntCalc@Tim{#4}#2!% + #3!#4!% + \else + \expandafter\IntCalc@ProcessMul\number + \expandafter\IntCalc@Add\number% + #10\expandafter\expandafter\expandafter!% + \IntCalc@Tim{#4}#2!!% + #3!#4!% + \fi + \fi +} +\def\intcalcSqr#1{% + \number\expandafter\IntCalc@Sqr\number#1! % +} +\def\IntCalc@Sqr#1#2!{% + \ifx#1-% + \IntCalc@Mul#2!#2!% + \else + \IntCalc@Mul#1#2!#1#2!% + \fi +} +\def\intcalcFac#1{% + \number\expandafter\IntCalc@Fac\number#1! % +} +\def\intcalcPow#1#2{% + \number\expandafter\IntCalc@Pow + \number\number#1\expandafter!% + \number#2! % +} +\def\IntCalc@Pow#1#2!#3#4!{% + \ifcase#3#4 % power = 0 + 1% + \or % power = 1 + #1#2% + \or % power = 2 + \ifx#1-% + \IntCalc@Mul#2!#2!% + \else + \IntCalc@Mul#1#2!#1#2!% + \fi + \else + \ifcase#1#2 % basis = 0, power <> 0 + 0% + \ifx#3-% power < 0 + 0\IntCalcError:DivisionByZero% + \fi + \or + 1% basis = 1 + \else + \ifnum#1#2=\m@ne % basis = -1 + \ifodd#3#4 % + -% + \fi + 1% + \else % |basis| > 1 + \ifx#3-% power < 0 + 0% + \else % power > 2 + \ifx#1-% basis < 0 + \ifodd#3#4 % + -% + \fi + \IntCalc@PowRec#2!#3#4!1!% + \else + \IntCalc@PowRec#1#2!#3#4!1!% + \fi + \fi + \fi + \fi + \fi +} +\def\IntCalc@PowRec#1!#2!#3!{% + \ifnum#2=\@ne + \ifnum#1>#3 % + \IntCalc@Mul#1!#3!% + \else + \IntCalc@Mul#3!#1!% + \fi + \else + \expandafter\IntCalc@PowRec + \number\IntCalc@Mul#1!#1!\expandafter!% + \number\intcalcShr{#2}\expandafter!% + \number + \ifodd#2 % + \ifnum#1>#3 % + \IntCalc@Mul#1!#3!% + \else + \IntCalc@Mul#3!#1!% + \fi + \else + #3% + \fi + \expandafter!% + \fi +} +\def\intcalcDiv#1#2{% + \number\expandafter\IntCalc@Div + \number\number#1\expandafter!% + \number#2! % +} +\def\IntCalc@Div#1!#2!{% + \ifcase#2 % + 0\IntCalcError:DivisionByZero% + \else + \ifcase#1 % + 0% + \else + \expandafter\IntCalc@DivSwitch + \number#1\expandafter!% + \number#2!% + \fi + \fi +} +\def\IntCalc@DivSwitch#1!#2!{% + \ifnum#1<\z@ + \ifnum#2<\z@ + \expandafter\IntCalc@@Div\number-#1\expandafter!% + \IntCalc@Gobble#2!% + \else + -% + \expandafter\IntCalc@@Div\IntCalc@Gobble#1!#2!% + \fi + \else + \ifnum#2<\z@ + -% + \expandafter\IntCalc@@Div\number#1\expandafter!% + \IntCalc@Gobble#2!% + \else + \IntCalc@@Div#1!#2!% + \fi + \fi +} +\def\IntCalc@@Div#1!#2!{% + \ifnum#1>#2 % + \ifcase#2 % 0 already catched +? \IntCalcError:ThisCannotHappen% + \or % 1 + #1% + \or % 2 + \IntCalc@Shr#1!% + \else + \IntCalc@DivStart!#1!#2!#2!% + \fi + \else + \ifnum#1=#2 % + 1% + \else + 0% + \fi + \fi +} +\def\IntCalc@DivStart#1!#2#3!#4#5{% + \ifx#5!% + \@ReturnAfterElseFi{% + \IntCalc@DivStartI{#1#2}#3=!% + }% + \else + \@ReturnAfterFi{% + \IntCalc@DivStart{#1#2}!#3!#5% + }% + \fi +} +\def\IntCalc@DivStartI#1!#2!{% + \expandafter\IntCalc@DivStartII + \number#2\expandafter\expandafter\expandafter!% + \intcalcShl{#2}!% + #1!% +} +\def\IntCalc@DivStartII#1!#2!{% + \expandafter\IntCalc@DivStartIII + \number#1\expandafter!% + \number#2\expandafter\expandafter\expandafter!% + \intcalcShl{#2}!% +} +\def\IntCalc@DivStartIII#1!#2!#3!{% + \expandafter\IntCalc@DivStartIV + \number#1\expandafter!% + \number#2\expandafter!% + \number#3\expandafter!% + \number\IntCalc@Add#3!#2!\expandafter\expandafter\expandafter!% + \intcalcShl{#3}!% +} +\def\IntCalc@DivStartIV#1!#2!#3!#4!#5!#6!{% + \IntCalc@ProcessDiv#6!#1!#2!#3!#4!#5!/% +} +\def\IntCalc@ProcessDiv#1#2#3!#4!#5!#6!#7!#8!#9/{% + #9% + \ifnum#1<#4 % 0 + 0% + \ifx#2=% + \else + \IntCalc@ProcessDiv{#1#2}#3!#4!#5!#6!#7!#8!% + \fi + \else % 1-9 + \ifnum#1<#5 % 1 + 1% + \ifx#2=% + \else + \expandafter\IntCalc@ProcessDiv\expandafter{% + \number\IntCalc@Sub#1!#4!% + #2% + }#3!#4!#5!#6!#7!#8!% + \fi + \else % 2-9 + \ifnum#1<#7 % 2 3 4 5 + \ifnum#1<#6 % 2 3 + \@ReturnAfterElseFi{% + \expandafter\IntCalc@@ProcessDiv + \number\IntCalc@Sub#1!#5!!% + 23% + }% + \else % 4 5 + \@ReturnAfterFi{% + \expandafter\IntCalc@@ProcessDiv + \number\IntCalc@Sub#1!#6!!% + 45% + }% + \fi + #2#3!#4!#5!#6!#7!#8!% + \else % 6 7 8 9 + \ifnum#1<#8 % 6 7 + \@ReturnAfterElseFi{% + \expandafter\IntCalc@@ProcessDiv + \number\IntCalc@Sub#1!#7!!% + 67% + }% + \else % 8 9 + \@ReturnAfterFi{% + \expandafter\IntCalc@@ProcessDiv + \number\IntCalc@Sub#1!#8!!% + 89% + }% + \fi + #2#3!#4!#5!#6!#7!#8!% + \fi + \fi + \fi + \ifx#2=% + \expandafter\IntCalc@Gobble + \fi + /% +} +\def\IntCalc@@ProcessDiv#1!#2#3#4#5!#6!{% + \ifnum#1<#6 % + #2% + \@ReturnAfterElseFi{% + \ifx#4=% + \expandafter\IntCalc@CleanupIV + \else + \@ReturnAfterFi{% + \IntCalc@ProcessDiv{#1#4}#5!#6!% + }% + \fi + }% + \else + #3% + \@ReturnAfterFi{% + \ifx#4=% + \expandafter\IntCalc@CleanupIV + \else + \@ReturnAfterFi{% + \expandafter\IntCalc@ProcessDiv\expandafter{% + \number\IntCalc@Sub#1!#6!\IntCalc@Space + #4% + }#5!#6!% + }% + \fi + }% + \fi +} +\def\IntCalc@CleanupIV#1!#2!#3!#4!{} +\def\intcalcMod#1#2{% + \number\expandafter\IntCalc@Mod + \number\number#1\expandafter!% + \number#2! % +} +\def\IntCalc@Mod#1!#2!{% + \ifcase#2 % + 0\IntCalcError:DivisionByZero% + \else + \ifnum#2<\z@ + -% + \expandafter\IntCalc@Mod + \number-#1\expandafter!% + \number-#2!% + \else + \ifcase#1 % + 0% + \else + \ifcase#2 % 0 already catched +? \IntCalcError:ThisCannotHappen% + \or % 1 + 0% + \or % 2 + \ifodd#1 % + 1% + \else + 0% + \fi + \else + \ifnum#1<\z@ + \expandafter\IntCalc@ModShift + \number-% + \expandafter\IntCalc@Sub + \number\IntCalc@Gobble#1\expandafter!% + \number\intcalcMul{#2}{% + \expandafter\IntCalc@Div\IntCalc@Gobble#1!#2!% + }!% + !#2!% + \else + \expandafter\IntCalc@Sub\number#1\expandafter!% + \number\intcalcMul{#2}{\IntCalc@Div#1!#2!}!% + \fi + \fi + \fi + \fi + \fi +} +\def\IntCalc@ModShift#1!#2!{% + \ifnum#1<\z@ + \expandafter\IntCalc@Sub\number#2\expandafter!% + \IntCalc@Gobble#1!% + \else + #1% + \fi +} +\def\IntCalc@Empty{} +\def\IntCalc@Gobble#1{} +\long\def\@ReturnAfterFi#1\fi{\fi#1}% +\long\def\@ReturnAfterElseFi#1\else#2\fi{\fi#1}% +\IntCalc@AtEnd + + +\endinput +%% +%% End of file `intcalc.sty'. |