summaryrefslogtreecommitdiff
path: root/doc/context/sources/general/manuals/lowlevel/lowlevel-inserts.tex
diff options
context:
space:
mode:
Diffstat (limited to 'doc/context/sources/general/manuals/lowlevel/lowlevel-inserts.tex')
-rw-r--r--doc/context/sources/general/manuals/lowlevel/lowlevel-inserts.tex202
1 files changed, 202 insertions, 0 deletions
diff --git a/doc/context/sources/general/manuals/lowlevel/lowlevel-inserts.tex b/doc/context/sources/general/manuals/lowlevel/lowlevel-inserts.tex
new file mode 100644
index 000000000..4976ce564
--- /dev/null
+++ b/doc/context/sources/general/manuals/lowlevel/lowlevel-inserts.tex
@@ -0,0 +1,202 @@
+% language=us runpath=texruns:manuals/lowlevel
+
+\environment lowlevel-style
+
+\startdocument
+ [title=inserts,
+ color=middlecyan]
+
+\startsectionlevel[title=Introduction]
+
+This document is a mixed bag. We do discuss inserts but also touch elements of
+the page builder because inserts and regular page content are handled there.
+Examples of mechanisms that use inserts are footnotes. These have an anchor in
+the running text and some content that ends up (normally) at the bottom of the
+page. When considering a page break the engine tries to make sure that the anchor
+(reference) and the content end up on the same page. When there is too much, it
+will distribute (split) the content over pages.
+
+We can discuss page breaks in a (pseudo) scientific way and explore how to
+optimize this process, taking into accounts also inserts that contain images but
+it doesn't make much sense to do that because in practice we can encounter all
+kind of interferences. Theory and practice are too different because a document
+can contain a wild mix of text, figures, formulas, notes, have backgrounds and
+location dependent processing. It get seven more complex when we are dealing with
+columns because \TEX\ doesn't really know that concept.
+
+I will therefore stick to some practical aspects and the main reason for this
+document is that I sort of document engine features and at the same time give an
+impression of what we deal with. I will do that in the perspective of
+\LUAMETATEX, which has a few more options and tracing than other engines.
+
+{\em Currently this document is mostly for myself to keep track of the state of
+inserts and the page builder in \LUAMETATEX\ and \CONTEXT\ \LMTX. The text is not
+yet corrected and can have errors.}
+
+\stopsectionlevel
+
+\startsectionlevel[title=The page builder]
+
+When your document is processed content eventually gets added to the so called
+main vertical list (mvl). Content first get appended to the list of contributions
+and at specific moments it will be handed over to the mvl. This process is called
+page building. There we can encounter the following elements (nodes):
+
+\starttabulate
+\NC \type {glue} \NC a vertical skip \NC \NR
+\NC \type {penalty} \NC a vertical penalty \NC \NR
+\NC \type {kern} \NC a vertical kern \NC \NR
+\NC \type {vlist} \NC a a vertical box \NC \NR
+\NC \type {hlist} \NC a horizontal box (often a line) \NC \NR
+\NC \type {rule} \NC a horizontal rule \NC \NR
+\NC \type {boundary} \NC a boundary node \NC \NR
+\NC \type {whatsit} \NC a node that is used by user code (often some extension) \NC \NR
+\NC \type {mark} \NC a token list (as used for running headers) \NC \NR
+\NC \type {insert} \NC a node list (as used for notes) \NC \NR
+\stoptabulate
+
+The engine itself will not insert anything other than this but \LUA\ code can
+mess up the contribution list and the mvl and that can trigger an error. Handing
+over the contributions is done by the page builder and that one kicks in in
+several places:
+
+\startitemize[packed]
+\startitem
+ When a penalty gets inserted it is part of evaluating if the output routine
+ should be triggered. This triggering can be enforced by values equal or below
+ 10.000 that then can be checked in the set routine.
+\stopitem
+\startitem
+ The builder is {\em not} exercised when a glue or kern is injected so there can
+ be multiple of them before another element triggers the builder.
+\stopitem
+\startitem
+ Adding a box triggers the builder as does the result of an alignment which can
+ be a list of boxes.
+\stopitem
+\startitem
+ When the output routine is finished the builder is executed because the
+ routine can have pushed back content.
+\stopitem
+\startitem
+ When a new paragraph is triggered by the \type {\par} command the builder kicks in
+ but only when the engine was able to enter vertical mode.
+\stopitem
+\startitem
+ When the job is finished the builder will make sure that pending content is handled.
+\stopitem
+\startitem
+ An insert and vadjust {\em can} trigger the builder but only at the nesting level zero
+ which normally is not the case (I need an example).
+\stopitem
+\startitem
+ At the beginning of a paragraph (like text), before display math is entered,
+ and when display math ends the builder is also activated.
+\stopitem
+\stopitemize
+
+At the \TEX\ the builder is triggered automatically in the mentioned cases but at
+the \LUA\ end you can use \type {tex.triggerbuildpage()} to flush the pending
+contributions.
+
+The properties that relate to the page look like counter and dimension registers ut
+they are not. These variables are global and managed differently.
+
+\starttabulate
+\NC \type {\pagegoal} \NC the available space \NC \NR
+\NC \type {\pagetotal} \NC the accumulated space \NC \NR
+\NC \type {\pagestretch} \NC the possible zero order stretch \NC \NR
+\NC \type {\pagefilstretch} \NC the possible one order stretch \NC \NR
+\NC \type {\pagefillstretch} \NC the possible second order stretch \NC \NR
+\NC \type {\pagefilllstretch} \NC the possible third order stretch \NC \NR
+\NC \type {\pageshrink} \NC the possible shrink \NC \NR
+\NC \type {\pagedepth} \NC the current page depth \NC \NR
+\NC \type {\pagevsize} \NC the initial page goal \NC \NR
+\stoptabulate
+
+When the first content is added to an empty page the \type {\pagegoal} gets the
+value of \type {\vsize} and gets frozen but the value is diminished by the space
+needed by left over inserts. These inserts are managed via a separate list so
+they don't interfere with the page that itself of course can have additional
+inserts. The \type {\pagevsize} is just a (\LUAMETATEX) status variable that hold
+the initial \type {\pagegoal} but it might play a role in future extensions.
+
+Another variable is \type {\deadcycles} that registers the number of times the
+output routine is called without returning result.
+
+\stopsectionlevel
+
+\startsectionlevel[title=Inserts]
+
+We now come to inserts. In traditional \TEX\ an insert is a data structure that
+runs on top of registers: a box, count, dimension and skip. An insert is accessed
+by a number so for instance insert 123 will use the four registers of that
+number. Because \TEX\ only offers a command alias mechanism for registers (like
+\type {\countdef}) a macro package will implement some allocator management
+subsystem (like \type {\newcount}). A \type {\newinsert} has to be defined in a
+way that the four registers are not clashing with other allocators. When you
+start with \TEX\ seeing code that deals with in (in plain \TEX) can be puzzling
+but it follows from the way \TEX\ is set up. But inserts are probably not what
+you start exploring right away away.
+
+In \LUAMETATEX\ you can set \type {\insertmode} to 1 and that is what we do in
+\CONTEXT. In that mode inserts are taken from a pool instead of registers. A side
+effect is that like the page properties the insert properties are global too but
+that is normally no problem and can be managed well by a macro package (that
+probably would assign register the values globally too). The insert pool will
+grow dynamically on demand so one can just start at 1; in \CONTEXT\ \MKIV\ we use
+the range 127 upto 255 in order to avoid a clash with registers. In \LMTX\ we start
+at 1 because there are no clashes.
+
+A consequence of this approach is that we use dedicated commands to set the insert
+properties:
+
+\starttabulate[|l|l|p|]
+\NC \type {\insertdistance} \NC glue \NC the space before the first instance (on a page) \NC \NR
+\NC \type {\insertmultiplier} \NC count \NC a factor that is used to calculate the height used \NC \NR
+\NC \type {\insertlimit} \NC dimen \NC the maximum amount of space on a page to be taken \NC \NR
+\NC \type {\insertpenalty} \NC count \NC the floating penalty (used when set) \NC \NR
+\NC \type {\insertmaxdepth} \NC dimen \NC the maximum split depth (used when set) \NC \NR
+\NC \type {\insertstorage} \NC count \NC signals that the insert has to be stored for later \NC \NR
+\NC \type {\insertheight} \NC dimen \NC the accumulated height of the inserts so far \NC \NR
+\NC \type {\insertdepth} \NC dimen \NC the current depth of the inserts so far \NC \NR
+\NC \type {\insertwidth} \NC dimen \NC the width of the inserts \NC \NR
+\stoptabulate
+
+These commands take a number and an integer, dimension or glue specification.
+They can be set and queried but setting the dimensions can have side effects. The
+accumulated height of the inserts is available in \type {\insertheights} (which
+can be set too). The \type {\floatingpenalty} variable determines the penalty
+applied when a split is needed.
+
+In the output routine the original \TEX\ variable \type {\insertpenalties} is a
+counter that keeps the number of insertions that didn't fit on the page while
+otherwise if has the accumulated penalties of the split insertions. When \type
+{\holdinginserts} is non zero the inserts in the list are not collected for
+output, which permits the list to be fed back for reprocessing.
+
+The \LUAMETATEX\ specific storage mode \type {\insertstoring} variable is
+explained in the next section.
+
+\stopsectionlevel
+
+\startsectionlevel[title=Storing]
+
+This feature is kind of special and still experimental. When \type
+{\insertstoring} is set 1, all inserts that have their storage flag set will be
+saved. Think of a multi column setup where inserts have to end up in the last
+column. If there are three columns, the first two will store inserts. Then when
+the last column is dealt with \type {\insertstoring} can be set to 2 and that
+will signal the builder that we will inject the inserts. In both cases, the value
+of this register will be set to zero so that it doesn't influence further
+processing.
+
+\stopsectionlevel
+
+\startsectionlevel[title=Callbacks]
+
+{\em Todo, nothing new there, so no hurry.}
+
+\stopsectionlevel
+
+\stopdocument