% language=us runpath=texruns:manuals/luametafun

\environment luametafun-style

\startcomponent luametafun-introduction

\startchapter[title={Introduction}]

For quite a while, around since 1996, the integration of \METAPOST\ into
\CONTEXT\ became sort of mature but, it took decades of stepwise refinement to
reach the state that we're in now. In this manual I will discuss some of the
features that became possible by combining \LUA\ and \METAPOST. We already had
quite a bit of that for a decade but in 2018, when \LUAMETATEX\ showed up a next
stage was started.

Before we go into details it is good to summarize the steps that were involved in
integrating \METAPOST\ and \TEX\ in \CONTEXT. It indicates a bit what we had and
have to deal with which in turn lead to the interfaces we now have.

Originally, \TEX\ had no graphic capabilities: it just needed to know dimensions
of the graphics and pass some basic information about what to include to the
\DVI\ post processor. So, a \METAPOST\ graphic was normally processed outside the
current run, resulting in \POSTSCRIPT\ graphic, that then had to be included. In
\PDFTEX\ there were some more built in options, and therefore the \METAPOST\ code
could be processed runtime using some (generic) \TEX\ macros that I wrote.
However, that engine still had to launch \METAPOST\ for each graphic, although we
could accumulate them and do that between runs. Immediate processing means that
we immediately know the dimensions, while a collective run is faster. In \LUATEX\
this all changed to very fast runtime processing, made possible because the
\METAPOST\ library is embedded in the engine, a decision that we made early in
the project and never regret.

With \PDFTEX\ the process was managed by the \type {texexec} \CONTEXT\ runner but
with \LUATEX\ it stayed under the control of the current run. In the case of
\PDFTEX\ the actual embedding was done by \TEX\ macros that interpreted the
(relatively simple) \POSTSCRIPT\ code and turned it into \PDF\ literals. In
\LUATEX\ that job was delegated to \LUA.

When using \PDFTEX\ with independent \METAPOST\ runs support for special color
spaces, transparency, embedded graphics, outline text, shading and more was
implemented using specials and special colors where the color served as reference
to some special extension. This works quite well. In \LUATEX\ the pre- and
postscript features, which are properties of picture objects, are used.

In all cases, some information about the current run, for instance layout related
information, or color information, has to be passed to the rather isolated
\METAPOST\ run. In the case if \LUATEX\ (and \MKIV) the advantage is that
processing optional text happens in the same process so there we don't need to
pass information about for instance the current font setup.

In \LUATEX\ the \METAPOST\ library has a \type {runscript} feature, which will
call \LUA\ with the given code. This permitted a better integration: we could now
ask for specific information (to the \TEX\ end) instead of passing it from the
\TEX\ end with each run. In \LUAMETATEX\ another feature was added: access to the
scanners from the \LUA\ end. Although we could already fetch some variables when
in \LUA\ this made it possible to extend the \METAPOST\ language in ways not
possible before.

Already for a while Alan Braslau and I were working on some new \METAFUN\ code
that exploits all these new features. When the scanners came available I sat down
and started working on new interfaces and in this manual I will discuss some of
these. Some of them are illustrative, others are probably rather useful. The core
of what we could call \LUAMETAFUN\ (or \METAFUN\ XL when we use the file
extension as indicator) is a key|-|value interface as we have at the \TEX\ end.
This interface relates to \CONTEXT\ \LMTX\ development and therefore related
files have a different suffix: \type {mpxl}. However, keep in mind that some are
just wrappers around regular \METAPOST\ code so you have the full power of
traditional \METAPOST\ at hand.

We can never satisfy all needs, so to some extent this manual also demonstrates
how to roll out your own code, but for that you also need to peek into the
\METAFUN\ source code too. It will take a while for this manual to complete. I
also expect other users to come up with solutions, so maybe in the end we will
have a collection of modules for specific tasks.

There is some duplication between this manual and the \METAFUN\ manual which is
mostly a side effect of some functionality not being present in \MKIV\ and
discussing it in the \LUAMETAFUN\ manual would be confusing. Also, from an
educational point of view it doesn't hurt to read about it twice.

Because Mikael Sundqvist and I both like \METAPOST\ and we work together on
improving existing and exploring new features in the engine as well as \METAFUN.
Some of the examples in this manual result from that. We have a lot of fun
working on this and a side effect this manual benefits a lot from our
collaboration.

\startlines
Hans Hagen
Hasselt NL
August 2021 (and beyond)
\stoplines

\stopchapter

\stopcomponent

% I started writing this in 2019, a few days after seeing Wende live in Zeist (
% (YT: WENDE - # MENS), one of the best shows of that year, a clear reminder of
% timeless versatility.
