Current File : //usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty |
%%
%% 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.
%%
%% Project: intcalc
%% Version: 2019/12/15 v1.3
%%
%% Copyright (C)
%% 2007 Heiko Oberdiek
%% 2016-2019 Oberdiek Package Support Group
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either
%% version 1.3c of this license or (at your option) any later
%% version. This version of this license is in
%% https://www.latex-project.org/lppl/lppl-1-3c.txt
%% and the latest version of this license is in
%% https://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 Maintainers of this work are
%% Heiko Oberdiek and the Oberdiek Package Support Group
%% https://github.com/ho-tex/intcalc/issues
%%
%%
%% The Base Interpreter refers to any `TeX-Format',
%% because some files are installed in TDS:tex/generic//.
%%
%% 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\catcode61\catcode48\catcode32=10\relax%
\catcode13=5 % ^^M
\endlinechar=13 %
\catcode35=6 % #
\catcode39=12 % '
\catcode44=12 % ,
\catcode45=12 % -
\catcode46=12 % .
\catcode58=12 % :
\catcode64=11 % @
\catcode123=1 % {
\catcode125=2 % }
\expandafter\let\expandafter\x\csname ver@intcalc.sty\endcsname
\ifx\x\relax % plain-TeX, first loading
\else
\def\empty{}%
\ifx\x\empty % LaTeX, first loading,
% variable is initialized, but \ProvidesPackage not yet seen
\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}%
\aftergroup\endinput
\fi
\fi
\endgroup%
\begingroup\catcode61\catcode48\catcode32=10\relax%
\catcode13=5 % ^^M
\endlinechar=13 %
\catcode35=6 % #
\catcode39=12 % '
\catcode40=12 % (
\catcode41=12 % )
\catcode44=12 % ,
\catcode45=12 % -
\catcode46=12 % .
\catcode47=12 % /
\catcode58=12 % :
\catcode64=11 % @
\catcode91=12 % [
\catcode93=12 % ]
\catcode123=1 % {
\catcode125=2 % }
\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\@undefined
\xdef#1{#3}%
\fi
\ifx#1\relax
\xdef#1{#3}%
\fi
}%
\fi
\expandafter\x\csname ver@intcalc.sty\endcsname
\ProvidesPackage{intcalc}%
[2019/12/15 v1.3 Expandable calculations with integers (HO)]%
\begingroup\catcode61\catcode48\catcode32=10\relax%
\catcode13=5 % ^^M
\endlinechar=13 %
\catcode123=1 % {
\catcode125=2 % }
\catcode64=11 % @
\def\x{\endgroup
\expandafter\edef\csname InCa@AtEnd\endcsname{%
\endlinechar=\the\endlinechar\relax
\catcode13=\the\catcode13\relax
\catcode32=\the\catcode32\relax
\catcode35=\the\catcode35\relax
\catcode61=\the\catcode61\relax
\catcode64=\the\catcode64\relax
\catcode123=\the\catcode123\relax
\catcode125=\the\catcode125\relax
}%
}%
\x\catcode61\catcode48\catcode32=10\relax%
\catcode13=5 % ^^M
\endlinechar=13 %
\catcode35=6 % #
\catcode64=11 % @
\catcode123=1 % {
\catcode125=2 % }
\def\TMP@EnsureCode#1#2{%
\edef\InCa@AtEnd{%
\InCa@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{62}{12}% >
\TMP@EnsureCode{63}{14}% ? (comment!)
\edef\InCa@AtEnd{\InCa@AtEnd\noexpand\endinput}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname InCa@TestMode\endcsname\relax
\else
\catcode63=9 % ? (ignore)
\fi
? \let\InCa@@TestMode\InCa@TestMode
\def\InCa@Abs#1#2!{%
\ifx#1-%
#2%
\else
#1#2%
\fi
}
\def\InCa@Sgn#1#2!{%
\ifx#1-%
-1%
\else
\ifx#10%
0%
\else
1%
\fi
\fi
}
\def\InCa@Min#1!#2!{%
\ifnum#1<#2 %
#1%
\else
#2%
\fi
}
\def\InCa@Max#1!#2!{%
\ifnum#1>#2 %
#1%
\else
#2%
\fi
}
\def\InCa@Cmp#1!#2!{%
\ifnum#1=#2 %
0%
\else
\ifnum#1<#2 %
-%
\fi
1%
\fi
}
\def\InCa@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\intcalcNum#1{%
\the\numexpr#1\relax
}%
\def\intcalcInv#1{%
\number-\intcalcNum{#1} %
}%
\def\intcalcAbs#1{%
\number\expandafter\InCa@Abs\the\numexpr#1! %
}%
\def\intcalcSgn#1{%
\number\expandafter\InCa@Sgn\the\numexpr#1! %
}%
\def\intcalcMin#1#2{%
\number\expandafter\InCa@Min
\the\numexpr#1\expandafter!%
\the\numexpr#2! %
}%
\def\intcalcMax#1#2{%
\number\expandafter\InCa@Max
\the\numexpr#1\expandafter!%
\the\numexpr#2! %
}%
\def\intcalcCmp#1#2{%
\number\expandafter\InCa@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\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\IntCalcAdd#1!#2!{%
\the\numexpr#1+#2\relax
}%
\def\IntCalcSub#1!#2!{%
\the\numexpr#1-#2\relax
}%
\def\intcalcShl#1{%
\the\numexpr(#1)*2\relax
}%
\def\intcalcShr#1{%
\number\expandafter\InCa@Shr\the\numexpr#1! %
}%
\def\IntCalcShl#1!{%
\the\numexpr#1*2\relax
}%
\def\IntCalcShr#1!{%
\the\numexpr\ifodd#1 (#1-1)\else#1\fi/2\relax
}%
\def\InCa@Shr#1#2!{%
\ifx#1-%
-\InCa@Shr#2!%
\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\IntCalcMul#1!#2!{%
\the\numexpr#1*#2\relax
}%
\def\intcalcSqr#1{%
\number\expandafter\InCa@Sqr\the\numexpr#1! %
}%
\def\InCa@Sqr#1!{%
\the\numexpr#1*#1\relax
}%
\def\intcalcFac#1{%
\number\expandafter\InCa@Fac\the\numexpr#1! %
}%
\def\intcalcPow#1#2{%
\number\expandafter\InCa@Pow
\the\numexpr#1\expandafter!%
\the\numexpr#2! %
}%
\def\InCa@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
\InCa@PowRec#1#2!#3#4!1!%
\fi
\fi
\fi
\fi
}%
\def\InCa@PowRec#1!#2!#3!{%
\ifnum#2=\@ne
\the\numexpr#1*#3\relax
\else
\ifodd#2 %
\expandafter\InCa@PowRec
\the\numexpr#1*#1\expandafter!%
\the\numexpr(#2-1)/2\expandafter!%
\the\numexpr#1*#3\expandafter\expandafter\expandafter!%
\else
\expandafter\InCa@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\InCa@Div
\the\numexpr#1\expandafter!%
\the\numexpr#2! %
}%
\def\InCa@Div#1!#2!{%
\ifcase#2 %
0\IntCalcError:DivisionByZero%
\else
\ifcase#1 %
0%
\else
\expandafter\InCa@@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\InCa@Temp#1{%
\def\IntCalcDiv##1!##2!{%
\number
\ifcase##2 %
0\IntCalcError:DivisionByZero%
\else
\ifcase##1 %
0%
\else
\the\numexpr(##1-(##2-1)/2)/##2\relax
\fi
\fi
#1%
}%
}%
\InCa@Temp{ }%
\def\InCa@@Div#1#2!#3#4!{%
#1#3%
\the\numexpr(#2-(#4-1)/2)/#4\relax
}%
\def\intcalcMod#1#2{%
\number\expandafter\InCa@Mod
\the\numexpr#1\expandafter!%
\the\numexpr#2! %
}%
\def\InCa@Mod#1!#2!{%
\ifcase#2 %
0\IntCalcError:DivisionByZero%
\else
\ifcase#1 %
0%
\else
\expandafter\InCa@@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\InCa@Temp#1{%
\def\IntCalcMod##1!##2!{%
\number
\ifcase##2 %
0\IntCalcError:DivisionByZero%
\else
\ifcase##1 %
0%
\else
\the\numexpr##1-(##1-(##2-1)/2)/##2*##2\relax
\fi
\fi
#1%
}%
}%
\InCa@Temp{ }%
\def\InCa@@Mod#1#2!#3#4!{%
\if#3+%
\if#1+%
\the\numexpr#2-\InCa@@Div+#2!+#4!*#4\relax
\else
\expandafter\InCa@ModX
\the\numexpr-#2+\InCa@@Div+#2!+#4!*#4!#4!%
\fi
\else
-%
\if#1+%
\expandafter\InCa@ModX
\the\numexpr-#2+\InCa@@Div+#2!+#4!*#4!#4!%
\else
\the\numexpr#2-\InCa@@Div+#2!+#4!*#4\relax
\fi
\fi
}%
\def\InCa@ModX#1!#2!{%
\ifcase#1 %
0%
\else
\the\numexpr#1+#2\relax
\fi
}%
\expandafter\InCa@AtEnd
\fi%
\def\intcalcNum#1{%
\number\expandafter\InCa@FirstOfOne\number#1! %
}
\def\intcalcInv#1{%
\number\expandafter\InCa@FirstOfOne\number-#1! %
}
\def\InCa@FirstOfOne#1!{#1}
\def\intcalcAbs#1{%
\number\expandafter\InCa@Abs\number#1! %
}
\def\intcalcSgn#1{%
\number\expandafter\InCa@Sgn\number#1! %
}
\def\intcalcMin#1#2{%
\number\expandafter\InCa@Min
\number\number#1\expandafter!\number#2! %
}
\def\intcalcMax#1#2{%
\number\expandafter\InCa@Max
\number\number#1\expandafter!\number#2! %
}
\def\intcalcCmp#1#2{%
\number\expandafter\InCa@Cmp
\number\number#1\expandafter!\number#2! %
}%
\def\intcalcInc#1{%
\number\expandafter\InCa@IncSwitch\number#1! %
}
\def\InCa@IncSwitch#1#2!{%
\ifx#1-%
-%
\csname InCa@Empty%
\InCa@Dec#2!%
\else
\csname InCa@Empty%
\InCa@Inc#1#2!%
\fi
}
\def\intcalcDec#1{%
\number\expandafter\InCa@DecSwitch\number#1! %
}
\def\InCa@DecSwitch#1#2!{%
\ifx#1-%
-%
\csname InCa@Empty%
\expandafter\InCa@Inc#2!%
\else
\ifx#10%
-1%
\else
\csname InCa@Empty%
\InCa@Dec#1#2!%
\fi
\fi
}
\def\IntCalcInc#1!{%
\number\csname InCa@Empty\InCa@Inc#1! %
}
\def\IntCalcDec#1!{%
\number\csname InCa@Empty\InCa@Dec#1! %
}
\def\InCa@Inc#1#2{%
\ifx#2!%
\csname InCa@IncDigit#1\endcsname1%
\else
\csname InCa@IncDigit#1%
\expandafter\InCa@Inc\expandafter#2%
\fi
}
\def\InCa@Temp#1#2{%
\expandafter\def\csname InCa@IncDigit#1\endcsname##1{%
\endcsname
0%
\ifcase##1 %
#1%
\else
#2%
\fi
}%
}
\InCa@Temp 01
\InCa@Temp 12
\InCa@Temp 23
\InCa@Temp 34
\InCa@Temp 45
\InCa@Temp 56
\InCa@Temp 67
\InCa@Temp 78
\InCa@Temp 89
\expandafter\def\csname InCa@IncDigit9\endcsname#1{%
\expandafter\endcsname
\ifcase#1 %
09%
\else
10%
\fi
}
\def\InCa@Dec#1#2{%
\ifx#2!%
\csname InCa@DecDigit#1\endcsname1%
\else
\csname InCa@DecDigit#1%
\expandafter\InCa@Dec\expandafter#2%
\fi
}
\def\InCa@Temp#1#2{%
\expandafter\def\csname InCa@DecDigit#1\endcsname##1{%
\endcsname
0%
\ifcase##1 %
#1%
\else
#2%
\fi
}%
}
\InCa@Temp 98
\InCa@Temp 87
\InCa@Temp 76
\InCa@Temp 65
\InCa@Temp 54
\InCa@Temp 43
\InCa@Temp 32
\InCa@Temp 21
\InCa@Temp 10
\expandafter\def\csname InCa@DecDigit0\endcsname#1{%
\expandafter\endcsname
\ifcase#1 %
00%
\else
19%
\fi
}
\def\intcalcAdd#1#2{%
\number
\expandafter\InCa@AddSwitch
\number\number#1\expandafter!%
\number#2! %
}
\def\intcalcSub#1#2{%
\number
\expandafter\InCa@AddSwitch
\number\number#1\expandafter!%
\number-\number#2! %
}
\def\InCa@AddSwitch#1!#2!{%
\ifnum#1<\z@
\ifnum#2<\z@
-%
\ifnum#1<#2 %
\expandafter\InCa@Add\number-#1\expandafter!%
\@gobble#2!%
\else
\expandafter\InCa@Add\number-#2\expandafter!%
\@gobble#1!%
\fi
\else
\ifnum-#1>#2 %
-%
\expandafter\InCa@Sub\@gobble#1!#2!%
\else
\expandafter\InCa@Sub\number#2\expandafter!%
\@gobble#1!%
\fi
\fi
\else
\ifnum#2<\z@
\ifnum#1>-#2 %
\expandafter\InCa@Sub\number#1\expandafter!%
\@gobble#2!%
\else
-%
\expandafter\InCa@Sub\@gobble#2!#1!%
\fi
\else
\ifnum#1>#2 %
\InCa@Add#1!#2!%
\else
\InCa@Add#2!#1!%
\fi
\fi
\fi
}
\def\IntCalcAdd#1!#2!{%
\number\InCa@Add#1!#2! %
}
\def\IntCalcSub#1!#2!{%
\number\InCa@Sub#1!#2! %
}
\begingroup
\def\x#1{\endgroup
\let\InCa@Space= #1%
}%
\x{ }
\def\InCa@Add#1!#2!{%
\ifcase#2 %
#1%
\else
\InCa@@Add#1!#2!000000000\InCa@Space
\fi
}
\def\InCa@Sub#1!#2!{%
\ifnum#1=#2 %
0%
\else
\InCa@@Sub#1!#2!000000000\InCa@Space
\fi
}
\def\InCa@@Add#1!#2#3!{%
\ifx\InCa@Empty#3\InCa@Empty
\@ReturnAfterElseFi{%
\InCa@@@Add!!#1!#2%
}%
\else
\@ReturnAfterFi{%
\InCa@@Add#1!#3!#2%
}%
\fi
}
\def\InCa@@Sub#1!#2#3!{%
\ifx\InCa@Empty#3\InCa@Empty
\@ReturnAfterElseFi{%
\InCa@@@Sub!!#1!#2%
}%
\else
\@ReturnAfterFi{%
\InCa@@Sub#1!#3!#2%
}%
\fi
}
\def\InCa@@@Add#1!#2!#3#4!#5{%
\ifx\InCa@Empty#4\InCa@Empty
\csname InCa@Empty%
\@ReturnAfterElseFi{%
\InCa@ProcessAdd#1#3!#5#2%
}%
\else
\@ReturnAfterFi{%
\InCa@@@Add#1#3!#5#2!#4!%
}%
\fi
}
\def\InCa@@@Sub#1!#2!#3#4!#5{%
\ifx\InCa@Empty#4\InCa@Empty
\csname @gobble%
\@ReturnAfterElseFi{%
\InCa@ProcessSub#1#3!#5#2%
}%
\else
\@ReturnAfterFi{%
\InCa@@@Sub#1#3!#5#2!#4!%
}%
\fi
}
\def\InCa@ProcessAdd#1#2!#3#4{%
\ifx\InCa@Empty#2\InCa@Empty
\csname InCa@AddDigit#1\endcsname#3%
\romannumeral0#4%
\else
\csname InCa@AddDigit#1\csname InCa@DigitCarry#3%
\@ReturnAfterFi{%
\InCa@ProcessAdd#2!#4%
}%
\fi
}
\def\InCa@ProcessSub#1#2!#3#4{%
\ifx\InCa@Empty#2\InCa@Empty
\csname InCa@SubDigit#1\endcsname#3%
\romannumeral0#4%
\else
\csname InCa@SubDigit#1\csname InCa@DigitCarry#3%
\@ReturnAfterFi{%
\InCa@ProcessSub#2!#4%
}%
\fi
}
\def\InCa@Temp#1#2{%
\expandafter\def\csname InCa@DigitCarry#1\endcsname##1{%
\ifcase##1 %
\endcsname#1%
\else
\endcsname#2%
\fi
}%
}
\InCa@Temp 01
\InCa@Temp 12
\InCa@Temp 23
\InCa@Temp 34
\InCa@Temp 45
\InCa@Temp 56
\InCa@Temp 67
\InCa@Temp 78
\InCa@Temp 89
\InCa@Temp 9{{10}}
\expandafter\def\csname InCa@AddDigit0\endcsname#1{%
\ifnum#1>9 %
\endcsname10%
\else
\endcsname0#1%
\fi
}
\def\InCa@Temp#1#2#3{%
\expandafter\def\csname InCa@AddDigit#1\endcsname##1{%
\ifnum##1>#2 %
\endcsname 1%
\else
\endcsname 0%
\fi
\ifcase##1 #1% 0
#3%
\else #1% 10
\fi
}%
}
\InCa@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
}%
\InCa@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
}%
\InCa@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
}%
\InCa@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
}%
\InCa@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
}%
\InCa@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
}%
\InCa@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
}%
\InCa@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
}%
\InCa@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\InCa@Temp#1#2{%
\expandafter\def\csname InCa@SubDigit#1\endcsname##1{%
\ifnum##1>#1 %
\endcsname 1%
\else
\endcsname 0%
\fi
\ifcase##1 #1% 0
#2%
\else #1% 10
\fi
}%
}
\InCa@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
}
\InCa@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
}
\InCa@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
}
\InCa@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
}
\InCa@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
}
\InCa@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
}
\InCa@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
}
\InCa@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
}
\InCa@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
}
\InCa@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\InCa@ShlSwitch\number#1! %
}
\def\InCa@ShlSwitch#1#2!{%
\ifx#1-%
-\csname InCa@Empty%
\InCa@Shl#2!%
\else
\csname InCa@Empty%
\InCa@Shl#1#2!%
\fi
}
\def\IntCalcShl#1!{%
\number
\csname InCa@Empty%
\InCa@Shl#1! %
}
\def\InCa@Shl#1#2{%
\ifx#2!%
\csname InCa@ShlDigit#1\endcsname0%
\else
\csname InCa@ShlDigit#1%
\@ReturnAfterFi{%
\InCa@Shl#2%
}%
\fi
}
\expandafter\def\csname InCa@ShlDigit0\endcsname{%
\endcsname0%
}
\def\InCa@Temp#1#2#3#4#5{%
\expandafter\def\csname InCa@ShlDigit#1\endcsname##1{%
\expandafter\endcsname
\ifcase##1 %
#2#3%
\else
#4#5%
\fi
}%
}
\InCa@Temp 10203
\InCa@Temp 20405
\InCa@Temp 30607
\InCa@Temp 40809
\InCa@Temp 51011
\InCa@Temp 61213
\InCa@Temp 71415
\InCa@Temp 81617
\InCa@Temp 91819
\def\intcalcShr#1{%
\number\expandafter\InCa@ShrSwitch\number#1! %
}
\def\InCa@ShrSwitch#1#2!{%
\ifx#1-%
-\InCa@Shr#2!%
\else
\InCa@Shr#1#2!%
\fi
}
\def\IntCalcShr#1!{%
\number\InCa@Shr#1! %
}
\def\InCa@Shr#1#2{%
\InCa@ShrDigit#1!%
\ifx#2!%
\else
\@ReturnAfterFi{%
\ifodd#1 %
\@ReturnAfterElseFi{%
\InCa@Shr{1#2}%
}%
\else
\expandafter\InCa@Shr\expandafter#2%
\fi
}%
\fi
}
\def\InCa@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\InCa@Temp#1{%
\def\InCa@Tim##1##2{%
\number
\ifcase##2 % 0
0%
\or % 1
##1%
\else % 2-9
\csname InCa@Empty%
\InCa@ProcessTim##2##1!%
\fi
#1%
}%
}
\InCa@Temp{ }
\def\InCa@ProcessTim#1#2#3{%
\ifx#3!%
\csname InCa@TimDigit#2\endcsname#10%
\else
\csname InCa@TimDigit#2\csname InCa@Param#1%
\@ReturnAfterFi{%
\InCa@ProcessTim#1#3%
}%
\fi
}
\def\InCa@Temp#1{%
\expandafter\def\csname InCa@Param#1\endcsname{%
\endcsname#1%
}%
}
\InCa@Temp 0%
\InCa@Temp 1%
\InCa@Temp 2%
\InCa@Temp 3%
\InCa@Temp 4%
\InCa@Temp 5%
\InCa@Temp 6%
\InCa@Temp 7%
\InCa@Temp 8%
\InCa@Temp 9%
\expandafter\def\csname InCa@TimDigit0\endcsname#1#2{%
\endcsname
0#2%
}
\expandafter\def\csname InCa@TimDigit1\endcsname#1#2{%
\ifcase#2 %
\endcsname 0#1%
\else
\csname InCa@AddDigit#1\endcsname #2%
\fi
}
\def\InCa@Temp#1#2{%
\expandafter\def\csname InCa@TimDigit#1\endcsname##1{%
\expandafter\InCa@TimDigitCarry
\number
\ifcase##1 0% 0
#2%
\fi
!%
}%
}
\InCa@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
}
\InCa@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
}
\InCa@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
}
\InCa@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
}
\InCa@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
}
\InCa@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
}
\InCa@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
}
\InCa@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\InCa@TimDigitCarry#1!{%
\ifnum#1<10 %
\csname InCa@AddDigit#1\expandafter\endcsname
\else
\@ReturnAfterFi{%
\InCa@@TimDigitCarry#1!%
}%
\fi
}
\def\InCa@@TimDigitCarry#1#2!#3{%
\csname InCa@DigitCarry#1%
\csname InCa@AddDigit#2\endcsname #3%
}
\def\intcalcMul#1#2{%
\number
\expandafter\InCa@MulSwitch
\number\number#1\expandafter!%
\number#2! %
}
\def\InCa@MulSwitch#1!#2!{%
\ifnum#1<\z@
\ifnum#2<\z@
\ifnum#1<#2 %
\expandafter\InCa@Mul\number-#1\expandafter!%
\@gobble#2!%
\else
\expandafter\InCa@Mul\number-#2\expandafter!%
\@gobble#1!%
\fi
\else
-%
\ifnum-#1>#2 %
\expandafter\InCa@Mul\@gobble#1!#2!%
\else
\expandafter\InCa@Mul\number#2\expandafter!%
\@gobble#1!%
\fi
\fi
\else
\ifnum#2<\z@
-%
\ifnum#1>-#2 %
\expandafter\InCa@Mul\number#1\expandafter!%
\@gobble#2!%
\else
\expandafter\InCa@Mul\@gobble#2!#1!%
\fi
\else
\ifnum#1>#2 %
\InCa@Mul#1!#2!%
\else
\InCa@Mul#2!#1!%
\fi
\fi
\fi
}
\def\IntCalcMul#1!#2!{%
\number\InCa@Mul#1!#2! %
}
\def\InCa@Mul#1!#2!{%
\ifcase#2 %
0%
\or
#1%
\or
\csname InCa@Empty%
\expandafter\InCa@Shl#1!%
\else
\ifnum#2<10 %
\InCa@Tim{#1}#2%
\else
\InCa@ProcessMul!#2!#1!%
\fi
\fi
}
\def\InCa@ProcessMul#1!#2#3!#4!{%
\ifx\InCa@Empty#3\InCa@Empty
\expandafter\InCa@Add\number
#10\expandafter\expandafter\expandafter!%
\InCa@Tim{#4}#2!%
\else
\ifx\InCa@Empty#1\InCa@Empty
\expandafter\expandafter\expandafter\InCa@ProcessMul
\InCa@Tim{#4}#2!%
#3!#4!%
\else
\expandafter\InCa@ProcessMul\number
\expandafter\InCa@Add\number%
#10\expandafter\expandafter\expandafter!%
\InCa@Tim{#4}#2!!%
#3!#4!%
\fi
\fi
}
\def\intcalcSqr#1{%
\number\expandafter\InCa@Sqr\number#1! %
}
\def\InCa@Sqr#1#2!{%
\ifx#1-%
\InCa@Mul#2!#2!%
\else
\InCa@Mul#1#2!#1#2!%
\fi
}
\def\intcalcFac#1{%
\number\expandafter\InCa@Fac\number#1! %
}
\def\intcalcPow#1#2{%
\number\expandafter\InCa@Pow
\number\number#1\expandafter!%
\number#2! %
}
\def\InCa@Pow#1#2!#3#4!{%
\ifcase#3#4 % power = 0
1%
\or % power = 1
#1#2%
\or % power = 2
\ifx#1-%
\InCa@Mul#2!#2!%
\else
\InCa@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
\InCa@PowRec#2!#3#4!1!%
\else
\InCa@PowRec#1#2!#3#4!1!%
\fi
\fi
\fi
\fi
\fi
}
\def\InCa@PowRec#1!#2!#3!{%
\ifnum#2=\@ne
\ifnum#1>#3 %
\InCa@Mul#1!#3!%
\else
\InCa@Mul#3!#1!%
\fi
\else
\expandafter\InCa@PowRec
\number\InCa@Mul#1!#1!\expandafter!%
\number\intcalcShr{#2}\expandafter!%
\number
\ifodd#2 %
\ifnum#1>#3 %
\InCa@Mul#1!#3!%
\else
\InCa@Mul#3!#1!%
\fi
\else
#3%
\fi
\expandafter!%
\fi
}
\def\intcalcDiv#1#2{%
\number\expandafter\InCa@Div
\number\number#1\expandafter!%
\number#2! %
}
\def\InCa@Div#1!#2!{%
\ifcase#2 %
0\IntCalcError:DivisionByZero%
\else
\ifcase#1 %
0%
\else
\expandafter\InCa@DivSwitch
\number#1\expandafter!%
\number#2!%
\fi
\fi
}
\def\InCa@Temp#1{%
\def\IntCalcDiv##1!##2!{%
\number
\ifcase##2 %
0\IntCalcError:DivisionByZero%
\else
\ifcase##1 %
0%
\else
\InCa@@Div##1!##2!%
\fi
\fi
#1%
}%
}
\InCa@Temp{ }%
\def\InCa@DivSwitch#1!#2!{%
\ifnum#1<\z@
\ifnum#2<\z@
\expandafter\InCa@@Div\number-#1\expandafter!%
\@gobble#2!%
\else
-%
\expandafter\InCa@@Div\@gobble#1!#2!%
\fi
\else
\ifnum#2<\z@
-%
\expandafter\InCa@@Div\number#1\expandafter!%
\@gobble#2!%
\else
\InCa@@Div#1!#2!%
\fi
\fi
}
\def\InCa@@Div#1!#2!{%
\ifnum#1>#2 %
\ifcase#2 % 0 already catched
? \IntCalcError:ThisCannotHappen%
\or % 1
#1%
\or % 2
\InCa@Shr#1!%
\else
\InCa@DivStart!#1!#2!#2!%
\fi
\else
\ifnum#1=#2 %
1%
\else
0%
\fi
\fi
}
\def\InCa@DivStart#1!#2#3!#4#5{%
\ifx#5!%
\@ReturnAfterElseFi{%
\InCa@DivStartI{#1#2}#3=!%
}%
\else
\@ReturnAfterFi{%
\InCa@DivStart{#1#2}!#3!#5%
}%
\fi
}
\def\InCa@DivStartI#1!#2!{%
\expandafter\InCa@DivStartII
\number#2\expandafter\expandafter\expandafter!%
\intcalcShl{#2}!%
#1!%
}
\def\InCa@DivStartII#1!#2!{%
\expandafter\InCa@DivStartIII
\number#1\expandafter!%
\number#2\expandafter\expandafter\expandafter!%
\intcalcShl{#2}!%
}
\def\InCa@DivStartIII#1!#2!#3!{%
\expandafter\InCa@DivStartIV
\number#1\expandafter!%
\number#2\expandafter!%
\number#3\expandafter!%
\number\InCa@Add#3!#2!\expandafter\expandafter\expandafter!%
\intcalcShl{#3}!%
}
\def\InCa@DivStartIV#1!#2!#3!#4!#5!#6!{%
\InCa@ProcessDiv#6!#1!#2!#3!#4!#5!/%
}
\def\InCa@ProcessDiv#1#2#3!#4!#5!#6!#7!#8!#9/{%
#9%
\ifnum#1<#4 % 0
0%
\ifx#2=%
\else
\InCa@ProcessDiv{#1#2}#3!#4!#5!#6!#7!#8!%
\fi
\else % 1-9
\ifnum#1<#5 % 1
1%
\ifx#2=%
\else
\expandafter\InCa@ProcessDiv\expandafter{%
\number\InCa@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\InCa@@ProcessDiv
\number\InCa@Sub#1!#5!!%
23%
}%
\else % 4 5
\@ReturnAfterFi{%
\expandafter\InCa@@ProcessDiv
\number\InCa@Sub#1!#6!!%
45%
}%
\fi
#2#3!#4!#5!#6!#7!#8!%
\else % 6 7 8 9
\ifnum#1<#8 % 6 7
\@ReturnAfterElseFi{%
\expandafter\InCa@@ProcessDiv
\number\InCa@Sub#1!#7!!%
67%
}%
\else % 8 9
\@ReturnAfterFi{%
\expandafter\InCa@@ProcessDiv
\number\InCa@Sub#1!#8!!%
89%
}%
\fi
#2#3!#4!#5!#6!#7!#8!%
\fi
\fi
\fi
\ifx#2=%
\expandafter\@gobble
\fi
/%
}
\def\InCa@@ProcessDiv#1!#2#3#4#5!#6!{%
\ifnum#1<#6 %
#2%
\@ReturnAfterElseFi{%
\ifx#4=%
\expandafter\InCa@CleanupIV
\else
\@ReturnAfterFi{%
\InCa@ProcessDiv{#1#4}#5!#6!%
}%
\fi
}%
\else
#3%
\@ReturnAfterFi{%
\ifx#4=%
\expandafter\InCa@CleanupIV
\else
\@ReturnAfterFi{%
\expandafter\InCa@ProcessDiv\expandafter{%
\number\InCa@Sub#1!#6! %
#4%
}#5!#6!%
}%
\fi
}%
\fi
}
\def\InCa@CleanupIV#1!#2!#3!#4!{}
\def\intcalcMod#1#2{%
\number\expandafter\InCa@Mod
\number\number#1\expandafter!%
\number#2! %
}
\def\InCa@Mod#1!#2!{%
\ifcase#2 %
0\IntCalcError:DivisionByZero%
\else
\ifnum#2<\z@
-%
\expandafter\InCa@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\InCa@ModShift
\number-%
\expandafter\InCa@Sub
\number\@gobble#1\expandafter!%
\number\intcalcMul{#2}{%
\expandafter\InCa@Div\@gobble#1!#2!%
}!%
!#2!%
\else
\expandafter\InCa@Sub\number#1\expandafter!%
\number\intcalcMul{#2}{\InCa@Div#1!#2!}!%
\fi
\fi
\fi
\fi
\fi
}
\def\InCa@Temp#1{%
\def\IntCalcMod##1!##2!{%
\number
\ifcase##2 %
0\IntCalcError:DivisionByZero%
\else
\ifcase##1 %
0%
\else
\ifcase##2 % 0 already catched
? \IntCalcError:ThisCannotHappen
\or % 1
0%
\or % 2
\ifodd ##1 1\else 0\fi
\else
\expandafter\InCa@Sub\number##1\expandafter!%
\number\intcalcMul{##2}{\InCa@Div##1!##2!}!%
\fi
\fi
\fi
#1%
}%
}
\InCa@Temp{ }%
\def\InCa@ModShift#1!#2!{%
\ifnum#1<\z@
\expandafter\InCa@Sub\number#2\expandafter!%
\@gobble#1!%
\else
#1%
\fi
}
\def\InCa@Empty{}
\expandafter\ifx\csname @gobble\endcsname\relax
\long\def\@gobble#1{}%
\fi
\long\def\@ReturnAfterFi#1\fi{\fi#1}%
\long\def\@ReturnAfterElseFi#1\else#2\fi{\fi#1}%
\InCa@AtEnd%
%% \section{Installation}
\endinput
%%
%% End of file `intcalc.sty'.