% language=us runpath=texruns:manuals/ontarget

% \profilemacro\scaledfontdimen

\usebodyfont[antykwa]
\usebodyfont[iwona]
\usebodyfont[kurier]

\startcomponent ontarget-jmn

\environment ontarget-style

\startchapter[title={Supporting math in the JMN collection}]

\startlines
Hans Hagen, Hasselt NL
Mikael Sundqvist, Lund SV
\stoplines

\startsubject[title=Introduction]

In 2022 we overhauled math font support in \CONTEXT, using new functionality in
the \LUAMETATEX\ engine. By that time it had become clear that the \OPENTYPE\
math font landscape had more or less settled. The Latin Modern fonts as well as
the \TEX gyre fonts don't evolve, so we consider them being frozen. It is also
unlikely that the reference Cambria font will change or become more complete.
More recent math font are modelled as a mixture of Cambria and Latin Modern.

When we started with \LUATEX\ in \CONTEXT\ we immediately started using \UNICODE\
math but the lack of proper \UNICODE\ fonts, with the exception of Cambria,
resulted in creating virtual \UNICODE\ math fonts on the fly using the virtual
font features of the \LUATEX. But when the \OPENTYPE\ math fonts came available
that kind of trickery was no longer needed (or at least less preferred).

That is why we considered dropping the virtual math font mechanism from \LMTX. We
had already dropped \type {tx} (we can use Termes) and \type {px} (better use
Pagella) fonts as well as \TYPEONE\ based Latin Modern. Dropping the commercial
Math Times was a logical next step, also because it has never been tested. The
mixtures of Pagella and Euler were already replaced by using the upgraded tweak
mechanism.

That left us with Antykwa, Iwona and Kurier, the fonts that the late Janusz
Nowacky vectorized and that came with plenty \OPENTYPE\ text fonts but also with
\TYPEONE\ math companions. And, as we like these fonts, it meant that we had to
come up with a solution. One option was to create proper \OPENTYPE\ math fonts, but
another was to strip down the virtual math font mechanism to just support these
fonts. There is some charm in keeping the \TYPEONE\ fonts, also because it is a
test case for (by now sort of obsolete) \TFM\ metric, \PFB\ outline, encoding and
map files, for which we have code embedded so having a proper test case makes
sense.

In the end we opted for the second solution so this is what the next sections are
about: supporting \OPENTYPE\ math using \TYPEONE\ fonts. We admit that it took
way more time than a conversion to \OPENTYPE\ math fonts would have, but that is
partly due to the fact that these fonts, and especially Antykwa, have some
characteristic features that we wanted to use. So, in a sense it was also an
esthetics challenge. It also helped that the font was used in realistic and
moderately complex math rendering. We also note that rendering in \LMTX\ is
different (and hopefully better) than in \MKIV\ because we try to benefit from
the upgraded math engine in \LUAMETATEX.

This exploration is dedicated to Janusz who was one of the characteristic
presenters of fonts at Bacho\TEX\ meetings, who contributed these fonts, and
who in some sense was thereby kick starting the Polish \TEX\ related font
projects.

\stopsubject

\startsubject[title=Virtual math]

We keep this expose simple and only tell what we did, you can look at the \type
{lfg} files and source code to see what magick is done. For the standard Antykwa
we load \typ {LatinModern-Math} first, so we cover all symbols that matter. Next
we stepwise load \typ {rm-anttr.tfm}, \typ {mi-anttri.tfm}, \typ {mi-anttbi.tfm},
\typ {rm-anttb.tfm}, \typ {sy-anttrz.tfm}, \typ {ex-anttr.tfm}. For each we
specify an encoding vector. Some are loaded multiple times with different
vectors. Because we don't like the slanted curly braces we even load \typ
{AntykwaTorunska-Regular} in order to get the upright ones. This method is not that
different from what we do in \MKIV.

The specification of a loaded font also can contain a list of (named) characters
that should be ignored, That was one of the new features in the virtual
constructor. We take the math parameters from the fonts where these are
specified, here in the symbols and extension fonts.

The fonts contain extra snippets of extensibles that one can use to construct
some of these vertical and horizontal stretched symbols on the fly in addition to
what the font metrics already define. Unfortunately some snippets are missing,
like the six pieces that could make up horizontal and vertical bars, for which we
now need to cheat. We considered making a companion font but for now we are in
\quote {as good as we can} emulation mode.

\stopsubject

\startsubject[title=The fonts]

We start out with a skeleton font and in the past we used the \OPENTYPE\ text
font for that. On top of that we overlay a bunch of \TYPEONE\ fonts, and as was
common in those days, the \AMS\ math symbol fonts \type {msa} and \type {msb}
were overlayed last in order to fill in remaining gaps. However, now that we have
a Latin Modern \OPENTYPE\ math font it made more sense to use that as starting
point because it already has all these symbols.

