% language=us runpath=texruns:manuals/luametatex \environment luametatex-style \startdocument[title=Engines] \startsection[title={Introduction}] There are good reasons why we started the \LUATEX\ and later \LUAMETATEX\ projects. Here I will go into some of them. It is just short wrap up of how it started, how other engines influenced the process and how we see usage. There are plenty of documents out there that go into more detail. The main objective of this section is to put documentation into perspective. \stopsection \startsection[title={How it started}] When we started with \CONTEXT, hardware was rather limited compared to what we have today. A personal computer had some 640kB memory, possibly bumped to 1MB with help from a memory extender. This put some restrictions to how macro packages could be defined, also because that memory had to be shared with the baseline operating system. However, over time memory and runtime became less of an issue and the \TEX\ engine could be configured to use whatever was available. Extending the program other than increasing the available memory became more feasible. As with any program, there is always something to wish for which is why the \ETEX\ variant came into view. Before those extensions could be used, \PDFTEX\ showed up. That variant simplified the \quote {\TEX\ plus separate backend driver} model to a one-step process. Eventually \ETEX\ was merged into \PDFTEX, and that became the de facto standard engine. There was never a follow up on \ETEX, and more drastic deviations like \OMEGA\ were never ready for production. At some point \XETEX\ came around but that was mostly a font specific extension. We were kind of stuck with a wish-list that never would be fulfilled but we occasionally pondered a follow up. We drafted an extended \ETEX\ proposal, played with some features related to \PDF, improved a few things but that was it. Having some experiences with \LUA\ as extension language in \SCITE, I wondered what something like that would bring to \TEX\ and after discussing this with Hartmut he made variant of \PDFTEX\ that has some basic interfaces: we could access properties of registers and print something to \TEX\ as if it came from file. As is common with some variant, a new name was coined and \LUATEX\ came into existence. We're talking 2005. Because Idris wanted to typeset high quality scholar manuscripts mixing Arabic and Latin we discussed how to do that in \CONTEXT\ and his experiences with \OMEGA\ were such that alternatives had to be considered: the Oriental \TEX\ project was started and \LUATEX\ was the starting point. Taco merged some parts of \ALEPH\ (a somewhat stable variant of \OMEGA) into the code base and stepwise some primitives were added. It was overall a rather large and serious project that took a lot of our time. It was not commercially driven, mostly for \CONTEXT\ users and therefore also a lot of fun to do. As often with such projects, early adapters keep things going. It took a while before \LUATEX\ was stable in the sense that nothing more was added. Because the engine was developed alongside what is called \CONTEXT\ \MKIV, we could easily adapt both to each other. Even better: users could use both in production. However, in order for other macro packages to use \LUATEX\ (per request) it had to be frozen, and that happened around 2015, some 10 years after we started. However, we were not done yet and in order not to violate this stability principle the follow up was called \LUAMETATEX. Because it was a more drastic extension project, and also a somewhat drastic separation of the code base from the complex \LUATEX\ one, the related \CONTEXT\ code was also separated, this time tagged \MKXL, or \LMTX\ when we talk about the combination. The project started around 2019 and soon again entered a state of combined development and use in production and most users switched to this variant. There are more complete wrap ups of these developments and we systematically reported on them in various documents that are available in the distribution and|/|or published in user group journals. \stopsection \startsection[title={The engines}] Of course all starts with original \TEX. We want to be compatible so we keep that functionality. However, for practical reasons \LUAMETATEX\ omits two core components. Font loading is not present in the frontend and there is no backend. Both are supposed to be provided via \LUA\ plugins. This makes sense because in the meantime font technologies have changed and keep changing and backend also are a moving target. In \CONTEXT\ we already did all that in \LUA, so there was no need to keep that font and \PDF\ generation code around in the engine. There are a few more deviations, like dropping some system specific features (terminal related) and in former times practical features like outer and long macros that no longer made sense and complicated integrating new features unnecessarily. As mentioned in the introduction \PDFTEX\ is the basis for \LUATEX\ and \LUATEX\ is where we started with \LUAMETATEX. If we compare \PDFTEX\ with traditional \TEX\ the main additions are: \startitemize[packed] \startitem There is an integrated \PDF\ backend that also supports for instance hyperlinks and various annotations. \stopitem \startitem Expansion of glyphs (aka hz) has been added to the engine and integrated in the par builder. The same is true for character protrusion (in the margin). \stopitem \startitem There is, to some extend, support for inter-character kerning. \stopitem \startitem There are some handy helpers, for instance for calculating hashes, randomization, etc. \stopitem \startitem There is an extension to injection between lines (adjust). \stopitem \startitem We have few more conditionals (like testing for a csname and absolute values). \stopitem \startitem A few helpers like \type {\quitvmode} (that we liked to have in \CONTEXT) were added. \stopitem \stopitemize Because \PDFTEX\ was actively developed and maintained over many years, extensions showed up stepwise, also depending on usage and needs. That is also why the \ETEX\ extensions were included: \startitemize[packed] \startitem More that 256 registers, including marks. \stopitem \startitem Access to discarded material in the vertical splitting code. \stopitem \startitem Protection against expansion of macros (the \type {\protected} prefix). \stopitem \startitem A simple right to left typesetting mechanism. \stopitem \startitem Access to some states, a limited set of last nodes, etc. \stopitem \startitem There are some additional tracing features. \stopitem \startitem One can reprocess tokens and produce detokenized lists. \stopitem \stopitemize In \LUATEX\ we also looked at what \OMEGA\ could bring: \startitemize[packed] \startitem More that 256 registers. \stopitem \startitem Multi-directional typesetting. \stopitem \startitem Local boxes (in lines). \stopitem \startitem Input processing. \stopitem \stopitemize If we combine these lists, we see font expansion and protrusion coming back in \LUAMETATEX. However, already in \LUATEX\ expansion and protrusion were dealt with a bit differently and even more so in \LUAMETATEX, while protection in \LUAMETATEX\ is implemented differently. We also kept injection of vertical material but in \LUAMETATEX\ that done quite differently. Most if \ETEX\ is there but not right to left typesetting and the register approach. Of course we kept the additional conditionals but implemented them a bit different. In \LUATEX\ we took the \OMEGA\ enlarged register approach and directional typesetting although that has been stripped down and redone to right to left only. Local boxes are there but redone in \LUAMETATEX. There was no need for input processing because we have \LUA. In the end there is little that we kept from the other engines which also means that one cannot take the manuals that come with these engines and simply assume that it is there. We should of course mention \METAPOST. That graphical subsystem was integrated in \LUATEX\ and on the one hand stripped down (less backend) and extended (remove bottlenecks and add some functionality) in \LUAMETATEX. With respect to \LUA\ we moved to more recent versions and dropped support for just in time compilation. There is of course a lot in \LUATEX\ that can be found also in \LUAMETATEX\ but the later one goes way beyond its predecessor. It actually provides what we always wanted (as \CONTEXT\ developers) but never showed up. And this brings us to a next topic. \stopsection \startsection[title=Reflections] The previous section, derived from the \LUATEX\ manual, might suggest that \LUATEX\ and therefore \LUAMETATEX\ provides most of what \PDFTEX, \ETEX, \XETEX\ and \OMEGA\ provide but here I must disappoint the reader. So in addition to or variation on the above here are some reflections. We were quite involved in the early days of \PDFTEX\ development, so some features of that program we kept in \LUATEX, like expansion, protrusion, basic \PDF\ features like annotations, destinations, outlines and literals, transformations, image inclusion, plus a few handy extensions like \type {\vadjust pre}, \type {\insertht} and \type {\quitvmode} that were introduced for \CONTEXT, as well as positioning that when brought into \PDFTEX\ made that we no longer needed the indirect method using specials that we used (first with a post processing script filtering specials and providing positional information, later that became a the \type {dvipos} program). Experimental features (at that time introduced for \CONTEXT) like snapping lines could make sense but were easier to handle in \LUA\ so even those were dropped. We never used the features that were introduced for other macro packages, like color stacks and (un)escaping because we already did that otherwise. We also didn't want to burden the evolving \LUATEX\ engine with the other kerning features because they lacked control anyway. As we started in 2005 (with a first release in 2006) the \PDFTEX\ of that time is of course not the same as of today. I'm not sure what the last version is that \CONTEXT\ \MKII\ is targeting at because the version numbering changed a bit (at some point versions like \type {14e} became \type {140.XX}, so it might be around\type {140.17} or so). It might even be that recent versions break \MKII\ without us noticing. For \LUATEX\ we basically only took what we needed for \CONTEXT\ at that time and assumed that \LUA\ could fill in the gaps. Because \CONTEXT\ didn't really use much of the \LUATEX\ backend in the end what we kept from \PDFTEX\ in \LUAMETATEX\ was a follow up on expansion and protrusion, for which that engine set the standard. If it wasn't for \PDFTEX\ the \TEX\ community would not be where it was now. For as much as they make sense \ETEX\ extensions are mostly there but that project was basically stopped after the first major release. In fact because \PDFTEX\ has these extensions, we never implicitly had to include \ETEX. When we started with \LUATEX\ we actually kept in mind the ideas we had at that time because before we started with \LUATEX\ we already had plans for extensions (flagged \type {eetex}) but those never came to fruit, just as we had some ideas about extending \DVI\ which were superseded by the arrival of \PDF. The token prepend and append primitives actually were examples of that. The \ETEX\ project demonstrated that extending \TEX\ was an option. Then there is \XETEX. It is supported by \MKII\ but only the font mechanism was extended to handle \OPENTYPE\ fonts. For a while \LUATEX\ has some compatible math character definition primitives but none of its features. We can assume that its internals are quite different when it comes to fonts from \LUATEX\ because \LUATEX\ basically provides support for traditional fonts and delegates everything \OPENTYPE\ to \LUA. In \LUATEX\ we used font loader code from \FONTFORGE\ and some backend code from \DVIPDFMX, although \CONTEXT\ eventually did all loading in \LUA .But anyway this program demonstrated that a \UNICODE\ engine supporting publicly available (fancy) fonts was possible by adapting \TEX\ so \XETEX\ introduced \TEX ies to the at that point still evolving world of \OPENTYPE. In \OMEGA\ there were input translation mechanisms that some \CONTEXT\ users used but that I never looked into myself. These are of course not present in \LUATEX\ because we can use \LUA\ for input processing. In the end a bit of the directionality is all that we kept, most noticeably the initial \type {parnode} and \type {dirnode} but we made them first class nodes instead of whatsits and in \LUAMETATEX\ the first one serves different purposes. It got us started with directions. Over the last decades other engines showed up, most noticeably those for e.g. Japanese but I never looked into these. I'm not sure if \LUATEX\ can do the same with help from \LUA, but \LUAMETATEX\ has some more features so maybe it can. These engines serve a specific (language and script audience) but if Japanese \CONTEXT\ user need something more than we provide they can ask. In the end the extensions in \LUAMETATEX\ come from our own demands combined with trying to be complete but of course I might have missed something. It also means that flaws in the design are just mine (or ours in the case of \LUATEX). Of course quite some are common sense additions, often based what we need and what makes macro programming easier, but if users depend on some feature present in the other engines that cannot be handled by \LUA, they might ask for something similar but then we need details and examples and not some reference to a manual or macros that we are unaware of, have never seen, never used or haven't catched up with. Of course \LUAMETATEX\ has plenty of what \LUATEX\ has and the core of \LUATEX\ is pretty much original \TEX. However, in \LUAMETATEX\ nearly all mechanism have been extended, optimized, and in the process made a bit more \CCODE-ish. The original documentation describes what happens, the principles behind \TEX, so to say. More details will be added but can also found in numerous documents in the \CONTEXT\ distribution, articles and presentations. In the end we owe most to Don Knuth, who gave is the (very original) original that we can build upon. \stopsection \startsection[title=Usage] Why is it that there has been little fundamental development around \TEX\ engines? One of the reasons is that macro packages have to be stable. New features can be added but if they are only available in one engine (and there are a few more around now, like \XETEX\ and the \CJK\ specific ones) a macro package has to provide ways around them when they are not available. Risking some criticism I dare to say that in order to use \LUATEX\ to its full potential, macro package has to be set up such that this is possible and \CONTEXT\ does just that. When we talk backends it's relatively easy, and when we talk fonts it's doable. But if you are not willing to adapt the core of your code dramatically (and conceptually) all you get from \LUATEX\ is a built-in scripting language and some occasional messing around with node lists. In \CONTEXT\ we could transition rather well because the user interfaces permitted to do so without users noticing. Of course there were changes, for instance because encodings matter less, which is also true for e.g.\ \XETEX, and font technologies changed. But for macro packages other than \CONTEXT\ just the availability of \LUA\ might be enough reasons to use that engine. That also means that documentation of the more intricate features is less important: one can just learn by example and \CONTEXT\ is that example. With \LUAMETATEX\ we go further because here one really has to make some fundamental choices. Again this could be done within the existing user interfaces, but here we are not only talking of fundamental improvements, like rendering math or breaking paragraphs into lines, but also of more flexible handling of alignments, inserts, adjusts, marks, par and page building, etc.\ Basically all mechanism got extended and opened up. In order to profit from this you have to be able to throw away existing solution and use these extensions to come up with better ones. If one can put sentiments aside, this also takes quite some time. A very important aspect (at least for me) is that I want the macro code to look nice and in that respect stick to the \TEX\ syntax as much as possible. That means that we have more programming related primitives, enhanced macro argument parsing, more (flexible) conditionals, additional registers, extra expansion related features and so on. Instead of some intermediate layer (like the helpers in \CONTEXT) we can stick closer to the language itself. Of course this is not something that most users will notice. What users might notice, is that on the average \CONTEXT\ with \LUAMETATEX\ performs better than with \LUATEX\ or even \LUAMETATEX. Even with more performance critical components delegated to \LUA\ (like the backend \PDF\ generation) we gain and often can compete performance wise well with the faster eight bit \PDFTEX\ engine. The fact that one has to make (and cannot make) drastic choices has a consequence for documentation. Most of what is new and interesting is discussed in articles and low level manuals. However, it is often discussed in the perspective of \CONTEXT. Although we do discuss and show generic solutions it makes little sense to go into details there simply because in the end only \CONTEXT\ will use them as intended. It's just a waste of time to implement variants that are more generic because they will never be used elsewhere, especially in situations where the solutions are considered \quote {standard} and will not change. In \CONTEXT\ we always followed the principle that if we can do better, we will do better, and interfaces are such that this can be done. Of course that brings up the question \quotation {How do you know that these are the best solutions} and the answer is that we don't. However, we're not talking of quick and dirty solutions. For instance it took years to enhance math support: experiments, discussion, reconsideration, documenting, writing articles, looking at usage, fonts, etc. A wider discussion would not have brought better solutions, if at all. If that were the case, there would already have been successors. The same is true for most extensions: there was little need for them outside the \CONTEXT\ community. So in the end that's what those interested should look at: how is \LUAMETATEX\ used in \CONTEXT. It is the combined development together with acceptance by users that makes this possible, \stopsection \stopdocument