summaryrefslogtreecommitdiff
path: root/tex/context/base/math-int.mkiv
blob: 2af471b5cb44c40d4e6427b405291615804039dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
%D \module
%D   [       file=math-int,
%D        version=2007.07.19,
%D          title=\CONTEXT\ Math Macros,
%D       subtitle=Scripts,
%D         author={Hans Hagen \& Taco Hoekwater \& Aditya Mahajan},
%D           date=\currentdate,
%D      copyright=\PRAGMA]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

\writestatus{loading}{ConTeXt Math Macros / Integrals}

\unprotect

%D \startbuffer
%D   $\int_a^b f(x) dx$ and also
%D   $\iint_a^b f(x,y) dxdy$, $\iiint_a^b f(x,y) dxdy$,
%D   $\iiiint_a^b f(x) dx$
%D   \startformula
%D     \int_a^b f(x) dx \quad
%D     \iint_a^b f(x) dx \quad
%D     \iiint_a^b f(x) dx \quad
%D     \iiiint_a^b f(x) dx \quad
%D   \stopformula
%D \stopbuffer
%D
%D Default: \getbuffer
%D
%D Displaylimits: \setupmathematics[integral=displaylimits] \getbuffer
%D
%D Limits: \setupmathematics[integral=limits] \getbuffer

\chardef\intlimitcode\zerocount  % 0 nolimits 1 displaylimits 2 limits

\def\intlimits
  {\ifcase\intlimitcode \nolimits \or \displaylimits \or \limits \fi}

\ifx\v!integral\undefined \def\v!integral{integral} \fi

\appendtoks
   \processaction
      [\mathematicsparameter\v!integral]
      [     nolimits=>\chardef\intlimitcode\zerocount,
       displaylimits=>\chardef\intlimitcode\plusone,
              limits=>\chardef\intlimitcode\plustwo]%
\to \everysetupmathematics

\setupmathematics
  [\v!integral=nolimits]

%D More integrals (AM):

\definemathcommand [iint]   {\repeatintegral\plusone  }
\definemathcommand [iiint]  {\repeatintegral\plustwo  }
\definemathcommand [iiiint] {\repeatintegral\plusthree}

%def\integralrepeatsymbol{\intop}
\def\integralrepeatsymbol{{\int}}

\def\repeatintegral#1%
  {\scratchtoks\emptytoks
   \let\dointlimits\donothing
   \let\dodointlimits\intlimits
   \dorecurse{#1}{\appendtoks \integralrepeatsymbol \dointkern \to \scratchtoks}
   \appendtoks \intop \dointlimits \dodointlimits \to \scratchtoks
   \edef\dodorepeatintegral{\the\scratchtoks}%
   \futurelet\next\dorepeatintegral}

%D If the \type{\limits} option is used after \type{\iint}, use
%D \type{\mathop} and fudge the left hand space a bit to make the
%D subscript visually centered.

\def\dointkern
  {\mkern-6mu\mathchoice{\mkern-3mu}{}{}{}}

\def\dorepeatintegral
   {\ifx\next\limits          \dointlimitcorrection \else
    \ifx\next\displaylimits   \dointlimitcorrection \else
    \ifx\next\nolimits        \donothing            \else
    \ifcase\intlimitcode\else \dointlimitcorrection \fi\fi\fi\fi
    \dodorepeatintegral}

\def\dointlimitcorrection
  {\mkern-7mu\mathchoice{\mkern-2mu}{}{}{}%
   \mathop\bgroup\mkern7mu\mathchoice{\mkern2mu}{}{}{}\let\dointlimits\egroup}

\protect \endinput