If we forget about the additional weights and condensed variants, the JMN math
collection has actually not that many fonts. One reason for that is that the
upright roman font, the ones that have an \type {r} near the end of the file
name, in traditional \TEX\ speak \type {rm}, have way more than 255 characters:
it not only has all kind of composed characters, it also has all the extensible
shapes. All is (as usual with \TYPEONE\ fonts) driven by encoding and mapping
files. Fortunately the glyphs names (that we use for filtering) are the same for
the three fonts but there are some more in Antykwa.

\stopsubject

\startsubject[title=Challenges]

The real challenge was Antykwa. This is because it has a distinctive curvature at
the end of sticky parts (like rules and such). The \TEX\ machinery as well as
\OPENTYPE\ math assume rules being used in for instance radicals, fractions,
overbars, underbars and vertical bar fences.

\startlinecorrection
\scale[width=\textwidth]{\switchtobodyfont[antykwa]\im {
    \showglyphs
    \mathbin{-}
    \mathbin{+}
    \mathbin{=}
    \mathbin{<}
    \mathbin{>}
}}
\stoplinecorrection

The last three come in not only sizes (aka variants) but also can stretch (aka
extensible). And, them being just rules it is assumes that the \TEX\ engine deals
with that, and as it cannot really do that without characters, the traditional
approach is to use commands that use \TEX\ rules. However, in \CONTEXT\ (\MKIV\
and \LMTX) we can provide the proper variants and extensible using virtual
shapes, and in \LMTX\ we can even scale as last resort.

The first two are special. We already could support fractions using dedicated
characters because we played with the fraction builder using for instance arrows
as separator and these are not rules but characters. It was not that much work to
also make that possible for the rule in a radical. The main adaptation was that
we need to center the numerator and denominator of a fraction and the body of a
radical when the character used is wider than requested.

\startlinecorrection
\scale[height=2cm]{\switchtobodyfont[antykwa]\im {
    \showglyphs
    \sqrt{x+1} -
    \fenced[bar]{
        \frac{1}{x+1}
    }
}}
\stoplinecorrection

Because we have two font models in \CONTEXT, normal and compact, we had to be careful
in defining the virtual shapes and extensibles so that they work in both models. This
has to do with scaling and sharing.

\stopsubject

\startsubject[title=Implementation]

The original virtual math font mechanism worked closely with the math fall back
features, but these have been replaced by tweaks, which means that we lost some
of that. Also, heuristics worked fine on the average but for Antykwa we wanted
more. Therefore some of the built in logic has been moved to the goodie file that
controls the composition. After all, we don't want to hard code specific
solutions in the core.

Another addition was the use of so called setups bound to a font class so that we
can set up some math machinery features for e.g.\ Antykwa in the goodie file. We
need to bind to a class because we mix a dozen math fonts in one test file and
therefore we need to separate these setups.

As in regular \OPENTYPE\ math support we ignore the italic correction and translate
it in combinations of proper width and specific kerning. That way we avoid all kind
of issues that we otherwise need to compensate for.

Because we need to hook extensible characters into the machine for Antykwa its
font typescript file also defines a font class specific setup (of a few lines) to
be applied. This might evolve into a more granular mechanism but for now it works
fine and adds little overhead.

\stopsubject

\startsubject[title=Examples]

We end by showing a few \quotation{real} examples.

\bgroup\switchtobodyfont[antykwa]
\startformula
\binom{n}{k} = \frac{n!}{k!(n-k)!}\mtp{,} 0 \leq k \leq n\mtp{.}
\stopformula
\egroup

The parentheses are unchanged, and we believe that using rotation symmetry
instead of mirror symmetry is a brave but interesting choice, and the new
fraction bar fits well with it. The fraction bar also fits well with the equal
sign.

\bgroup
\switchtobodyfont[antykwa]
\startformula
1 + x + x^2 + \ldots + x^n = \frac{1 - x^{n+1}}{1 - x}
\stopformula
\egroup

The new vertical bars go well with the brackets, the integral and the solidus.

\bgroup
\switchtobodyfont[antykwa]
\startformula
\fenced[doublebar]{f}_p = \F3\left[ \int_0^1 \fenced[bar]{f(x)}^p \dd x \right]^{1/p}
\stopformula
\egroup

The fancy fraction bar and the radical bar have made the arithmetic|-|geometric
mean inequality look more appealing than ever, hasn't it?

\bgroup
\switchtobodyfont[antykwa]
\startformula
    \frac{a_1 + a_2 + \ldots + a_n}{n} \geq \root[n=n]{a_1 a_2 \ldots a_n}
\stopformula
\egroup

Primes are usually a bit of a challenge:

\bgroup
\switchtobodyfont[antykwa]
\startformula
f(k+1)-f(k) \alignhere = f'(k)+f''(k)\frac{1}{2}+f'''(\xi_k)\frac{1}{6}
            \breakhere = k^p+\frac{p}{2}k^{p-1}+\frac{p(p-1)}{6}\xi_k^{p-2}
\stopformula
\egroup

And, as expected, multi|-|line formulas also look fine.

\stopsubject

\stopchapter

\stopcomponent
