% language=us runpath=texruns:manuals/math

\environment math-layout

\usemodule[fonts-features]

\startcomponent math-features

\startchapter[title=Features]

\startsection[title=Default features]

Math fonts are loaded in so called basemode, which gives them a traditional
treatment in the engine. However, we do support features in basemode too, so
setting them can influence what gets passed to \TEX. Also, in math mode, some
font features (like \type {dtls} and stylistic alternates) are applied
dynamically.

The default \type {mathematics} feature set is as follows:

\showfeatureset[name=mathematics]

We don't discuss the exact meaning of these options here because normally you
don't have to deal with them. If a math font demands something special, the place
to deal with it is the related font goodie file.

This feature set is the parent of two other sets: \type {mathematics-l2r} and
\type {mathematics-r2l}:

\showfeatureset[name=mathematics-l2r]

This one is the same as the parent but the right|-|to|-|left variant is
different:

\showfeatureset[name=mathematics-r2l]

Eventually we need size related feature sets and again we define a parent and
direction specific ones: \type {math-text}, \type {math-script} and \type
{math-scriptscript}.

\showfeatureset[name=math-text]
\showfeatureset[name=math-script]
\showfeatureset[name=math-scriptscript]

The left|-|to|-|right sets \type {math-*-l2r} are:

\showfeatureset[name=math-text-l2r]
\showfeatureset[name=math-script-l2r]
\showfeatureset[name=math-scriptscript-l2r]

The right|-|to|-|left sets \type {math-*-r2l} are:

\showfeatureset[name=math-text-r2l]
\showfeatureset[name=math-script-r2l]
\showfeatureset[name=math-scriptscript-r2l]

There are a few extra sets defined but these are meant for testing or virtual
math fonts. The reason for showing these sets is to make clear that the number of
features is minimal and that math is a real script indeed.

The \type {kern} features is questionable. In traditional \TEX\ there are kerns
indeed but in \OPENTYPE\ math kerns are not used that way because a more advanced
kerning feature is present (and that one is currently always enabled). We used to
set the following but these make no sense.

\starttyping
liga=yes, % (traditional) ligatures
tlig=yes, % tex ligatures, like -- and ---
trep=yes, % tex replacements, like the ' quote
\stoptyping

Math fonts normally have no ligatures and supporting the \TEX\ specific ones can
actually be annoying. So, in todays \CONTEXT\ these are no longer enabled. Just
consider the following:

\startbuffer
$- \kern0pt -   \kern 0pt \mathchar"2D$
$- \kern0pt --  \kern 0pt \mathchar"2D \mathchar"2D$
$- \kern0pt --- \kern 0pt \mathchar"2D \mathchar"2D \mathchar"2D$
\stopbuffer

\typebuffer

