# Written by Ludovic Courtès <ludo@gnu.org>, July 2007.
#
# Based on:
# http://lists.planix.com/pipermail/lout-users/2007q2/004355.html .

@Section
  @Title { The @Code { "@Math" } package }
  @Tag   { math_package }
@Begin

equations.math @SubIndex { @Code "@Math" }

@PP

The @Code { "@Math" } package provides features similar to those found
in @Code { "@Eq" } but with improved formula layout.  For instance, the
@Code { "@M" } symbol offers better rendering of equations within
paragraphs than @Code { "@E" }.  To that end, @Code { "@Math" }
implements the four equation layout styles described by Donald E. Knuth in
@I { The { @TeX }book } along with the corresponding transition rules
@Cite { $knuth1984tex }.  Namely, depending on its rendering context,
a math formula may be in one of the following styles:

@BulletList
@LI { ``display'' style, for formulas displayed on lines by
themselves; }
@LI { ``text'' style, for formulas embedded in text; }
@LI { ``script'' style, for formulas used in superscripts and
subscripts; }
@LI { ``subscript'' style, for second-order superscripts and
subscripts. }
@EndList

In addition, formulas can be ``cramped'', meaning that exponents are
lower than usual.

@PP
Fortunately, you usually don't need to be familiar with these display
styles and corresponding layout algorithm to use @Code { "@Math" }.
The sections below summarize the differences from @Code { "@Eq" } as
well as the new features.

@BeginSubSections

@SubSection @Title { Differences from @Code { "@Eq" } }
@Begin

@PP
First and foremost, the Lout definitions for the @Code "@Math" symbol
are accessed via a setup file called {@Code "math"}, which you must
include at the start of your document in the usual way:

@ID @OneRow @Code {
"@SysInclude { math }"
"@SysInclude { doc }"
"@Doc @Text @Begin"
"..."
"@End @Text"
}

Note that it is possible to include both @Code "eq" and { @Code "math"
}.  Instead of typing formulas within { @Code "@Eq" } or { @Code "@E" },
they must be embedded in { @Code "@Math" } or { @Code "@M" },
respectively.
@PP

In @Code { "@Math" }, sums, products, integrations and similar large
operations are laid out according to the current style.  For instance,
the limits of a sum are laid out differently depending on the context:

@BeginAlignedDisplays
@CAND {
  @Math { { sum from { i = 0 } to { n } { i sup 2 } } over { x + y } } }
@CAND {
  @Math { sum from { i = 0 } to { n } } }
@EndAlignedDisplays

Similarly, the @Code { "big" } symbol that is used in @Code { "@Eq" } to
display sums, integrations, etc. is usually not needed: the size of the
``sigma'' or other symbol automatically adapts to the context.
@PP

The @Code { "from" } and @Code { "to" } stand-alone symbols found in
@Code { "@Eq" } are not available.  Instead, symbols such as @Code {
"sum" } that require them have @Code { "from" } and @Code { "to" }
options instead.  For example, instead of
@ID { @Code { "@Eq { sum from i = 0 to n { i sup 2 } }" } }
it is necessary to write
@ID { @Code { "@Math { sum from { i = 0 } to { n } { i sup 2 } }" } }
The braces are necessary now because @Code { "from" } and @Code { "to" }
are options of @Code { "sum" }, and it is a general rule of Lout that
the values of options have to be enclosed in braces.
@PP

Unlike those of @Code { "@Eq" }, mathematical operators obey standard
precedence rules.  Thus, to get @M { { n + 1 } over 2 }, one must write
@Code { "@M { { n + 1 } over 2 }" } instead of just
@Code { "@E { n+1 over 2 }" }.

@PP
@Code "@Math" generally produces better mathematical layout than
@Code { "@Eq" }.  Consider the following examples rendered with
@Code "@Math" (on the left) and with @Code "@Eq" (on the right):

