diff options
Diffstat (limited to 'Master/texmf-dist/doc/context/sources/general/manuals/about/about-mathstyles.tex')
-rw-r--r-- | Master/texmf-dist/doc/context/sources/general/manuals/about/about-mathstyles.tex | 457 |
1 files changed, 457 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/context/sources/general/manuals/about/about-mathstyles.tex b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-mathstyles.tex new file mode 100644 index 00000000000..205e985610b --- /dev/null +++ b/Master/texmf-dist/doc/context/sources/general/manuals/about/about-mathstyles.tex @@ -0,0 +1,457 @@ +% language=uk + +\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 |