about-mathstackers.tex /size: 22 Kb    last modification: 2023-12-21 09:43
1% language=us
2
3\startcomponent about-mathstackers
4
5\environment about-environment
6
7\startchapter[title=Math stackers]
8
9\startsection[title=Introduction]
10
11In the next sections I will discuss the way we deal with stacked content in
12\CONTEXT\ \MKIV\ and in particular extensible characters. The mechanism describe
13here is actually more generic and can also deal with regular text. The stacker
14code is an evolution of the mechanisms that combine math arrows with text. From
15the users perspective there is not that much difference with the old methods
16because in practice \quote {defined} commands are used and their name stayed.
17However, we use different definition and setup commands and provide much more
18control. The new implementation is leaner but not meaner and fits the way \MKIV\
19is set up.
20
21How does \LUA\ fits in? We use a helper in order to determine some
22characteristics of extensibles, but we could have done without. We also use some
23new \LUATEX\ math primitives and of course we depend on \OPENTYPE\ font
24technoloygy.
25
26\stopsection
27
28\startsection[title=Extensibles]
29
30The command \type {\leftarrowfill} was introduced in plain \TEX\ and gives, as
31the name indicates, a \leftarrowfill\ that stretches itself so that it takes the
32available space. Take the following example:
33
34\starttyping
35\hbox to 4cm{\leftarrowfill}
36\stoptyping
37
38This will make an arrow of length 4cm:
39
40\blank \mathstylehbox{\Umathaccent\fam\zerocount"2190{\hskip4cm}} \blank
41
42This arrow is made out of small snippets:
43
44\blank {\showglyphs\scale[width=\textwidth]{\mathstylehbox{\Umathaccent\fam\zerocount"2190{\hskip4cm}}}} \blank
45
46Here is another one:
47
48\starttyping
49\hbox to 4cm{\rightoverleftarrowfill}
50\stoptyping
51
52or:
53
54\blank {\mathstylehbox{\Umathaccent\fam\zerocount"21C4{\hskip4cm}}} \blank
55
56This time we have three different snippets:
57
58\blank {\showglyphs\scale[width=\textwidth]{\mathstylehbox{\Umathaccent\fam\zerocount"21C4{\hskip4cm}}}} \blank
59
60The \TEX\ engine has a concept of extensible characters. In fact there are two
61mechanisms: there is a list of larger glyphs and when that list is exhausted
62larger characters can be constructed out of snippets. Examples are left and right
63fences in math like braces and brackets, and, also in math, some top and bottom
64accents.
65
66For reasons unknown to me, some of these extensibles are handled by the engine
67directly, using properties of a font, while others are composed using macros.
68Given that \TEX\ is quite popular for typesetting scientific articles it is
69beyond my understanding why no one decided to provide some more fonts and|/|or
70extend the \TEX\ engine. After all, the whole idea of Donald Knuth with \TEX\ was
71that it could be adapted to future needs by its users. And so, more that 30 years
72after \TEX\ and macro packages showed up we're stuck with not only incomplete
73fonts, but also an engine that was never adapted to demands.
74
75\stopsection
76
77\startsection[title=The traditional way]
78
79In \CONTEXT\ we have support for extensibles built into the core but it uses the
80traditional approach: take some snippets and paste them together, making sure to
81achieve some overlap and get rid of side bearings. In terms of \TEX\ code this can
82best be illustrated with the plain \TEX\ definition of such a command:
83
84\starttyping
85\def\leftarrowfill
86  {$%
87   \mathsurround0pt%
88   \mathord\leftarrow\mkern-7mu%
89   \cleaders\hbox{$\mkern-2mu\smash-\mkern-2mu$}\hfill
90   \mkern-7mu\smash-%
91   $}
92\stoptyping
93
94Here we create a tight formula starting with a \type {leftarrow}, ending with a
95minus sign and glued together with the number of minus signs that are needed to
96fill the available space. This macro eventually expands to something like this (a
97bit spaced out):
98
99\starttyping
100\def\leftarrowfill { $
101  % \leftarrow = \mathchardef\leftarrow="3220 in plain but in
102  % unicode it's character 0x2190 so we use that one here
103  \mathsurround=0pt
104  \mathord{\mathchar"2190}
105  \mkern-7mu
106  \cleaders
107   \hbox { $
108     \mkern-2mu
109     \mathchoice
110      {\setbox0\hbox{$\displaystyle     -$}\ht0=0pt\dp0=0pt\box0}
111      {\setbox0\hbox{$\textstyle        -$}\ht0=0pt\dp0=0pt\box0}
112      {\setbox0\hbox{$\scriptstyle      -$}\ht0=0pt\dp0=0pt\box0}
113      {\setbox0\hbox{$\scriptscriptstyle-$}\ht0=0pt\dp0=0pt\box0}
114     \mkern-2mu
115    $ }
116   \hfill
117  \mkern-7mu
118  \mathchoice
119   {\setbox0\hbox{$\displaystyle     -$}\ht0=0pt\dp0=0pt\box0}
120   {\setbox0\hbox{$\textstyle        -$}\ht0=0pt\dp0=0pt\box0}
121   {\setbox0\hbox{$\scriptstyle      -$}\ht0=0pt\dp0=0pt\box0}
122   {\setbox0\hbox{$\scriptscriptstyle-$}\ht0=0pt\dp0=0pt\box0}
123$ }
124\stoptyping
125
126If you look at the code you see a few hacks. First of all we see that we need to
127add kerns in order to make the symbols overlap. For the middle shapes this is
128understandable as there we don't want rounding errors to lead to gaps. Also,
129because the minus in Computer Modern (and therefore Latin Modern) has rounded
130tips, we need to make sure that we end up beyond the tips. Next we see two blobs
131of \type {mathchoice}. This primitive chooses one of the four variants and
132switches to the right math style. It packages the minus and smashes it. In our
133case smashing makes not much sense as the arrowhead has height and depth anyway,
134but it's a side effect of using general purpose macros that there can be some
135unneeded overhead.
136
137\blank
138\hbox \bgroup \quad
139    \scale[sx=5,sy=5]{\hbox{\showglyphs$\mathsurround\zeropoint\char"2190$}}\quad
140    \scale[sx=5,sy=5]{\hbox{\showglyphs$\mathsurround\zeropoint\char"002D$}}\quad
141    \scale[sx=5,sy=5]{\hbox{\showglyphs$\mathsurround\zeropoint\char"27F8$}}\quad
142    \scale[sx=5,sy=5]{\hbox{\showglyphs$\mathsurround\zeropoint\char"003D$}}\quad
143\egroup
144\blank
145
146Above you see the two characters that traditionally are combined into a leftward
147pointing arrows. Watch the whitespace on the left and right of the actual glyph.
148
149\stopsection
150
151\startsection[title=The new way]
152
153These zero height and depth don't show up in our rendered examples. Why is this?
154The reason is that I cheated a bit. I used this to get the arrow: \footnote {In
155this example I misuse the accent placement mechanism. Upto \LUATEX\ 0.75 that was
156the way to go.}
157
158\starttyping
159\mathstylehbox{\Umathaccent\fam\zerocount"21C4{\hskip4cm}}
160\stoptyping
161
162The \CONTEXT\ support macro \type {\mathstylehbox} is an efficient variant of
163\type {\mathchoice}. More significant is that we don't assemble the arrow, but
164just put it as an accent on top of a skip. The \type {\Umathaccent} primitive
165will assemble the long arrow for us, using information in the font. If we look
166into the definition of the (Latin Modern) font in \MKIV\ we see this:
167
168\starttyping
169[8592]={
170 ["boundingbox"]={ 57, -10, 942, 510 },
171 ["class"]="base",
172 ["index"]=1852,
173 ["math"]={
174  ["horiz_parts"]={
175   {
176    ["advance"]=507,
177    ["end"]=169,
178    ["extender"]=0,
179    ["glyph"]=984274,
180    ["start"]=0,
181   },
182   {
183    ["advance"]=337,
184    ["end"]=337,
185    ["extender"]=1,
186    ["glyph"]=984275,
187    ["start"]=337,
188   },
189   {
190    ["advance"]=507,
191    ["end"]=0,
192    ["extender"]=0,
193    ["glyph"]=984276,
194    ["start"]=169,
195   },
196  },
197  ["horiz_variants"]={ 10229 },
198 },
199 ["name"]="arrowleft",
200 ["width"]=1000,
201}
202\stoptyping
203
204This arrow symbol comes in two sizes. The extra size is mentioned in \type
205{horiz_variants}. When no more variants are seen, it switches to the extensible
206definition, that uses \type {horiz_parts}. The dimensions are in basepoints, the
207references to glyphs are decimal. The \type {end} and \type {start} fields
208specify the overlap. When \type {extender} equals 1 it signals a repeatable
209snippet.
210
211In the \TEX\ engine the slot allocated for the left arrow symbol has a \type
212{next} pointer to a larger shape. Here there is only one such shape but when
213there are more they form a linked list. The the last one in such a list gets the
214specification of the extenders.
215
216We hard|-|coded the width to 4cm so how does it work when the arrow has to adapt
217itself? There are two cases there. When we are putting text on top of or below an
218arrow, we know what the width is because we can measure the text. But when we use
219the arrow as a filler, we have to leave it to the engine to arrange it. In recent
220\LUATEX\ the definition can be as simple as:
221
222\starttyping
223\def\leftarrowfill{\leaders "2190 \hfill}
224\stoptyping
225
226or:
227
228\starttyping
229\def\leftarrowfill{\mathstylehbox{\leaders"2190\hfill}}
230\stoptyping
231
232In fact, we can use this new \LUATEX\ extension to \type {\leaders} to
233replace the accent hacks as well.
234
235\stopsection
236
237\startsection[title=Wrapping it in macros]
238
239If this was all, we would be done in a few lines of definitions but as usual
240there is more involved: especially text. The prerequisites can be summarized as
241follows:
242
243\startitemize[packed]
244\startitem
245    The width of the extensible need to adapt itself automatically.
246\stopitem
247\startitem
248    We need to be able to control horizontal and vertical offsets.
249\stopitem
250\startitem
251    We best have a math as well as a text variant (which is handy for chemistry).
252\stopitem
253\startitem
254    For historic reasons we need to deal with optional arguments in a special
255    (reverse) way.
256\stopitem
257\startitem
258    We need alternatives for extensibles on top, in the middle and at the bottom.
259\stopitem
260\stopitemize
261
262Using a low level command we can do this:
263
264\startbuffer[math]
265$x \directmathextensible{"2192}{top}{bottom} x$
266\stopbuffer
267
268\typebuffer[math] \blank \getbuffer[math] \blank
269
270This is not that exiting too look at, but the next might be:
271
272\enabletrackers[math.stackers.texts]
273
274\blank \getbuffer[math] \blank
275
276Here we have turned on a tracker:
277
278\starttyping
279\enabletrackers[math.stackers.texts]
280\stoptyping
281
282The toppart is transparent blue, the middlepart transparent red and the bottom
283part becomes transparent green. When the areas overlap you see the mixed color.
284
285Before we explore some options, we show some variants. Often extensibles are used
286in math mode, if only because they originate in math and come from math fonts.
287
288\startbuffer[text]
289$x \textstacker{"2192}{top}{bottom} x$
290\stopbuffer
291
292\typebuffer[text] \blank \getbuffer[text] \blank
293
294These commands also work outside math mode:
295
296\startbuffer[none]
297x \textstacker{"2192}{top}{bottom} x
298\stopbuffer
299
300\typebuffer[none] \blank \getbuffer[none] \blank
301
302and to some extend can adapt themselves:
303
304\startbuffer[high]
305x\high{x \textstacker{"2192}{top}{bottom} x} x
306\stopbuffer
307
308\typebuffer[high] \blank[2*big] \getbuffer[high] \blank
309
310\stopsection
311
312\startsection[title=Influencing the spacing]
313
314We will use the text example to illustrate some options.
315
316\startbuffer[demo]
317\ruledhbox \bgroup \quad
318    \setupmathstackers[location=top]%
319    \textstacker{"21C4}{top}{bottom}\quad
320    \setupmathstackers[location=high]%
321    \textstacker{"21C4}{top}{bottom}\quad
322    \setupmathstackers[location=middle]%
323    \textstacker{"21C4}{top}{bottom}\quad
324    \setupmathstackers[location=low]%
325    \textstacker{"21C4}{top}{bottom}\quad
326    \setupmathstackers[location=bottom]%
327    \textstacker{"21C4}{top}{bottom}\quad
328\egroup
329\stopbuffer
330
331\typebuffer[demo]
332
333You can set up extensibles to be shifted up and down.
334
335\blank \getbuffer[demo] \blank
336
337The above rendering uses the default spacing. When we set all values to zero we
338get this:
339
340\startbuffer[setup]
341\setupmathstackers
342  [voffset=\zeropoint,
343   hoffset=\zeropoint,
344   minheight=\exheight,
345   mindepth=\zeropoint,
346   minwidth=\zeropoint]
347\stopbuffer
348
349\blank \start \getbuffer[setup,demo] \stop \blank
350
351The setup looks like this:
352
353\typebuffer[setup]
354
355and gives a pretty tight rendering. The default values are:
356
357\starttyping
358\setupmathstackers
359  [voffset=.25\exheight,
360   hoffset=.5\emwidth,
361   minheight=\exheight,
362   mindepth=\zeropoint,
363   minwidth=\emwidth]
364\stoptyping
365
366\startbuffer[setup]
367\setupmathstackers
368  [voffset=2\exheight,
369   hoffset=\emwidth,
370   minheight=\exheight,
371   mindepth=\zeropoint,
372   minwidth=\zeropoint]
373\stopbuffer
374
375When we set \type {voffset} to twice the ex|-|height and \type {hoffset} to
376the em|-|width we get:
377
378\blank \start \getbuffer[setup,demo] \stop \blank
379
380We can enforce a (consistent) height and depth of the extensible by setting the
381minimum values:
382
383\startbuffer[setup]
384\setupmathstackers
385  [voffset=\zeropoint,
386   hoffset=\zeropoint,
387   minheight=5\exheight,
388   mindepth=3\exheight,
389   minwidth=6\emwidth]
390\stopbuffer
391
392\typebuffer
393
394\blank \start \getbuffer[setup,demo] \stop \blank
395
396\stopsection
397
398\startsection[title=A neat feature]
399
400A more obscure feature relates to the visual appearance. When we put something
401on top of for instance an arrow, it sometimes looks better when we only consider
402the middle part. Watch the following:
403
404\startbuffer[setup]
405\setupmathstackers
406  [voffset=\zeropoint,
407   hoffset=\zeropoint,
408   minheight=\zeropoint,
409   mindepth=\zeropoint,
410   minwidth=\zeropoint]
411\stopbuffer
412
413\startbuffer[demo]
414\ruledhbox \bgroup \quad
415    \setupmathstackers[offset=normal]%
416    \textstacker{"21C4}{top}{bottom}\quad
417    \setupmathstackers[offset=min]%
418    \textstacker{"21C4}{top}{bottom}\quad
419    \setupmathstackers[offset=max]%
420    \textstacker{"21C4}{top}{bottom}\quad
421\egroup
422\stopbuffer
423
424\typebuffer[demo]
425
426The \type {min} and \type {max} values will add extra offsets that relate to the
427width of the edge snippets.
428
429\blank \start \getbuffer[setup,demo] \stop \blank
430
431In this case both have the same result but the difference becomes clear when we
432set the \type {hoffset} to the em|-|width. In the case of \type {min} we don't
433add some extra space if the \type {hoffset} is applied.
434
435\startbuffer[setup]
436\setupmathstackers
437  [voffset=\zeropoint,
438   hoffset=\emwidth,
439   minheight=\zeropoint,
440   mindepth=\zeropoint,
441   minwidth=\zeropoint]
442\stopbuffer
443
444\startbuffer[demo]
445\ruledhbox \bgroup \quad
446    \setupmathstackers[offset=normal]%
447    \textstacker{"21C4}{top}{bottom}\quad
448    \setupmathstackers[offset=min]%
449    \textstacker{"21C4}{top}{bottom}\quad
450    \setupmathstackers[offset=max]%
451    \textstacker{"21C4}{top}{bottom}\quad
452\egroup
453\stopbuffer
454
455\typebuffer[demo]
456
457Of course in this example we have a symmetrical correction.
458
459\blank \start \getbuffer[setup,demo] \stop \blank
460
461A one sided arrow behaves different:
462
463\startbuffer[demo]
464\ruledhbox \bgroup \quad
465    \setupmathstackers[offset=normal]%
466    \textstacker{"2192}{top}{bottom}\quad
467    \setupmathstackers[offset=min]%
468    \textstacker{"2192}{top}{bottom}\quad
469    \setupmathstackers[offset=max]%
470    \textstacker{"2192}{top}{bottom}\quad
471\egroup
472\stopbuffer
473
474\blank \start \getbuffer[setup,demo] \stop \blank
475
476\stopsection
477
478\startsection[title=The user interface]
479
480It all starts out with categories. We have a couple of predefined categories in
481the core. The \type {mathematics} category typesets the top and bottom texts in
482mathmode, while the \type {text} category doesn't. The \type {reverse} category
483swaps its arguments. There are \type {upper} and \type {under} categories too.
484
485As with most \CONTEXT\ mechanisms inheritance is part of the picture:
486
487\starttyping
488\definemathextensibles [mine] [big] [offset=min]
489\stoptyping
490
491You can change settings with:
492
493\starttyping
494\setupmathstackers [mine] [big] [voffset=\exheight]
495\stoptyping
496
497For downward compatibility we also provide these:
498
499\starttyping
500\definemathextensibles [normal] [hoffset=0.5\emwidth]
501\definemathextensibles [none]   [hoffset=\zeropoint]
502\definemathextensibles [small]  [hoffset=1\emwidth]
503\definemathextensibles [medium] [hoffset=1.5\emwidth]
504\definemathextensibles [big]    [hoffset=2\emwidth]
505\stoptyping
506
507They inherit from \type {mathematics} so choosing this also forces the top and
508bottomtexts to be typeset in math mode.
509
510These commands don't define extensibles, they only provide a way to categorize
511them. There are couple of definers and one reason for that is that we want to
512define downward compatible commands.
513
514\starttyping
515\definemathextensible [reverse] [xleftarrow]  ["2190]
516\definemathextensible [reverse] [xrightarrow] ["2192]
517\stoptyping
518
519The \type {x} in the name is sort of standard for an extensible symbol with
520optionally some text on top or below. The reverse forced compatible behaviour.
521
522\startbuffer
523\xrightarrow{stuff below} {stuff on top} \quad
524\xrightarrow{stuff on top}               \quad
525\xrightarrow{}            {stuff on top} \quad
526\xrightarrow{stuff below} {}             \quad
527\xrightarrow{}            {}             \quad
528\xrightarrow                             \quad
529\stopbuffer
530
531\typebuffer \getbuffer
532
533New in \MKIV\ is the \type {t} variant that typesets the text as (indeed) text.
534In addition we have a normal|-|order \type {m} variant:
535
536\starttyping
537\definemathextensible [text] [tleftarrow]  ["2190]
538\definemathextensible [text] [trightarrow] ["2192]
539
540\definemathextensible [mathematics] [mleftarrow]  ["2190]
541\definemathextensible [mathematics] [mrightarrow] ["2192]
542\stoptyping
543
544This time the order is always top first and bottom next:
545
546\startbuffer
547\trightarrow{stuff on top} {stuff below} \quad
548\trightarrow{stuff on top} {}            \quad
549\trightarrow{stuff on top}               \quad
550\trightarrow{}             {stuff below} \quad
551\trightarrow                             \quad
552\stopbuffer
553
554\typebuffer
555
556So we get:
557
558\getbuffer
559
560As you can see, there is an optional first argument that specifies the category
561that applies. This permits you to define extra commands that have their own
562(spacing) properties.
563
564Earlier on we saw that defined commands can be forced into a category:
565
566\startbuffer
567\trightarrow[big]   {stuff on top} {stuff below} \quad
568\trightarrow[medium]{stuff on top} {stuff below} \quad
569\trightarrow[small] {stuff on top} {stuff below}
570\stopbuffer
571
572\typebuffer
573
574Here we get:
575
576\getbuffer
577
578A variation on this kind of extensibles are over- and underarrows. This time the
579text is the nucleus.
580
581\starttyping
582\definemathoverextensible  [top]    [overleftarrow]   ["2190]
583\definemathoverextensible  [top]    [overrightarrow]  ["2192]
584
585\definemathunderextensible [bottom] [underleftarrow]  ["2190]
586\definemathunderextensible [bottom] [underrightarrow] ["2192]
587\stoptyping
588
589In action this looks like:
590
591\startbuffer
592\ruledhbox \bgroup $ \quad
593     \overleftarrow {a}  \quad    \overleftarrow {ABC}  $ \quad
594  x_{\overleftarrow {a}} \quad x_{\overleftarrow {ABC}} $ \quad
595     \underleftarrow{a}  \quad    \underleftarrow{ABC}  $ \quad
596  x_{\underleftarrow{a}} \quad x_{\underleftarrow{ABC}} $ \quad
597$ \egroup
598\stopbuffer
599
600\typebuffer
601
602Here we also have tracing enabled, and we also show the bounding box:
603
604\blank \getbuffer \blank
605
606This leaves us one command: the one that defines the basic filler:
607
608\starttyping
609\definemathextensiblefiller [leftarrowfill]  ["2190]
610\definemathextensiblefiller [rightarrowfill] ["2192]
611\stoptyping
612
613Commands defined like this will stretch themselves to fit the circumstances,
614and normally they will fill op the available space.
615
616\startbuffer
617\hbox to 4cm {from here \leftarrowfill\ to there}
618\hbox to 8cm {from there \rightarrowfill\ to here}
619\stopbuffer
620
621\typebuffer
622
623These commands (like the others) work in text mode as well as in math mode.
624
625\blank \getbuffer \blank
626
627\stopsection
628
629\startsection[title=Special cases]
630
631One of the reasons why the arrows mechanism has always been somewhat
632configureable is that we need arrows in the chemistry code.
633
634\starttyping
635\definemathextensibles
636  [chemistry]
637  [offset=max,
638   left=\enspace,
639   right=\enspace,
640   hoffset=.5\emwidth]
641
642\definemathextensible [chemistry] [cleftarrow]          ["2190]
643\definemathextensible [chemistry] [crightarrow]         ["2192]
644\definemathextensible [chemistry] [crightoverleftarrow] ["21C4]
645\stoptyping
646
647\startbuffer
6482H + O \crightarrow{explosive}\ H\low{2}O
649\stopbuffer
650
651\typebuffer
652
653Of course normally such code is wrapped into the chemistry enviroments and
654support macros.
655
656\blank \getbuffer \blank
657
658If you want something else than an extensible you can use definitions like the
659following:
660
661\startbuffer
662\definemathtriplet [tripleta]
663\definemathtriplet [text] [tripletb]
664\definemathtriplet [text] [tripletc] [\otimes]
665\stopbuffer
666
667\typebuffer \getbuffer
668
669\startbuffer
670\tripleta{\ominus}{top}{botom} and
671\tripletb{\oplus} {top}{botom} and
672\tripletc         {top}{botom}
673\stopbuffer
674
675\typebuffer
676
677\blank \hbox{\getbuffer} \blank
678
679As optional first argument you can pass a category.
680
681\startbuffer
682\tripleta[mathematics]{\ominus}{top}{botom} and
683\tripletb[mathematics]{\oplus}{top}{botom} and
684\tripletc[mathematics]{top}{botom}
685\stopbuffer
686
687\typebuffer
688
689Which gives:
690
691\blank \hbox{\getbuffer} \blank
692
693Instead of \type {mathematics} you could have given its synonym \type {math}.
694Keep in mind that categories are shared among stackers. There is also a direct
695command:
696
697\starttyping
698before \mathtriplet{\otimes}{top}{botom} after
699\stoptyping
700
701\stopsection
702
703\startsection[title=An overview]
704
705We end with showing a list of extensibles that come with the font used here, the
706\TEX Gyre Pagella. First we load a module:
707
708\startbuffer
709\usemodule[s][math-extensibles]
710\stopbuffer
711
712\typebuffer \getbuffer
713
714This module provides a couple of commands that typesets a table with the
715extensibles as known in \CONTEXT. Beware: not all fonts have all those
716characters.
717
718\startbuffer
719\showmathextensibles[alternative=a]
720\stopbuffer
721
722A second command is:
723
724\typebuffer
725
726This commands shows the base glyph, and the stretched variant with text on top
727and below. When no symbol is found in the font a rule is rendered.
728
729\getbuffer
730
731\startbuffer
732\showmathextensibles[alternative=b]
733\stopbuffer
734
735\typebuffer
736
737This command typesets a list with \UNICODE\ entries and defined commands. There
738are empty entries due to lack of glyphs in the used font. Not all characters have
739an associated command. Some have multiple commands with different math classes.
740
741\getbuffer
742
743\stopsection
744
745\startsection[title=Remark]
746
747The number of extensions to the \LUATEX\ core math engine is not that large and
748mostly involves more control over spacing and support for \UNICODE\ math as
749\OPENTYPE\ math extensibles. However, a few years after writing this chapter the
750machinery was cleaned up a bit and in the process some more control was added to
751constructors for radicals, fractions and delimiters. The spacing and composition
752can be controlled in a bit more detail using keywords (and dimensions). Because
753in \CONTEXT\ we already have mechanisms in place not much of that new
754functionality is used (yet). Also, in the meantime \CONTEXT\ evolved further.
755This chapter is just a snapshot and it might even render a bit different in more
756recent versions of \CONTEXT\ and|/|or \LUATEX. After all, it was written as part
757of the development story.
758
759\stopsection
760
761\stopchapter
762
763\disabletrackers[math.extensibles.texts]
764
765\stopcomponent
766