@ID { @Math { 2 sup { 2 sup { 2 sup x } } }
|8ct
@Eq { 2 sup { 2 sup { 2 sup x } } } }

//
@RID { @Math { x supp { z supp d on c } on { y supp a on b } }
|8ct
@Eq { x supp { z supp d on c } on { y supp a on b } } }

@ID { @Math { { { n + 1 } over 2 } over x }
|8ct
@Eq { { { n + 1 } over 2 } over x } }

//
@RID {
@Math { a sub 0 + 1 over {
        a sub 1 + 1 over {
          a sub 2 + 1 over {
            a sub 3 + 1 over {
              a sub 4 } } } } }
|8ct
@Eq { a sub 0 + 1 over {
        a sub 1 + 1 over {
          a sub 2 + 1 over {
            a sub 3 + 1 over {
              a sub 4 } } } } } }

@End @SubSection

@SubSection @Title { New symbols and options }
@Begin

@LP
The @Code { "@Math" } symbol has a few options not found in
@Code { "@Eq" }.  The @Code "symbolfont" and @Code "basefont" options
denote, respectively, the font where symbols are searched for and the font
where other characters are searched for.  These fonts default to Symbol
and Times, respectively.  Note that @Code "@Math" is currently tailored
to use these fonts so using other fonts may require manual adaptation of
equation layout.

@PP
Besides, @Code "@Math" provides several new symbols.  Symbols @Code
"above" and @Code "below" behave similarly to @Code "from" and @Code
"to" in @Code "@Eq", respectively.  In other words, @Code "above" prints
its left parameter on top of its right parameter, while @Code "below"
does the opposite operation:

@ID { @Code { "@M { { a above f } + { z below b } }" }
|8ct
@M { { a above f } + { z below b } } }

@ID {
{ @Code {
"@Math { sum from { { 1 <= i <= p } above"
"                 { 1 <= j <= q } above"
"                 { 1 <= k <= r } }"
"        { a sub { ij } b sub { jk } c sub { ki } } }" }
|8ct
@Math { sum from { { 1 <= i <= p } above
                 { 1 <= j <= q } above
                 { 1 <= k <= r } }
        { a sub { ij } b sub { jk } c sub { ki } } } } }

@Code "@Math" produces spacing around operators that depends on the type
of operator (see Section @NumberOf { "equ_spacing" }) and also on the
current style.  When defining new operators for @Code "@Math", it is
usually desirable to make sure they use spacing consistent with other
operators.  To that end, @Code "@Math" provides spacing symbols similar
to those found in @Code "@Eq", namely @Code { rel }, @Code { bin } and
@Code { punct }.  However, these symbols differ from their @Code "@Eq"
counterpart in that they take three parameters:  a left parameter, an
@Code "op" option, and a right parameter.  For example,
@ID @Code "@Math { x bin op { ! } y }"
produces
@ID @Math { x bin op { ! } y }
The left and right parameters are laid out around the operator specified
by the @Code { op } option, including appropriate spacing.

@PP

Finally, @Code "@Math" offers additional symbols that allow users to
explicitly specify the style under which part of a math formula is to be
laid out.  These low-level primitives may be useful in specific
situations such as the one illustrated below:

@ID { @Code {
"@Math {"
"  lim above @SubScriptStyle { i --> infinity }"
"     f(x) = { g(x) } over { h(x) } }"
}
|8ct
@Math {
  lim above @SubScriptStyle { i --> infinity }
      f(x) = { g(x) } over { h(x) } }
}

@Code "@SuperScriptStyle" and @Code "@SubScriptStyle" lay out their
right parameter under the ``script'' or ``subscript'' style,
respectively.  @Code "@NumeratorStyle" and @Code "@DenominatorStyle" lay
out their right parameter as if it where the numerator or denominator of
a fraction, respectively.  Likewise, @Code "@SquareRootStyle" lays out
its right parameter as if it were below a square root.

@End @SubSection

@EndSubSections
@End @Section
