summaryrefslogtreecommitdiff
path: root/tex/context/base/math-int.mkiv
blob: 9bb7b1a143c08667b5bf76cf9e5ee940a14cca2e (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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
%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):

%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}

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

\def\fakerepeatintegral#1%
  {\scratchtoks\emptytoks
   \dorecurse{#1}{\appendtoks \integralrepeatsymbol \dointkern \to \scratchtoks}%
   \appendtoks \intop \dointlimits \dodointlimits \to \scratchtoks
   \edef\dodorepeatintegral{\the\scratchtoks}}

\def\repeatintegral#1#2#3%
  {\let\dointlimits\donothing
   \let\dodointlimits\intlimits
   \iffontchar\textfont\zerocount#1\relax
    %\edef\dodorepeatintegral{\utfchar{#1}}%
     \let\dodorepeatintegral#2%
   \else
     \fakerepeatintegral{#3}%
   \fi
   \futurelet\next\dorepeatintegral}

% This is a temporary solution, as we will make a virtual glyph in lm.

\definemathcommand [iint]   {\repeatintegral{"222B}\normaliint  \plusone  }
\definemathcommand [iiint]  {\repeatintegral{"222C}\normaliiint \plustwo  }
\definemathcommand [iiiint] {\repeatintegral{"222D}\normaliiiint\plusthree}

%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