math-del.mkxl /size: 5722 b    last modification: 2024-01-16 09:02
1%D \module
2%D   [       file=math-del,
3%D        version=2007.07.19,
4%D          title=\CONTEXT\ Math Macros,
5%D       subtitle=Delimiters,
6%D         author=Hans Hagen,
7%D           date=\currentdate,
8%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
9%C
10%C This module is part of the \CONTEXT\ macro||package and is
11%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
12%C details.
13
14\writestatus{loading}{ConTeXt Math Macros / Delimiters}
15
16\unprotect
17
18%D Old code that will be redone:
19%D
20%D \macros
21%D   {checkdelimiters, fakeleftdelimiter, fakerightdelimiter}
22%D
23%D Handy for non matching situations (as with mathml):
24%D
25%D \starttyping
26%D \checkdelimiters{... bla bla ...}
27%D \fakeleftdelimiter
28%D  ... bla bla ...
29%D \fakerightdelimiter
30%D \stoptyping
31
32% Actually we can do better now with lua hacks.
33
34\newinteger\c_math_delimiter_nesting
35
36\permanent\protected\def\leftfakedelimiter {\advanceby\c_math_delimiter_nesting\minusone\gobbleoneargument}
37\permanent\protected\def\rightfakedelimiter{\advanceby\c_math_delimiter_nesting\plusone \gobbleoneargument}
38
39\permanent\protected\def\checkdelimiters#1%
40  {\c_math_delimiter_nesting\zerocount
41   \setbox\scratchbox\hbox\bgroup
42     \let\left \leftfakedelimiter
43     \let\right\rightfakedelimiter
44     \normalstartimath#1\expandafter\normalstopimath\expandafter
45   \egroup
46   \expandafter\c_math_delimiter_nesting\the\c_math_delimiter_nesting\relax}
47
48\permanent\protected\def\fakeleftdelimiter {\ifnum\c_math_delimiter_nesting>\zerocount\left .\fi}
49\permanent\protected\def\fakerightdelimiter{\ifnum\c_math_delimiter_nesting<\zerocount\right.\fi}
50
51%D The following macros are used in the MathML interpreter, so there is a good
52%D change of them never being documented for other usage.
53
54\aliased\let\normalordelimiter\secondoftwoarguments
55\aliased\let\normalorfiller   \firstoftwoarguments
56
57\permanent\protected\def\enabledelimiter {\enforced\let\normalordelimiter\secondoftwoarguments}
58\permanent\protected\def\disabledelimiter{\enforced\let\normalordelimiter\firstoftwoarguments}
59
60\permanent\protected\def\enablefiller    {\enforced\let\normalorfiller\secondoftwoarguments}
61\permanent\protected\def\disablefiller   {\enforced\let\normalorfiller\firstoftwoarguments}
62
63\permanent\protected\def\mathopnolimits#1{\mathop{\mathrm#1}\nolimits} % was \rm, which follows text fonts (used in mml parser, check!)
64\permanent\protected\def\mathopdolimits#1{\mathop{\mathrm#1}}          % was \rm, which follows text fonts (used in mml parser, check!)
65
66% A new experiment:
67
68% Hm, we already have \definemathextensible so we need to preserve that one. We now
69% use \definemathdelimiter. This mechanism will probably disappear so don't use it!
70
71\installcorenamespace {mathdelimiter}
72
73\installcommandhandler \??mathdelimiter {mathdelimiter} \??mathdelimiter
74
75\aliased\let\setupmathdelimiters\setupmathdelimiter
76
77\setupmathdelimiters
78  [\c!symbol=0,
79   \c!define=\v!yes,
80   \c!factor=1.5,
81   \c!axis=\v!yes,
82 % \c!exact=\v!yes
83   \c!height=\exheight,
84   \c!depth=\exheight]
85
86\appendtoks
87    \ifcstok{\mathdelimiterparameter\c!define}\v!yes
88        % we can intercept auto here
89        \frozen\instance\protected\edefcsname\currentmathdelimiter\endcsname{\mathdelimiter[\currentmathdelimiter]}%
90    \fi
91\to \everydefinemathdelimiter
92
93\permanent\tolerant\protected\def\mathdelimiter[#1]#*[#S#2]% so not really used (for now)
94  {\mathop
95     {\cdef\currentmathdelimiter{#1}%
96      \ifempty{#2}%
97        \edef\p_factor{\mathdelimiterparameter\c!factor}%
98      \orelse\ifhastok={#2}%
99        \setupcurrentmathdelimiter[#2]%
100        \edef\p_factor{\mathdelimiterparameter\c!factor}%
101      \else
102        \edef\p_factor{#2}%
103      \fi
104      \edef\p_leftoffset{\mathdelimiterparameter\c!leftoffset}%
105      \edef\p_rightoffset{\mathdelimiterparameter\c!rightoffset}%
106      \ifempty\p_leftoffset\else
107        \mskip\p_leftoffset
108      \fi
109      \Uvextensible
110         \ifcstok{\mathdelimiterparameter\c!exact}\v!yes exact \fi
111         \ifcstok{\mathdelimiterparameter\c!axis }\v!yes axis  \fi
112         height \p_factor\dimexpr\mathdelimiterparameter\c!height\relax
113         depth  \p_factor\dimexpr\mathdelimiterparameter\c!depth \relax
114         \Udelimiter\zerocount\zerocount\mathdelimiterparameter\c!symbol
115      \relax
116      \ifempty\p_rightoffset\else
117        \mskip\p_rightoffset
118      \fi}}
119
120% \definemathdelimiter[integral][\c!symbol="222B]
121
122\permanent\protected\def\integral{\int\Umathadapttoright}
123
124\aliased\let\Umathadaptsize\Umathadapttoright
125
126% \setupmathdelimiter[integral][rightoffset=-3mu,exact=yes,factor=2]
127%
128% \let\inlineint \int
129% \let\displayint\integral
130%
131% \protected\def\int{\ifmmode\inlineordisplaymath\inlineint\displayint\else\normalint\fi}
132%
133% \startlines
134% \ruledhbox{$\integral           f\frac{1}{2}$}
135% \ruledhbox{$\integral[factor=1] f\frac{1}{2}$}
136% \ruledhbox{$\integral[factor=3] f\frac{1}{2}$}
137% \ruledhbox{$\int                f\frac{1}{2}$}
138% \stoplines
139
140\permanent\protected\def\autointegral#1#2#3% this one is obsolete now
141  {\ifmmode
142     \setbox\nextbox\mathstylehbox{#3}%
143     \scratchdimen\ifdim\nextboxht>\nextboxdp\nextboxht\else\nextboxdp\fi
144     \mathatom \mathintegralcode {%
145       \Uvextensible
146         height \scratchdimen
147         depth \scratchdimen
148         exact%
149         axis%
150         \Udelimiter \plusfour \zerocount "222B%
151     }%
152     \limits % nolimits needs more work: kerning and so
153     \normalsuperscript{#1}%
154     \normalsubscript{#2}%
155     \box\nextbox
156   \else
157     \char"222B\relax
158   \fi}
159
160% \startformula
161%     a =
162%     \autointegral{t}{b}1 +
163%     \autointegral{t}{b}{\frac{\frac{3}{4}}{\frac{1}{2}}} +
164%     \autointegral{t}{b}{\frac{\frac{\frac{\frac{1}{2}}{2}}{2}}{2}}
165% \stopformula
166
167\protect \endinput
168