% language=us \startcomponent about-speed \environment about-environment \startchapter[title=Math Styles] \startsection[title=Introduction] Because \CONTEXT\ is often considered somewhat less math savvy than for instance \LATEX\ we have more freedom to experiment with new insights and move forward. Of course \CONTEXT\ always could deal with math, and even provides rather advanced support when it comes to combining fonts, which at some point was needed for a magazine that used two completely different sets of fonts in one issue. Also, many of the mechanisms had ways to influence the rendering, but often by means of constants and flags. Already in an early stage of \LUATEX\ we went \UNICODE\ and after that the low level code has been cleaned up stepwise. In fact, we probably have less code now than before because we need less hacks. Well, this might not be that true, if we consider that we also introduced code at the \LUA\ end which wasn't there before, but which makes makes support easier. Because we don't need to support all kind of third party math extensions that themselves might depend on overloading low level implementations, we can rigourously replace mechanisms. In the process we also make things easier to configure, easier to define and we promote some previously low level tuning options at the user level. Or course, by introducing new features and more options, there is a price to pay in terms of speed, but in practice users will seldom use the more complex constructs thousands of times in one document. Elsewhere arrows and alike were discussed, here I will spend some words on math styles and will use fences and fractions as an example as these mechanisms were used to experiment. \stopsection \startsection[title=Math styles] In \TEX\ a formula can used three different sizes of a font: text, script and scriptscript. In addition a formula can be typeset using rules for display math or rules for inline math. This means that we have the following so called math styles: \starttabulate[||||] % \FL \NC \bf keyword \NC \bf meaning \NC \bf command \NC \NR % \FL \NC \type{display} \NC used for display math \NC \type {\displaystyle} \NC \NR \NC \type{text} \NC used for inline math \NC \type {\textstyle} \NC \NR \NC \type{script} \NC smaller than text style \NC \type {\scriptstyle} \NC \NR \NC \type{scriptscript} \NC smaller than script style \NC \type {\scriptscriptstyle} \NC \NR % \LL \stoptabulate Each of these commands will force a style but in practice you seldom need to do that because \TEX\ does it automatically. In addition there is are cramped styles with corresponding commands. \starttabulate \NC \ruledhbox{$\displaystyle x^2 + \sqrt{x^2+2x} + \sqrt{\displaystyle x^2+2x}$} \NC \type{\displaystyle } \NC \NR \NC \ruledhbox{$\crampeddisplaystyle x^2 + \sqrt{x^2+2x} + \sqrt{\crampeddisplaystyle x^2+2x}$} \NC \type{\crampeddisplaystyle } \NC \NR \NC \ruledhbox{$\textstyle x^2 + \sqrt{x^2+2x} + \sqrt{\textstyle x^2+2x}$} \NC \type{\textstyle } \NC \NR \NC \ruledhbox{$\crampedtextstyle x^2 + \sqrt{x^2+2x} + \sqrt{\crampedtextstyle x^2+2x}$} \NC \type{\crampedtextstyle } \NC \NR \NC \ruledhbox{$\scriptstyle x^2 + \sqrt{x^2+2x} + \sqrt{\scriptstyle x^2+2x}$} \NC \type{\scriptstyle } \NC \NR \NC \ruledhbox{$\crampedscriptstyle x^2 + \sqrt{x^2+2x} + \sqrt{\crampedscriptstyle x^2+2x}$} \NC \type{\crampedscriptstyle } \NC \NR \NC \ruledhbox{$\scriptscriptstyle x^2 + \sqrt{x^2+2x} + \sqrt{\scriptscriptstyle x^2+2x}$} \NC \type{\scriptscriptstyle } \NC \NR \NC \ruledhbox{$\crampedscriptscriptstyle x^2 + \sqrt{x^2+2x} + \sqrt{\crampedscriptscriptstyle x^2+2x}$} \NC \type{\crampedscriptscriptstyle} \NC \NR \stoptabulate Here we applied the styles as follows: \startbuffer $\textstyle x^2 + \sqrt{x^2+2x} + \sqrt{\textstyle x^2+2x}$ \stopbuffer \typebuffer The differences are subtle: the superscripts in the square root are positioned a bit lower than normal: the radical forces them to be cramped. \startlinecorrection \scale[width=\hsize]{\maincolor \getbuffer} \stoplinecorrection Although the average user will not bother about styles, a math power user might get excited about the possibility to control the size of fonts being used, of course wit the danger of creating a visually inconsistent document. And, as in \CONTEXT\ we try to avoid such low level commands \footnote {Although \unknown\ it's pretty hard to convince users to stay away from \type {\vskip} and friends.} it will be no surprise that we have ways to set them beforehand. \startbuffer \definemathstyle[mystyle][scriptscript] $ 2x + \startmathstyle [mystyle] 4y^2 \stopmathstyle = 10 $ \stopbuffer \typebuffer So, if you want it this ugly, you can get it: \blank \start \getbuffer \stop \blank A style can be a combination of keywords. Of course we have \type {display}, \type {text}, \type {script} and \type {scriptscript}. Then there are \type {uncramped} and \type {cramped} along with their synonyms \type {normal} and \type {packed}. In some cases you can also use \type {small} and \type {big} which will promote the size up or down, relative to what we have currently. A style definition can be combination of such keywords: \starttyping \definemathstyle[mystyle][scriptscript,cramped] \stoptyping Gradually we will introduce the \type {mathstyle} keyword in math related setups commands. In most cases a user will limit the scope of some setting by using braces, like this: \startbuffer $x{\setupmathstyle[script]x}x$ \stopbuffer This gives {\maincolor \ignorespaces \getbuffer \removeunwantedspaces}: a smaller symbol between two with text size. Equally valid is this: \startbuffer $x\startmathstyle[script]x\stopmathstyle x$ \stopbuffer \typebuffer Again we get {\maincolor \ignorespaces \getbuffer \removeunwantedspaces}, but at the cost of more verbose coding. The use of \type {{}} (either or not hidden in commands) has a few side effects. In text mode, when we use this at the start of a paragraph, the paragraph will start inside the group and when we end the group, specific settings that were done at that time get lost. So, in practice you will force a paragraph outside the group using \type {\dontleavehmode}, \type {\strut}, or one of the indentation commands. \stopitem In math mode a new math group is created which limits local style settings to this group. But as such groups also can trigger special kinds of spacing you sometimes don't want that. One pitfall is then to do this: \startbuffer $x\begingroup\setupmathstyle[script]x\endgroup x$ \stopbuffer \typebuffer Alas, now we get {\maincolor \ignorespaces \getbuffer \removeunwantedspaces}. A \type {\begingroup} limits the scope of many things but it will not create a math group! This kind of subtle issues is the reason why we have pre|-|built solutions that take care of style switching, grouping, spacing and positioning. \stopsection \startsection[title=Fences] Fences are symbols at the left and right of an expression: braces, brackets, curly braces, and bars are the most well known. Often they are supposed to adapt their size to the content that they wrap. Here you see some in action: \starttabulate[||c||] \NC \type {$|x|$} \NC $|x|$ \NC okay \NC \NR \NC \type {$||x||$} \NC $||x||$ \NC okay \NC \NR \NC \type {$a\left | \frac{1}{b}\right | c$} \NC $a\left | \frac{1}{b}\right | c$ \NC okay \NC \NR \NC \type {$a\left ||\frac{1}{b}\right ||c$} \NC $a\left || \frac{1}{b}\right ||c$ \NC wrong \NC \NR \NC \type {$a\left ‖ \frac{1}{b}\right ‖ c$} \NC $a\left ‖ \frac{1}{b}\right ‖ c$ \NC okay \NC \NR \stoptabulate Often authors like to code their math with minimal structure and if you use \UNICODE\ characters that is actually quite doable. Just look at the double bar in the example above: if we input \type {||} we don't get what we want, but with \type {‖} the result is okay. This is because the \type {\left} and \type {\right} commands expect one character. But, even then, coding a bit more verbose sometimes makes sense. In stock \CONTEXT\ we have a couple of predefined fences: \starttyping \definemathfence [parenthesis] [left=0x0028,right=0x0029] \definemathfence [bracket] [left=0x005B,right=0x005D] \definemathfence [braces] [left=0x007B,right=0x007D] \definemathfence [bar] [left=0x007C,right=0x007C] \definemathfence [doublebar] [left=0x2016,right=0x2016] \definemathfence [angle] [left=0x003C,right=0x003E] \stoptyping \startbuffer test $a \fenced[bar] {\frac{1}{b}} c$ test test $a \fenced[doublebar]{\frac{1}{b}} c$ test test $a \fenced[bracket] {\frac{1}{b}} c$ test \stopbuffer You use these by name: \typebuffer and get \startlines \getbuffer \stoplines \startbuffer \definemathfence [nooffence] [left=0x005B] \stopbuffer You can stick to only one fence: \typebuffer \getbuffer \startbuffer on $a \fenced[nooffence]{\frac{1}{b}} c$ off \stopbuffer Here \CONTEXT\ will take care of the dummy fence that \TEX\ expects instead. \startlines \getbuffer \stoplines You can define new fences and clone existing ones. You can also assign some properties: \startbuffer \definemathfence [fancybracket] [bracket] [command=yes, color=blue] \stopbuffer \typebuffer \getbuffer \startbuffer test $a\fancybracket{\frac{1}{b}}c$ test test \color[red]{$a\fancybracket{\frac{1}{b}}c$} test \stopbuffer \typebuffer The color is only applied to the fence. This makes sense as the formula can follow the main color but influencing the fences is technically somewhat more complex. \getbuffer Here are some more examples: \startbuffer \definemathfence [normalbracket] [bracket] [command=yes, color=blue] \definemathfence [scriptbracket] [normalbracket] [mathstyle=script] \definemathfence [smallbracket] [normalbracket] [mathstyle=small] \stopbuffer \typebuffer \getbuffer \starttabulate \NC \type{$a \frac{1}{b} c$} \NC $a \frac{1}{b} c$ \NC \NR \TB \NC \type{$a \normalbracket{\frac{1}{b} c$}} \NC $a \normalbracket{\frac{1}{b}} c$ \NC \NR \TB \NC \type{$a \scriptbracket{\frac{1}{b} c$}} \NC $a \scriptbracket{\frac{1}{b}} c$ \NC \NR \TB \NC \type{$a \smallbracket {\frac{1}{b} c$}} \NC $a \smallbracket {\frac{1}{b}} c$ \NC \NR \stoptabulate As with most commands, the fences inherit from the parents so we can say: \starttyping \setupmathfences [color=red] \stoptyping and get all our fences colored red. The \type {command} option results in a command being defined, which saves you some keying. \stopsection \startsection[title=Fractions] In \TEX\ the mechanism to put something on top of something else, separated by a horizontal rule, is driven by the \type {\over} primitive. That one has a (compared to other commands) somewhat different specification, in the sense that one of its arguments sits in front: \starttyping $ {{2x}\over{x^1}} $ \stoptyping Although to some extend this is considered to be more readable, macro packages often provide a \type {\frac} commands that goes like this: \starttyping $ \frac{2x}{x^1} $ \stoptyping There we have less braces and the arguments come after the command. As with the fences in the previous section, you can define your own fractions: \startbuffer \definemathfraction [innerfrac] [frac] [alternative=inner, mathstyle=script, color=red] \definemathfraction [outerfrac] [frac] [alternative=outer, mathstyle=script, color=blue] \stopbuffer \typebuffer \getbuffer The mathstyle and color are already discussed but the \type {alternative} is specific for these fractions. It determines if the style is applied to the whole fraction or to its components. \startbuffer \startformula \outerfrac{2a}{3b} = \innerfrac{2a}{3b} = \frac{2a}{3b} \stopformula \stopbuffer \typebuffer As with fences, the color is only applied to the horizontal bar as there is no other easy way to color that otherwise. \getbuffer As \TEX\ has a couple of low level stackers, we provide an interface to that as well, but we hide the dirty details. For instance you can define left and right fences and influence the rule \startbuffer \definemathfraction[fraca][rule=no,left=0x005B,right=0x007C] \definemathfraction[fracb][rule=yes,left=0x007B,right=0x007D] \definemathfraction[fracc][rule=auto,left=0x007C] \definemathfraction[fracd][rule=yes,rulethickness=2pt,left=0x007C] \stopbuffer \typebuffer \getbuffer When \type {rule} is set to \type {auto}, we use \TEX's values (derived from font metrics) for the thickness of rules, while \type {yes} triggers usage of the specified \type {rulethickness}. \startbuffer \startformula \fraca{a}{b} + \fracb{a}{b} + \fracc{a}{b} + \fracd{a}{b} \stopformula \stopbuffer \typebuffer Gives: \getbuffer \startbuffer \definemathfraction [frace] [rule=yes, color=blue, rulethickness=1pt, left=0x005B, right=0x007C] \stopbuffer \typebuffer \getbuffer This fraction looks as follows (scaled up): \startlinecorrection \midaligned{\scale[height=5ex]{$\displaystyle\frace{a}{b}$}} \stoplinecorrection So, the color is applied to the (optional) fences as well as to the (optional) rule. And when you color the whole formula as part of the context, you get \startlinecorrection \midaligned{\scale[height=5ex]{\color[maincolor]{$\displaystyle\frace{a}{b}$}}} \stoplinecorrection There is a (maybe not so) subtle difference between fences that come with fractions and regular fences, Take these definitions: \startbuffer \definemathfence [parenta] [left=0x28,right=0x29,command=yes] \definemathfraction [parentb] [left=0x28,right=0x29,rule=auto] \stopbuffer \typebuffer \getbuffer Of course the \type {b} variant takes less code: \startbuffer \startformula \parenta{\frac{a}{b}} + \parentb{a}{b} \stopformula \stopbuffer \typebuffer But watch how the parentheses are also larger. At some point \CONTEXT\ will provide a bit more control over this, \getbuffer You can also influence the width of the rule, but that is not related to the style. \startbuffer \definemathfraction [wfrac] [margin=.25em] \definemathfraction [wwfrac] [margin=.50em] \startformula \frac { a } { \frac { b } { c } } + \wfrac { a } { \frac { b } { c } } = \wwfrac { 2a } { \frac { 2b } { 2c } } \stopformula \stopbuffer \typebuffer Both the nominator and denominator are widened by the margin: \getbuffer \stopsection \stopcomponent