The \type {-} is mapped onto a minus sign and therefore several in succession
become multiple minus signs. The \type {\mathchar"2D} will remain the character
with that slot in the font so there we will see a hyphen. If we would enable the
\type {tlig} feature several such characters would be combined into an endash or
emdash. So how do we get these than? Because getting a hyphen directly involves a
command, the same is true for its longer relatives: \type {\endash} and \type
{\emdash}.

\startlines
\getbuffer
\stoplines

As convenience we have defined a special \type {\mathhyphen} command. Watch the
fact that a text hyphen in math mode is a minus in math! As comparison we also
show the plus sign.

\starttabulate[||c|c|]
\BC command            \BC math          \BC text        \NC \NR
\TB
\NC \type{\mathhyphen} \NC $\mathhyphen$ \NC \mathhyphen \NC \NR
\NC \type{\texthyphen} \NC $\texthyphen$ \NC \texthyphen \NC \NR
\NC \type{-}           \NC $-$           \NC -           \NC \NR
\NC \type{+}           \NC $+$           \NC +           \NC \NR
\NC \type{\endash}     \NC $\endash$     \NC \endash     \NC \NR
\NC \type{\emdash}     \NC $\emdash$     \NC \emdash     \NC \NR
\stoptabulate

\stoptabulate

\stopsection

\startsection[title=Stylistic alternates]

    {\em todo}

\stopsection

\startsection[title=Dotless variants]

    {\em todo}

\stopsection

\startmkivmode

\startsection[title=Script kerning]

Text in math is somewhat special. First of all, a math font is not a text fonts
because the characters and glyphs have a different purpose. Text features are
normally not present (and often not even wanted). Anyway, you can force a text
font, but that doesn't mean you will get for instance kerning. You can force a
box which in turn will trigger font processing, but then you normally loose the
script related size properties. So we end up with some juggling possibly combined
with user intervention, and that is what the \type {\text} macro does.

But still there is the kern between a variable and its subscript to consider,
something that normally is dealt with with staircase kerns, an \OPENTYPE\ math
speciality. But, as we progress over the math list, and we bind a subscript to a
variable, that subscript can be anything: a simple character, or more characters
(a list) or something wrapped in a box. There is simply no universal solution
that we can hard code because sometimes you don't want that special kerning. This
is why in \LUATEX\ the integer variable \type {\mathscriptboxmode} controls the
way this is dealt with.

\starttabulate[|l|p|]
\NC \type {0} \NC forget about kerning \NC \NR
\NC \type {1} \NC kern math sub lists with a valid glyph (default in the engine) \NC \NR
\NC \type {2} \NC also kern math sub boxes that have a valid glyph (default in \CONTEXT) \NC \NR
\NC \type {3} \NC only kern math sub boxes with a boundary node present \NC \NR
\stoptabulate

Here we show some examples of how this parameter controls kerning. Watch the
difference between a simple font switch and a text wrapped in a box. There are
differences between fonts: some fonts have kerns, some don't. When present kerns
are passed to the engine without further user intervention.

\startbuffer[1]
    $T_{\tf fluff}$
\stopbuffer

\startbuffer[2]
    $T_{\text{fluff}}$
\stopbuffer

\startbuffer[3]
    $T_{\text{\boundary1 fluff}}$
\stopbuffer

\unexpanded\def\Show#1#2#3%
  {\doifelsenothing{#3}
     {\typeinlinebuffer[#1]}
     {\doifelse{#3}{-}
        {\type{mode #2}}
        {\switchtobodyfont[#3,big]\setstrut\strut\showfontkerns\showglyphs\mathscriptboxmode#2\relax\inlinebuffer[#1]}}}

% \starttabulate[|lT|c|c|c|c|c|]
%     \NC          \NC \Show{1}{0}{}         \NC\Show{1}{1}{}         \NC \Show{2}{1}{}         \NC \Show{2}{2}{}         \NC \Show{3}{3}{}         \NC \NR
%     \NC          \NC \Show{1}{0}{-}        \NC\Show{1}{1}{-}        \NC \Show{2}{1}{-}        \NC \Show{2}{2}{-}        \NC \Show{3}{3}{-}        \NC \NR
%     \NC modern   \NC \Show{1}{0}{modern}   \NC\Show{1}{1}{modern}   \NC \Show{2}{1}{modern}   \NC \Show{2}{2}{modern}   \NC \Show{3}{3}{modern}   \NC \NR
%     \NC lucidaot \NC \Show{1}{0}{lucidaot} \NC\Show{1}{1}{lucidaot} \NC \Show{2}{1}{lucidaot} \NC \Show{2}{2}{lucidaot} \NC \Show{3}{3}{lucidaot} \NC \NR
%     \NC pagella  \NC \Show{1}{0}{pagella}  \NC\Show{1}{1}{pagella}  \NC \Show{2}{1}{pagella}  \NC \Show{2}{2}{pagella}  \NC \Show{3}{3}{pagella}  \NC \NR
%     \NC cambria  \NC \Show{1}{0}{cambria}  \NC\Show{1}{1}{cambria}  \NC \Show{2}{1}{cambria}  \NC \Show{2}{2}{cambria}  \NC \Show{3}{3}{cambria}  \NC \NR
%     \NC dejavu   \NC \Show{1}{0}{dejavu}   \NC\Show{1}{1}{dejavu}   \NC \Show{2}{1}{dejavu}   \NC \Show{2}{2}{dejavu}   \NC \Show{3}{3}{dejavu}   \NC \NR
% \stoptabulate

\def\ShowMore#1#2%
  {\subsubject{\Show{#1}{#2}{} (\Show{#1}{#2}{-})}
   \starttabulate[|lT|c|c|c|c|c|]
     \NC modern   \NC \Show{#1}{#2}{modern}   \NC \NR
     \NC lucidaot \NC \Show{#1}{#2}{lucidaot} \NC \NR
     \NC pagella  \NC \Show{#1}{#2}{pagella}  \NC \NR
     \NC cambria  \NC \Show{#1}{#2}{cambria}  \NC \NR
     \NC dejavu   \NC \Show{#1}{#2}{dejavu}   \NC \NR
   \stoptabulate}

\ShowMore{1}{0}
\ShowMore{1}{1}
\ShowMore{2}{1}
\ShowMore{2}{2}
\ShowMore{3}{3}

\stopsection

\stopmkivmode

\stopchapter

\stopcomponent
