From eedd3462bb4e7d16146d00683c3a85d1f74fe1fe Mon Sep 17 00:00:00 2001
From: Marius <mariausol@gmail.com>
Date: Wed, 27 Jun 2012 16:00:15 +0300
Subject: beta 2012.06.27 14:37

---
 tex/context/base/cont-new.mkii                     |   2 +-
 tex/context/base/cont-new.mkiv                     |   2 +-
 tex/context/base/context-version.pdf               | Bin 4147 -> 4149 bytes
 tex/context/base/context-version.png               | Bin 106247 -> 106143 bytes
 tex/context/base/context.mkii                      |   2 +-
 tex/context/base/context.mkiv                      |   7 +-
 tex/context/base/core-var.mkiv                     |   8 +-
 tex/context/base/font-aux.mkvi                     | 101 +++
 tex/context/base/font-pre.mkiv                     |   2 +
 tex/context/base/font-set.mkvi                     |   2 +-
 tex/context/base/grph-epd.mkiv                     |   4 +-
 tex/context/base/lpdf-ren.lua                      |   9 +-
 tex/context/base/m-oldfun.mkiv                     | 714 ++++++++++++++++++++
 tex/context/base/m-oldnum.mkiv                     | 416 ++++++++++++
 tex/context/base/mult-dim.mkvi                     |   1 +
 tex/context/base/node-fin.lua                      |  32 +-
 tex/context/base/spac-ali.mkiv                     |   4 +
 tex/context/base/spac-def.mkiv                     |  77 +--
 tex/context/base/spac-grd.mkiv                     |  51 +-
 tex/context/base/spac-hor.mkiv                     |  33 +-
 tex/context/base/spac-ver.mkiv                     |  46 +-
 tex/context/base/status-files.pdf                  | Bin 24505 -> 24491 bytes
 tex/context/base/status-lua.pdf                    | Bin 182500 -> 182544 bytes
 tex/context/base/status-mkiv.lua                   |  34 +-
 tex/context/base/supp-fun.mkiv                     | 716 ---------------------
 tex/context/base/supp-mat.mkiv                     |  88 +--
 tex/context/base/supp-num.mkiv                     | 416 ------------
 tex/context/base/syst-aux.mkiv                     |   5 +-
 tex/context/base/trac-vis.lua                      | 234 +++++--
 tex/context/base/trac-vis.mkiv                     |  31 +-
 tex/generic/context/luatex/luatex-fonts-merged.lua |   2 +-
 31 files changed, 1641 insertions(+), 1398 deletions(-)
 create mode 100644 tex/context/base/font-aux.mkvi
 create mode 100644 tex/context/base/m-oldfun.mkiv
 create mode 100644 tex/context/base/m-oldnum.mkiv
 delete mode 100644 tex/context/base/supp-fun.mkiv
 delete mode 100644 tex/context/base/supp-num.mkiv

diff --git a/tex/context/base/cont-new.mkii b/tex/context/base/cont-new.mkii
index 3ee2a446c..f3f3b26ea 100644
--- a/tex/context/base/cont-new.mkii
+++ b/tex/context/base/cont-new.mkii
@@ -11,7 +11,7 @@
 %C therefore copyrighted by \PRAGMA. See mreadme.pdf for
 %C details.
 
-\newcontextversion{2012.06.26 10:59}
+\newcontextversion{2012.06.27 14:37}
 
 %D This file is loaded at runtime, thereby providing an
 %D excellent place for hacks, patches, extensions and new
diff --git a/tex/context/base/cont-new.mkiv b/tex/context/base/cont-new.mkiv
index f3227b9c6..88a51e1c4 100644
--- a/tex/context/base/cont-new.mkiv
+++ b/tex/context/base/cont-new.mkiv
@@ -11,7 +11,7 @@
 %C therefore copyrighted by \PRAGMA. See mreadme.pdf for
 %C details.
 
-\newcontextversion{2012.06.26 10:59}
+\newcontextversion{2012.06.27 14:37}
 
 %D This file is loaded at runtime, thereby providing an
 %D excellent place for hacks, patches, extensions and new
diff --git a/tex/context/base/context-version.pdf b/tex/context/base/context-version.pdf
index 6158e4aee..f9ca424c5 100644
Binary files a/tex/context/base/context-version.pdf and b/tex/context/base/context-version.pdf differ
diff --git a/tex/context/base/context-version.png b/tex/context/base/context-version.png
index 1b1cacf07..9d7298d86 100644
Binary files a/tex/context/base/context-version.png and b/tex/context/base/context-version.png differ
diff --git a/tex/context/base/context.mkii b/tex/context/base/context.mkii
index 62880781a..57c82a2dd 100644
--- a/tex/context/base/context.mkii
+++ b/tex/context/base/context.mkii
@@ -20,7 +20,7 @@
 %D your styles an modules.
 
 \edef\contextformat {\jobname}
-\edef\contextversion{2012.06.26 10:59}
+\edef\contextversion{2012.06.27 14:37}
 
 %D For those who want to use this:
 
diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv
index 279920315..847b6d460 100644
--- a/tex/context/base/context.mkiv
+++ b/tex/context/base/context.mkiv
@@ -23,7 +23,7 @@
 %D up and the dependencies are more consistent.
 
 \edef\contextformat {\jobname}
-\edef\contextversion{2012.06.26 10:59}
+\edef\contextversion{2012.06.27 14:37}
 
 %D For those who want to use this:
 
@@ -150,12 +150,12 @@
 \loadmarkfile{supp-box}
 
 %loadmarkfile{supp-vis} % replaced by trac-vis
-\loadmarkfile{supp-fun} % close to obsolete
+%loadmarkfile{supp-fun} % mostly replaced
 
 \loadmarkfile{supp-ran}
 \loadmarkfile{supp-mat}
 \loadmarkfile{spac-cha}
-\loadmarkfile{supp-num} % replaced
+%loadmarkfile{supp-num} % obsolete
 
 \loadmarkfile{typo-ini}
 
@@ -349,6 +349,7 @@
 \loadmarkfile{font-uni}
 \loadmkvifile{font-col}
 \loadmkvifile{font-gds}
+\loadmkvifile{font-aux}
 
 \loadmarkfile{lxml-css}
 
diff --git a/tex/context/base/core-var.mkiv b/tex/context/base/core-var.mkiv
index 26559f246..854c07867 100644
--- a/tex/context/base/core-var.mkiv
+++ b/tex/context/base/core-var.mkiv
@@ -59,8 +59,12 @@
 \newtoks \everyforgetall
 \newtoks \everycleanupfeatures
 
-\def\cleanupfeatures{\the\everycleanupfeatures}
-\def\forgetall      {\the\everyforgetall}
+\unexpanded\def\cleanupfeatures{\the\everycleanupfeatures}
+\unexpanded\def\forgetall      {\the\everyforgetall}
+
+\appendtoks
+    \everypar\emptytoks % pretty important
+\to \everyforgetall
 
 %D Page building:
 
diff --git a/tex/context/base/font-aux.mkvi b/tex/context/base/font-aux.mkvi
new file mode 100644
index 000000000..50cc4a258
--- /dev/null
+++ b/tex/context/base/font-aux.mkvi
@@ -0,0 +1,101 @@
+%D \module
+%D   [       file=font-gds,
+%D        version=2012.06.26,
+%D          title=\CONTEXT\ Font Support,
+%D       subtitle=Helpers,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Font Support / Helpers}
+
+%D Here we collect code moved from other files, like some of the
+%D support modules.
+
+\unprotect
+
+%D \macros
+%D   {normalizefontheight,normalizefontwidth,normalizedfontsize}
+%D
+%D Next we introduce some font manipulation macros. When we
+%D want to typeset some text spread in a well defined area, it
+%D can be considered bad practice to manipulate character and
+%D word spacing. In such situations the next few macros can be
+%D of help:
+%D
+%D \starttyping
+%D \normalizefontheight \name {sample text} {height} {font}
+%D \normalizefontwidth  \name {sample text} {width}  {font}
+%D \stoptyping
+%D
+%D Consider for instance:
+%D
+%D \startbuffer[a]
+%D \NormalizeFontHeight \TempFont {X} {2\baselineskip} {Serif}
+%D \stopbuffer
+%D
+%D \startbuffer[b]
+%D \ruledhbox{\TempFont To Be Or Not To Be}
+%D \stopbuffer
+%D
+%D \typebuffer[a,b] \getbuffer[a]
+%D
+%D This shows up as:
+%D
+%D \startlinecorrection
+%D \ruledhbox{\getbuffer[b]}
+%D \stoplinecorrection
+%D
+%D The horizontal counterpart is:
+%D
+%D \startbuffer[a]
+%D \NormalizeFontWidth \TempFont {This Line Fits} {\hsize} {Serif}
+%D \stopbuffer
+%D
+%D \startbuffer[b]
+%D \ruledhbox{\TempFont This Line Fits}
+%D \stopbuffer
+%D
+%D \typebuffer[a,b] \getbuffer[a]
+%D
+%D This gives:
+%D
+%D \startlinecorrection
+%D \ruledhbox{\getbuffer[b]}
+%D \stoplinecorrection
+%D
+%D The calculated font scale is avaliable in \type {\normalizedfontsize}.
+
+\unexpanded\def\font_helpers_normalize_size#what#cs#text#width#specification%
+  {\bgroup
+   \setbox\scratchbox\hbox{\definedfont[#specification at 10pt]#text}%
+   \normalexpanded{\egroup\edef\noexpand\normalizedfontsize
+     {\the\dimexpr\ifdim\wd\scratchbox>\zeropoint
+        \luaexpr{\number\dimexpr10pt\relax*\number\dimexpr#width\relax/\number#what\scratchbox}\scaledpoint
+      \else
+        \bodyfontsize
+      \fi\relax}}%
+   \definefont[\strippedcsname#cs][#specification at \normalizedfontsize]}
+
+\def\NormalizedFontSize{\bodyfontsize}
+
+\unexpanded\def\normalizefontwidth {\font_helpers_normalize_size\wd}
+\unexpanded\def\normalizefontheight{\font_helpers_normalize_size\ht}
+\unexpanded\def\normalizefontdepth {\font_helpers_normalize_size\dp}
+\unexpanded\def\normalizefontline  {\font_helpers_normalize_size\htdp}
+
+\unexpanded\def\widthspanningtext #text#width#specification{\hbox{\normalizefontwidth \temp{#text}{#width}{#specification}\temp#text}}
+\unexpanded\def\heightspanningtext#text#width#specification{\hbox{\normalizefontheight\temp{#text}{#width}{#specification}\temp#text}}
+\unexpanded\def\depthspanningtext #text#width#specification{\hbox{\normalizefontdepth \temp{#text}{#width}{#specification}\temp#text}}
+\unexpanded\def\linespanningtext  #text#width#specification{\hbox{\normalizefontline  \temp{#text}{#width}{#specification}\temp#text}}
+
+\let\NormalizeFontHeight   \normalizefontheight
+\let\NormalizeFontWidth    \normalizefontwidth
+\let\WidthSpanningText     \widthspanningtext
+\def\TheNormalizedFontSize{\normalizefontsize}
+
+\protect \endinput
diff --git a/tex/context/base/font-pre.mkiv b/tex/context/base/font-pre.mkiv
index e5999df14..8288ef412 100644
--- a/tex/context/base/font-pre.mkiv
+++ b/tex/context/base/font-pre.mkiv
@@ -178,6 +178,7 @@
 \definecolor[trace:m][m=.75,t=.5,a=1]
 \definecolor[trace:y][y=.75,t=.5,a=1]
 \definecolor[trace:s][s=.75,t=.5,a=1]
+\definecolor[trace:o][r=1,g=.6,b=.1,t=.5,a=1]
 
 \definecolor[trace:dr][r=.75,t=.75,a=1]
 \definecolor[trace:dg][g=.75,t=.75,a=1]
@@ -186,6 +187,7 @@
 \definecolor[trace:dm][m=.75,t=.75,a=1]
 \definecolor[trace:dy][y=.75,t=.75,a=1]
 \definecolor[trace:ds][s=.75,t=.75,a=1]
+\definecolor[trace:do][r=1,g=.6,b=.1,t=.75,a=1]
 
 %D Now we're up to some definitions.
 
diff --git a/tex/context/base/font-set.mkvi b/tex/context/base/font-set.mkvi
index 8e4044267..c5450a152 100644
--- a/tex/context/base/font-set.mkvi
+++ b/tex/context/base/font-set.mkvi
@@ -121,7 +121,7 @@
 \unexpanded\def\font_preloads_fourth_stage
   {\begingroup
    %ifzeropt\fontcharwd\font\number`!\relax
-   \setbox\scratchbox\hbox{context}%
+   \setbox\scratchbox\hbox{checking fonts}%
    \ifzeropt\wd\scratchbox
      \writeline
      \writestatus\m!fonts{!! No bodyfont has been defined and no defaults have been}%
diff --git a/tex/context/base/grph-epd.mkiv b/tex/context/base/grph-epd.mkiv
index 26c07e731..f8e7461c2 100644
--- a/tex/context/base/grph-epd.mkiv
+++ b/tex/context/base/grph-epd.mkiv
@@ -22,7 +22,7 @@
 \defineoverlay[system:graphics:epdf][\directsetup{system:graphics:epdf}]
 
 \startsetups system:graphics:epdf
-    \ctxlua{figures.mergegoodies("\externalfigureparameter\c!interaction")}%
+    \ctxlua{figures.mergegoodies("\externalfiguresparameter\c!interaction")}%
     \reference[\figurereference]{}% todo: dest area
 \stopsetups
 
@@ -39,7 +39,7 @@
 
 \appendtoks
     \iflocation
-      \doif\figurefiletype{pdf}{\doifnot{\externalfigureparameter\c!interaction}\v!none\grph_epdf_add_overlay}%
+      \doif\figurefiletype{pdf}{\doifnot{\externalfiguresparameter\c!interaction}\v!none\grph_epdf_add_overlay}%
     \fi
 \to \externalfigurepostprocessors
 
diff --git a/tex/context/base/lpdf-ren.lua b/tex/context/base/lpdf-ren.lua
index 29b78313f..6ffdf8110 100644
--- a/tex/context/base/lpdf-ren.lua
+++ b/tex/context/base/lpdf-ren.lua
@@ -108,6 +108,7 @@ end
 local pdfln, pdfld = { }, { }
 local textlayers, hidelayers, videlayers = pdfarray(), pdfarray(), pdfarray()
 local pagelayers, pagelayersreference, cache = nil, nil, { }
+local alphabetic = { }
 
 local specifications = { }
 local initialized    = { }
@@ -152,6 +153,7 @@ local function useviewerlayer(name) -- move up so that we can use it as local
             cache[#cache+1] = { dn, dd }
             pdfld[tag] = dr
             textlayers[#textlayers+1] = nr
+            alphabetic[tag] = nr
             if specification.visible == v_start then
                 videlayers[#videlayers+1] = nr
             else
@@ -188,11 +190,16 @@ local function flushtextlayers()
             pdfflushobject(ci[1],ci[2])
         end
         if textlayers and #textlayers > 0 then -- we can group them if needed, like: layout
+            local sortedlayers = { }
+            for k, v in table.sortedhash(alphabetic) do
+                sortedlayers[#sortedlayers+1] = v -- maybe do a proper numeric sort as well
+            end
             local d = pdfdictionary {
                 OCGs = textlayers,
                 D    = pdfdictionary {
                     Name      = "Document",
-                    Order     = (viewerlayers.hasorder and textlayers) or nil,
+                 -- Order     = (viewerlayers.hasorder and textlayers) or nil,
+                    Order     = (viewerlayers.hasorder and sortedlayers) or nil,
                     ON        = videlayers,
                     OFF       = hidelayers,
                     BaseState = pdf_on,
diff --git a/tex/context/base/m-oldfun.mkiv b/tex/context/base/m-oldfun.mkiv
new file mode 100644
index 000000000..1c5a1d29d
--- /dev/null
+++ b/tex/context/base/m-oldfun.mkiv
@@ -0,0 +1,714 @@
+%D \module
+%D   [       file=m-oldfun, % was: supp-fun
+%D        version=1995.10.10,
+%D          title=\CONTEXT\ Support Macros,
+%D       subtitle=Fun Stuff,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\unprotect
+
+%D Beware, these macros wil be replaced and at some point this
+%D module will not be preloaded any more.
+
+%D This module implements some typographics tricks that can
+%D be fun when designing document layouts. The examples use
+%D macros that are typical to \CONTEXT, but non \CONTEXT\
+%D users can use the drop caps and first line treatment
+%D macros without problems. This module will be extended
+%D when the need for more of such tricks arises.
+
+\writestatus{loading}{ConTeXt Support Macros / Fun Stuff}
+
+%D \macros
+%D   {DroppedCaps, DroppedString, DroppedIndent, DroppedLines}
+%D
+%D \startbuffer
+%D \DroppedCaps
+%D   {\color[green]} {SerifBold}
+%D   {\the\dimexpr2.2\baselineskip} {2pt} {\the\baselineskip} {2}
+%D   Let's start
+%D \stopbuffer
+%D
+%D \getbuffer with dropped caps, those blown up first
+%D characters of a paragraph. It's hard to implement a general
+%D mechanism that suits all situations, but dropped caps are so
+%D seldomly used that we can permit ourselves a rather user
+%D unfriendly implementation.
+%D
+%D \typebuffer
+%D
+%D As we will see, there are 7 different settings involved. The
+%D first argument takes a command that is used to do whatever
+%D fancy things we want to do, but normally this one will be
+%D empty. The second argument takes the font. Because we're
+%D dealing with something very typographic, there is no real
+%D reason to adopt complicated font switching schemes, a mere
+%D name will do. Font encodings can bring no harm, because the
+%D alphanumeric characters are nearly always located at their
+%D natural position in the encoding vector.
+%D
+%D \startbuffer
+%D \DroppedCaps
+%D   {\color[red]} {SerifBold}
+%D   {\the\baselineskip} {0pt} {0pt} {1}
+%D   This simple
+%D \stopbuffer
+%D
+%D \getbuffer case shows us what happens when we apply minimal
+%D values. Here we used:
+%D
+%D \typebuffer
+%D
+%D \startbuffer
+%D \DroppedCaps
+%D   {\color[red]} {SerifBold}
+%D   {\the\dimexpr2\baselineskip} {0pt} {\the\baselineskip} {2}
+%D   Is this ugly
+%D \stopbuffer
+%D
+%D \getbuffer example the third argument tells
+%D this macro that we want a dropped capital scaled to the
+%D baseline distance. The two zero point arguments are the
+%D horizontal and vertical offsets and the last arguments
+%D determines the hanging indentation. In this paragraph we
+%D set the height to two times the baselinedistance and use
+%D two hanging lines:
+%D
+%D \typebuffer
+%D
+%D Here, the first character is moved down one baseline. Here
+%D we also see why the horizontal offset is important. The
+%D first example (showing the~L) sets this to a few points and
+%D also used a slightly larger height.
+%D
+%D Of course common users (typist) are not supposed to see this
+%D kind of fuzzy definitions, but fortunately \TEX\ permits us
+%D to hide them in macros. Using a macro also enables us to
+%D garantee consistency throughout the document:
+%D
+%D \startbuffer
+%D \def\MyDroppedCaps%
+%D   {\DroppedCaps
+%D      {\color[green]} {SerifBold}
+%D      {\the\dimexpr5\baselineskip} {3pt} {\the\dimexpr3\baselineskip} {4}}
+%D
+%D \MyDroppedCaps The implementation
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \getbuffer of the general macro is rather simple and only
+%D depends on the arguments given and the dimensions of the
+%D strut box. We explicitly load the font, which is no problem
+%D because \TEX\ does not load a font twice. We could have
+%D combined some arguments, like the height, vertical offset
+%D and the number of lines, but the current implementation
+%D proved to be the most flexible. One should be aware of the
+%D fact that the offsets depend on the design of the glyphs
+%D used.
+
+\let\DroppedIndent\!!zeropoint \def\DroppedLines{0}
+
+\def\DroppedString{ABCDEFGHIJKLMNOPQRSTUVWXYZ}
+
+\let\globaldropcaps\global % will be an option, but on by default
+
+\unexpanded\def\localdropcaps{\let\globaldropcaps\relax}
+
+\chardef\DroppedStatus = 0 % 0=done 1=starting 2=doing 3=error
+\chardef\DropMode      = 0 % 1 == marginhang
+
+\ifx\keeplinestogether\undefined
+  \let\keeplinestogether\gobbleoneargument
+\fi
+
+\unexpanded\def\DroppedCaps#1#2#3#4#5#6#7% does not yet handle accented chars
+  {\defconvertedargument\asciia{#7}%
+   \defconvertedcommand \asciib{\DroppedString}%
+   \doifinstringelse\asciia\asciib
+     {\noindentation
+      \dontleavehmode
+      \checkindentation % redo this one
+     %\ifhmode\hskip-\parindent\fi % sensitive for context mechanism
+      \keeplinestogether{#6}%
+      \setbox0\hbox{\definedfont[#2 at #3]#1{#7}\hskip#4}%
+      \ifdim\dp0>\strutdp % one of those Q's , will be option
+        \setbox2\hbox{\raise\dp0\hbox{\lower\strutdp\copy0}}%
+        \ht2\ht0
+        \dp0\strutdp
+        \setbox0\box2
+      \fi
+      \setbox0\hbox
+        {\ifnum\DropMode=\plusone
+           \hskip-\wd0\wd0\zeropoint
+         \fi
+         \lower#5\box0}%
+      \ht0\strutht
+      \dp0\strutdp
+      \ifnum\DropMode=\plusone
+        \globaldropcaps\let\DroppedIndent\!!zeropoint
+        \globaldropcaps\edef\DroppedLines{\number\maxdimen}%
+        \globaldropcaps\chardef\DroppedStatus\plusthree
+      \else
+        \globaldropcaps\edef\DroppedIndent{\the\wd0}%
+        \globaldropcaps\edef\DroppedLines {\number#6}%
+        \globaldropcaps\chardef\DroppedStatus\plustwo
+        \globaldropcaps\hangindent\DroppedIndent
+        \globaldropcaps\hangafter-\DroppedLines
+%         \noindent
+        \noindentation
+        \checkindentation % redo this one
+        \hskip-\DroppedIndent
+      \fi
+      \vbox{\forgetall\box0}%
+      \nobreak
+      \let\next\ignorespaces} % Could be a one character word !
+     {\globaldropcaps\let\DroppedIndent\!!zeropoint
+      \globaldropcaps\edef\DroppedLines{\number\maxdimen}%
+      \globaldropcaps\chardef\DroppedStatus\plusthree
+      \def\next{#7}}%
+   \let\globaldropcaps\global
+   \next}
+
+%D Before we go to the next topic, we summarize this command:
+%D
+%D \starttyping
+%D \DroppedCaps
+%D   {command} {font}
+%D   {height} {hoffset} {voffset} {lines}
+%D \stoptyping
+%D
+%D Sometimes you need to make sure that the global settings are
+%D kept local, as in:
+%D
+% %D \startbuffer
+% %D \defineparagraphs[SomePar][n=2,rule=on]
+% %D \setupparagraphs [SomePar][1][width=.5\textwidth]
+% %D \setupparagraphs [SomePar][2][width=.5\textwidth]
+%D \startbuffer
+%D \defineparagraphs[SomePar][n=2,rule=on]
+%D \setupparagraphs [SomePar][1][width=.5\textwidth]
+%D \setupparagraphs [SomePar][2][width=.5\textwidth]
+%D
+%D \startSomePar
+%D   \localdropcaps\NiceDroppedCaps{}{cmr12}{0pt}{2}Here we need
+%D   to explicitly keep the hanging indentation local, like it or
+%D   not.
+%D \SomePar
+%D   \localdropcaps\NiceDroppedCaps{}{cmr12}{0pt}{2}Here we need
+%D   to explicitly keep the hanging indentation local, like it or
+%D   not.
+%D \stopSomePar
+%D \stopbuffer
+%D
+%D \typebuffer \getbuffer
+
+%D \macros
+%D   {AutoDroppedCaps, CheckDroppedCaps}
+%D
+%D {\em To be documented.}
+
+% example usage
+%
+% \def\bpar{\ifvmode\CheckDroppedCaps\fi}
+% \def\epar{\ifhmode\par\fi\CheckDroppedCaps}
+
+\newcount\lastprevgraf
+\newcount\droppedlines
+
+\unexpanded\def\CheckDroppedCaps
+  {\global\lastprevgraf\prevgraf}
+
+\unexpanded\def\AutoDroppedCaps % will be proper core stuff since it
+  {\globaldropcaps\chardef\DroppedStatus\plusone
+   \global\lastprevgraf\zerocount
+   \global\droppedlines\zerocount
+   \EveryPar{\doAutoDroppedCaps}}
+
+\let\AutoDroppedNext\relax
+
+\ifx\AutoDroppedCapsCommand\undefined
+    \unexpanded\def\AutoDroppedCapsCommand{\NiceDroppedCaps{}{SerifBold}{.125em}{3}}
+\fi
+
+\unexpanded\def\doAutoDroppedCaps
+  {\ifcase\DroppedStatus % done
+     \let\next\relax
+   \or % starting
+   % \ifnum\lastprevgraf>0 % tricky, probably a wrong par
+   %   \globaldropcaps\chardef\DroppedStatus=3 % and inhibits dropped
+   %   \let\next\relax % caps after titles and more than once
+   % \else % so let's nill this rubishly code fragment
+       \let\next\AutoDroppedCapsCommand
+   % \fi % and hope for the best
+   \or % doing
+     \global\advance\droppedlines \lastprevgraf
+     \ifnum\droppedlines=\zerocount
+       \globaldropcaps\chardef\DroppedStatus\zerocount
+       \let\next\relax
+     \else\ifnum\droppedlines>\zerocount
+       \ifnum\droppedlines<\DroppedLines\relax
+         \globaldropcaps\hangindent\DroppedIndent
+         \globaldropcaps\hangafter-\DroppedLines
+         \globaldropcaps\advance\hangafter \droppedlines
+         \hskip-\parindent % brrr
+         \let\next\AutoDroppedNext
+       \else
+         \globaldropcaps\chardef\DroppedStatus\zerocount
+         \let\next\relax
+       \fi
+     \else
+       \globaldropcaps\chardef\DroppedStatus\zerocount
+       \let\next\relax
+     \fi\fi
+   \or % error
+     \globaldropcaps\chardef\DroppedStatus\zerocount
+     \let\next\relax
+   \fi
+   \next}
+
+%D \macros
+%D   {LineDroppedCaps, NiceDroppedCaps}
+%D
+%D To save definitions, we also provide:
+%D
+%D \starttyping
+%D \LineDroppedCaps {command} {font} {hoffset} {lines}
+%D \NiceDroppedCaps {command} {font} {hoffset} {lines}
+%D \stoptyping
+%D
+%D The first command scales the font to the exact height, while
+%D the second command scales the font to a nice 2.5 times the
+%D line height, a value that gives a pleasant grayness.
+
+\unexpanded\def\DoLineDroppedCaps#1#2#3#4#5% compensation command font offset lines
+  {\scratchcounter#5%
+   \advance\scratchcounter \minusone
+   \scratchdimen\scratchcounter\baselineskip
+   \advance\scratchdimen #1%
+   \NormalizeFontHeight\DummyFont{W}\scratchdimen{#3}%
+   \DroppedCaps{#2}{#3}\TheNormalizedFontSize{#4}
+     {\scratchcounter\baselineskip}{#5}}
+
+\unexpanded\def\LineDroppedCaps% command font offset lines
+  {\DoLineDroppedCaps{\strutht}}
+
+\unexpanded\def\NiceDroppedCaps% command font offset lines
+  {\DoLineDroppedCaps{.5\baselineskip}}
+
+%D \macros
+%D   {TreatFirstLine}
+%D
+%D \startbuffer
+%D \TreatFirstLine {\sc} {} {} {}
+%D Instead of limiting its action to one token, the next macro
+%D treats the whole first line. This paragraph was typeset by
+%D saying:
+%D \stopbuffer
+%D
+%D \getbuffer
+%D
+%D \typebuffer
+%D
+%D \startbuffer
+%D \TreatFirstLine {\startcolor[red]\bf} {\stopcolor} {} {}
+%D The combined color and font effect is also possible,
+%D although one must be careful in using macros that accumulate
+%D grouping, but the commands used here are pretty save in that
+%D respect.
+%D \stopbuffer
+%D
+%D \getbuffer
+%D
+%D \typebuffer
+%D
+%D Before we explain the third and fourth argument, we show the
+%D implementation. Those who know a bit about the way \TEX\
+%D treats tokens, will probably see in one glance that this
+%D alternative works all right for most text||only situations
+%D in which there is enough text available for the first line,
+%D but that more complicated things will blow. One has to live
+%D with that. A workaround is rather trivial but obscures the
+%D principles used.
+
+\unexpanded\def\TreatFirstLine#1#2#3#4% before, after, first, next
+  {\leavevmode
+   \bgroup
+   \forgetall
+   \bgroup
+   #1%
+   \setbox0\emptybox
+   \setbox2\emptybox
+   \def\grabfirstline##1 %
+     {\setbox2\hbox
+        {\ifvoid0
+           {#3{\ignorespaces##1}}%
+         \else
+           \unhcopy0\ {#4{##1}}%
+         \fi}%
+      \ifdim\wd2=\zeropoint
+        \setbox0\emptybox
+        \setbox2\emptybox
+        \@EA\grabfirstline
+      \else\ifdim\wd2>\hsize
+        \hbox to \hsize{\strut\unhbox0}#2\egroup
+        \break##1\
+        \egroup
+      \else
+        \setbox0\box2
+        \@EAEAEA\grabfirstline
+      \fi\fi}%
+   \grabfirstline}
+
+%D \startbuffer
+%D \gdef\FunnyCommand
+%D   {\getrandomfloat\FunnyR{0}{1}%
+%D    \getrandomfloat\FunnyG{0}{1}%
+%D    \getrandomfloat\FunnyB{0}{1}%
+%D    \definecolor[FunnyColor][r=\FunnyR,g=\FunnyG,b=\FunnyB]%
+%D    \color[FunnyColor]}
+%D
+%D %\TreatFirstLine {\bf} {} {\FunnyCommand} {\FunnyCommand}
+%D The third and fourth argument can be used to gain special
+%D effects on the individual words. Of course one needs ...
+%D \stopbuffer
+%D
+%D \getbuffer
+%D to know a bit more about the macro package used to get real
+%D nice effects, but this example probably demonstrates the
+%D principles well.
+%D
+%D \typebuffer
+%D
+%D Like in dropped caps case, one can hide such treatments in a
+%D macro, like:
+%D
+%D \starttyping
+%D \def\MyTreatFirstLine%
+%D   {\TreatFirstLine{\bf}{}{\FunnyCommand}{\FunnyCommand}}
+%D \stoptyping
+
+%D \macros
+%D   {reshapebox}
+%D
+%D \startbuffer
+%D \beginofshapebox
+%D When using \CONTEXT, one can also apply this funny command
+%D to whole lines by using the reshape mechanism. Describing
+%D this interesting mechanism falls outside the scope of this
+%D module, so we only show the trick. This is an example of
+%D low level \CONTEXT\ functionality: it's all there, and it's
+%D stable, but not entirely meant for novice users.
+%D \endofshapebox
+%D
+%D \reshapebox{\FunnyCommand{\box\shapebox}} \flushshapebox
+%D \stopbuffer
+%D
+%D \getbuffer
+%D
+%D \typebuffer
+%D
+%D This mechanism permits hyphenation and therefore gives
+%D better results than the previously discussed macro
+%D \type{\TreatFirstLine}.
+
+%D \macros
+%D   {TreatFirstCharacter}
+%D
+%D \startbuffer
+%D \TreatFirstCharacter{\bf\color[green]} Just to be
+%D \stopbuffer
+%D
+%D \getbuffer complete we also offer a very simple one
+%D character alternative, that is not that hard to understand:
+
+\unexpanded\def\TreatFirstCharacter#1#2% command, character
+  {{#1{#2}}}
+
+%D A previous paragraph started with:
+%D
+%D \typebuffer
+
+%D \macros
+%D   {StackCharacters}
+%D
+%D The next hack deals with vertical stacking.
+
+\unexpanded\def\StackCharacters#1#2#3#4% sequence vsize vskip command
+  {\vbox #2
+     {\forgetall
+      \baselineskip\zeropoint
+      \def\StackCharacter##1{#4{##1}\cr\noalign{#3}}%
+      \halign
+        {\hss##\hss&##\cr
+         \handletokens#1\with\StackCharacter\cr}}}
+
+%D \startbuffer
+%D \StackCharacters{CONTEXT}{}{\vskip.2ex}{\FunnyCommand}
+%D \stopbuffer
+%D
+%D Such a stack looks like:
+%D
+%D \startlinecorrection
+%D \hbox to \hsize
+%D    {$\hss\bfd
+%D     \vcenter{\StackCharacters{TEX}    {}{\vskip.2ex}{\FunnyCommand}}%
+%D     \hss
+%D     \vcenter{\StackCharacters{CON}    {}{\vskip.2ex}{\FunnyCommand}}
+%D     \hss
+%D     \vcenter{\StackCharacters{TEXT}   {}{\vskip.2ex}{\FunnyCommand}}
+%D     \hss
+%D     \vcenter{\StackCharacters{CONTEXT}{}{\vskip.2ex}{\FunnyCommand}}
+%D     \hss$}
+%D \stoplinecorrection
+%D
+%D and is typeset by saying:
+%D
+%D \typebuffer
+%D
+%D An alternative would have been
+%D
+%D \starttyping
+%D \StackCharacters {CONTEXT} {to 5cm} {\vfill} {\FunnyCommand}
+%D \stoptyping
+
+%D \macros
+%D   {processtokens}
+%D
+%D At a lower level horizontal and vertical manipulations are
+%D already supported by:
+%D
+%D \starttyping
+%D \processtokens {begin} {between} {end} {space} {text}
+%D \stoptyping
+%D
+%D \startbuffer[a]
+%D \processtokens
+%D   {\hbox to .5\hsize\bgroup} {\hfill}
+%D   {\egroup} {\space} {LET'S HAVE}
+%D \stopbuffer
+%D
+%D \startbuffer[b]
+%D \processtokens
+%D   {\vbox\bgroup\raggedcenter\hsize1em}
+%D   {\vskip.25ex} {\egroup} {\strut} {FUN}
+%D \stopbuffer
+%D
+%D This macro is able to typeset:
+%D
+%D \leavevmode\hbox to \hsize
+%D   {$\hfil\hfil
+%D    \vcenter{\bf\getbuffer[a]}%
+%D    \hfil
+%D    \vcenter{\bfd\getbuffer[b]}%
+%D    \hfil\hfil$}
+%D
+%D which was specified as:
+%D
+%D \typebuffer[a]
+%D \typebuffer[b]
+
+%D \macros
+%D   {NormalizeFontHeight, NormalizeFontWidth,
+%D    TheNormalizedFontSize}
+%D
+%D Next we introduce some font manipulation macros. When we
+%D want to typeset some text spread in a well defined area, it
+%D can be considered bad practice to manipulate character and
+%D word spacing. In such situations the next few macros can be
+%D of help:
+%D
+%D \starttyping
+%D \NormalizeFontHeight \name {sample text} {height} {font}
+%D \NormalizeFontWidth  \name {sample text} {width}  {font}
+%D \stoptyping
+%D
+%D These are implemented using an auxilliary macro:
+
+\unexpanded\def\NormalizeFontHeight{\NormalizeFontSize\ht}
+\unexpanded\def\NormalizeFontWidth {\NormalizeFontSize\wd}
+
+\unexpanded\def\NormalizeFontSize#1#2#3#4#5%
+  {\bgroup
+   \dimen0=#4% #4 can be \ht0 or so
+   \setbox0\hbox{\definedfont[#5 at 5pt]#3}% 10pt
+   \ifdim\wd0>\zeropoint
+     \dimen2=#10 % #1 is \wd or \ht
+     \dimen4=\maxdimen % 10000pt
+     \divide\dimen4 \dimen2
+     \divide\dimen0 1638 % 1000
+     \dimen0=\number\dimen4\dimen0
+     \divide \dimen0 \plustwo % ...
+     \xdef\TheNormalizedFontSize{\the\dimen0}%
+   \else
+     \dimen0\bodyfontsize
+   \fi
+   \normalexpanded{\egroup\def\noexpand#2{\definedfont[#5 at \the\dimen0]}}}
+
+%D Afterwards, we have access to the calculated size by:
+
+\let\TheNormalizedFontSize\!!zeropoint
+
+%D Extra:
+
+\unexpanded\def\WidthSpanningText#1#2#3% text width font
+  {\hbox{\NormalizeFontWidth\temp{#1}{#2}{#3}\temp\the\everydefinedfont#1}}
+
+%D Consider for instance:
+%D
+%D \startbuffer
+%D \NormalizeFontHeight \tmp {X} {2\baselineskip} {cmr10}
+%D
+%D {\tmp To Be Or Not To Be}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D This shows up as (we also show the baselines):
+%D
+%D {\showbaselines\getbuffer}
+%D
+%D The horizontal counterpart is:
+%D
+%D \startbuffer
+%D \NormalizeFontWidth \tmp {This Line Fits} {\hsize} {cmr10}
+%D
+%D \hbox{\tmp This Line Fits}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D The calculated font scale is avaliable in the macro
+%D \type{\NormalizedFontSize}.
+%D
+%D \startlinecorrection
+%D \ruledhbox{\getbuffer}
+%D \stoplinecorrection
+%D
+%D One can of course combine these macros with the ones
+%D described earlier, like in:
+%D
+%D \starttyping
+%D \NormalizeFontHeight {text} \DroppedFont {2\baselineskip} {cmbx12}
+%D
+%D \def\NicelyDroppedCaps
+%D   {\DroppedCaps
+%D      {\color[green]}
+%D      {\DroppedFont}
+%D      {2pt}
+%D      {\baselineskip}
+%D      {2}}
+%D \stoptyping
+%D
+%D It's up to the reader to test this one.
+
+\unexpanded\def\FirstNCharacters#1#2% \FirstNCharacters{3}{fr{\"o}beln}
+  {\bgroup
+   \scratchcounter\zerocount
+   \def\docommand##1%
+     {\ifnum\scratchcounter=#1\else
+        ##1\relax % catches ##1 = \"e and alike
+        \advance\scratchcounter\plusone
+      \fi}
+   \handletokens#2\with\docommand
+   \egroup}
+
+%D \macros
+%D   {FittingText}
+%D
+%D First used in Pascal (demo-bbv):
+%D
+%D \startbuffer
+%D \ruledvbox{\FittingText{3cm}{1cm}{Serif}{24pt}{1pt}{1}
+%D   {\veryraggedright
+%D    \hangindent1em\hangafter1\relax
+%D    \begstrut \dorecurse{8}{Bram Marta }\unskip \endstrut}}
+%D
+%D \ruledvbox{\FittingText{3cm}{1cm}{Serif}{24pt}{1pt}{1}
+%D   {\raggedleft\begstrut Bram\\Marta \unskip\endstrut}}
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \startlinecorrection
+%D \getbuffer
+%D \stoplinecorrection
+
+% #1 width #2 height #3 font #4 size #5 step #6 interlinie #7 text
+
+\unexpanded\def\FittingText#1#2#3#4#5#6#7%
+  {\bgroup
+   \forgetall
+   \dontcomplain
+   \setuptolerance[\v!verytolerant]% == \tolerance4500
+   \hsize#1%
+   \def\\{\softbreak}%
+   \!!heighta#4%
+   \!!heightb#2%
+   \doloop
+     {\ifdim\!!heighta>\onepoint
+        \expanded{\definefont[\s!dummy][#3 at \the\!!heighta][\c!interlinespace=#6]}%
+        \getvalue\s!dummy
+        \setbox\scratchbox\vbox{#7\endgraf}%
+        \ifdim\ht\scratchbox>\!!heightb
+          \advance\!!heighta-#5%
+        \else
+          \beginshapebox
+          \unvcopy\scratchbox
+          \endshapebox
+          \global\dimen1\hsize
+          \reshapebox
+            {\setbox\shapebox\hbox{\unhbox\shapebox}%
+             \ifdim\wd\shapebox>\dimen1
+               \global\dimen1\wd\shapebox
+             \fi}%
+          \ifdim\dimen1>\hsize
+            \advance\!!heighta-#5%
+          \else
+            \exitloop
+          \fi
+        \fi
+      \else
+        \exitloop
+      \fi}%
+  %\writestatus{\strippedcsname\FittingText}{height: \the\!!heighta}%
+   \unvbox\scratchbox
+   \egroup}
+
+% \font width gap font spec text
+
+\unexpanded\def\NormalizeFontWidthSpread#1#2#3#4#5#6%
+  {\global\setfalse\NFSpread
+   \scratchdimen#3%
+   \scratchdimen-.5\scratchdimen
+   \advance\scratchdimen#2\relax
+   \NormalizeFontWidth
+     #1%
+     {\def\+{\global\settrue\NFSpread\gobbleuntil\relax}%
+      \def\\{\gobbleuntil\relax}% newline
+      \setupspacing
+      #6\relax}%
+     {\scratchdimen}%
+     {#4}%
+   \ifconditional\NFSpread
+     % de gap valt in de binding
+   \else
+     \definefont[\strippedcsname#1][#4 #5]%
+   \fi}
+
+\unexpanded\def\SpreadGapText#1#2%
+  {{\def\+{\kern#1}#2}}
+
+\unexpanded\def\GapText#1#2#3#4#5% width distance font spec title
+  {\bgroup
+   \NormalizeFontWidthSpread\DummyFont{#1}{#2}{#3}{#4}{#5}%
+   \DummyFont\setupspacing\SpreadGapText{#2}{#5}\endgraf
+   \egroup}
+
+\protect \endinput
diff --git a/tex/context/base/m-oldnum.mkiv b/tex/context/base/m-oldnum.mkiv
new file mode 100644
index 000000000..efc0af472
--- /dev/null
+++ b/tex/context/base/m-oldnum.mkiv
@@ -0,0 +1,416 @@
+%D \module
+%D   [       file=m-oldnum, % was: supp-num
+%D        version=1998.05.15,
+%D          title=\CONTEXT\ Support Macros,
+%D       subtitle=Numbers,
+%D         author=Hans Hagen,
+%D           date=\currentdate,
+%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% See end for transition to mkiv.
+
+\writestatus{loading}{ConTeXt Support Macros / Numbers}
+
+\unprotect
+
+%D \macros
+%D   {digits, setdigitmode, setdigitsign}
+%D
+%D Depending on the digit mode the command \type {\digits}
+%D normalizes number patterns depending on the language set.
+%D
+%D \starttyping
+%D This will never be a \digits{1.000.000} seller.
+%D \stoptyping
+%D
+%D or
+%D
+%D \starttyping
+%D I will never grow longer than \digits 1.86 \Meter.
+%D \stoptyping
+%D
+%D The different modes are shown in:
+%D
+%D \startbuffer
+%D \setdigitmode 1 \digits 12.345,90 \digits 12.345.000 \digits 1,23
+%D \setdigitmode 2 \digits 12.345,90 \digits 12.345.000 \digits 1,23
+%D \setdigitmode 3 \digits 12.345,90 \digits 12.345.000 \digits 1,23
+%D \setdigitmode 4 \digits 12.345,90 \digits 12.345.000 \digits 1,23
+%D \setdigitmode 5 \digits 12.345,90 \digits 12.345.000 \digits 1,23
+%D \setdigitmode 6 \digits 12.345,90 \digits 12.345.000 \digits 1,23
+%D \stopbuffer
+%D
+%D \typebuffer
+%
+%  This is typset as:
+%
+%  \startlines
+%  \getbuffer
+%  \stoplines
+%D
+%D The sign can be typeset as is or within the space of a
+%D digit.
+%D
+%D \startbuffer
+%D \setdigitsign 0 \digits +12.345,90
+%D \setdigitsign 1 \digits +12.345,90
+%D \setdigitsign 2 \digits +12.345,90
+%D \setdigitsign 3 \digits +12.345,90
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%  This is typset as:
+%
+%  \startlines
+%  \getbuffer
+%  \stoplines
+
+\chardef\digitoutputmode=1 % 0..6
+\chardef\digitsignmode  =0 % 0..3
+
+\def\setdigitmode{\chardef\digitoutputmode}
+\def\setdigitsign{\chardef\digitsignmode}
+
+%D The digit modes are:
+%D
+%D \startitemize[packed]
+%D \item periods      \& comma
+%D \item commas       \& period
+%D \item thinmuskips  \& comma
+%D \item thinmuskips  \& period
+%D \item thickmuskips \& comma
+%D \item thickmuskips \& period
+%D \stopitemize
+
+\let\collecteddigits \empty \chardef\digitinputmode =1
+\let\saveddigits     \empty \chardef\skipdigit      =0
+\let\savedpowerdigits\empty \chardef\powerdigits    =0
+
+%D The first stage of the \type {\digit} macro takes care of
+%D the grouped call, the other branch handles the fuzzy
+%D delimited calls.
+
+\ifdefined\mbox \else \let\mbox\hbox \fi
+
+\unexpanded\def\digits
+  {\bgroup
+   \let~@%
+   \doifnextbgroupelse\dodigits{\doifnextcharelse\normalmathshift\domathdigits\grabdigit}}
+
+\def\dodigits#1%
+  {\grabdigit#1\relax}
+
+\def\domathdigits$#1$%
+  {\mbox{\grabdigit#1\relax}} % adding $ $ goes wrong in tabulate
+
+\def\grabdigit
+  {\futurelet\next\scandigit}
+
+%D Watch the test for \type {\nextobeyedline}, because the
+%D endofline token can be \type {\def'd}, not \type {\let}'d,
+%D we need to do an indirect test (see \type {verb-ini.tex})
+%D for details. (This probably needs an update.)
+
+\ifx\normalmathshift\undefined \let\normalmathshift=$ \fi
+
+\def\scandigit
+  {\ifx\next\blankspace
+     \let\next\handledigits
+   \else\ifx\next\nextobeyedline % the indirect one
+     \let\next\handledigits
+   \else\ifx\next\bgroup
+     \let\next\handledigits
+   \else\ifx\next\egroup
+     \let\next\handledigits
+   \else\ifx\next\normalmathshift
+     \let\next\handledigits
+   \else
+     \let\next\collectdigit
+   \fi\fi\fi\fi\fi
+   \next}
+
+%D We store the power||of||ten (to be signaled by \type {^},
+%D \type {e} or~\type {E}) in a seperate macro so that we can
+%D typeset it in superscript. The space placeholders are
+%D replaced by a \type {@}.
+
+\def\savedigit#1#2%
+  {\edef#1{#1\saveddigits#2}\let\saveddigits\empty}
+
+\long\def\collectdigit#1%
+  {\ifx#1~%
+     \savedigit\collecteddigits @%
+   \else\if#1_% tricky as can be several catcodes ... will become lua code anyway
+     \savedigit\collecteddigits @%
+   \else\if\noexpand#1\relax
+     \let\grabdigit\handledigits
+   \else\ifcase\powerdigits
+     \if#1E%
+       \chardef\powerdigits\plusone
+     \else\if#1e%
+       \chardef\powerdigits\plusone
+     \else\if#1^%
+       \chardef\powerdigits\plusone
+     \else
+       \savedigit\collecteddigits#1%
+       %\doifnumberelse{#1}
+       %  {\savedigit\collecteddigits#1}
+       %  {\def\saveddigits{#1}}%
+     \fi\fi\fi
+   \else
+     \savedigit\savedpowerdigits#1%
+     %\doifnumberelse{#1}
+     %  {\savedigit\savedpowerdigits#1}
+     %  {\def\saveddigits{#1}}%
+   \fi\fi\fi\fi
+   \grabdigit}
+
+\let\handlemathdigits\firstofoneargument
+\let\handletextdigits\mathematics
+
+\def\handledigits
+  {%\ifcase\powerdigits
+   %  \edef\collecteddigits{\collecteddigits\saveddigits}%
+   %\else
+   %  \edef\savedpowerdigits{\savedpowerdigits\saveddigits}%
+   %\fi
+   \ifmmode
+     \handlemathdigits{\dohandledigits}%
+   \else
+     \dontleavehmode\hbox{\handletextdigits{\dohandledigits}}%
+   \fi
+   \egroup}
+
+%D Although we could do with one pass, a second pass for
+%D handling the stored sequence is more readable.
+
+\ifnum\texengine=\luatexengine
+
+    \def\dohandledigits
+      {\mathcode`\,="002C \mathcode`\.="002E % pretty hard coded
+       \expandafter\handletokens\collecteddigits\with\scandigits
+       \ifcase\powerdigits\else\digitpowerseparator^{\savedpowerdigits}\fi}
+
+    \chardef\mathaxisfontid\zerocount
+
+\else
+
+    \def\dohandledigits
+      {\mathcode`\,="013B \mathcode`\.="013A % pretty hard coded
+       \expandafter\handletokens\collecteddigits\with\scandigits
+       \ifcase\powerdigits\else\digitpowerseparator^{\savedpowerdigits}\fi}
+
+    \chardef\mathaxisfontid\plustwo
+
+\fi
+
+\def\doscandigit#1%
+  {\ifcase\skipdigit\@EA\hbox\else\@EA\hphantom\fi\bgroup
+     \mathematics % brr, needed because of stored punctuation
+       {\ifnum\digitinputmode=#1\relax
+        \ifcase\digitoutputmode
+        \or .%
+        \or ,%
+        \or \mskip\thinmuskip
+        \or \mskip\thinmuskip
+        \or \mskip\thickmuskip
+        \or \mskip\thickmuskip
+        \fi
+      \else
+        \ifodd\digitoutputmode,\else.\fi
+      \fi}%
+   \egroup}
+
+%D The signs can be made smaller and sqeezed into the width
+%D of a digit. Watch the \type {\mathaxisheight} trickery (this
+%D font related register stored the math axis).
+
+% 0,=
+% 0,==  second = results in delta(00,=)
+% 0,-   is invalid, should be =
+% 0,--  is invalid, should be ==
+
+\def\digitzeroamount
+  {\digitsgn\zeroamount
+   \def\digitzeroamount
+     {\hphantom
+        {00\setbox\scratchbox\hbox{$\zeroamount$}%
+         \hskip-\wd\scratchbox}%
+      \let\digitzeroamount\empty}}
+
+\def\scandigits#1%
+  {\if#1.\digitsep1\else
+   \if#1,\digitsep2\else
+   \if#1@\digitnop \else
+   \if#1_\digitnop \else
+   \if#1/\digitsgn{\hphantom{+}}\chardef\skipdigit0\else
+   \if#1-\ifcase\skipdigit\digitsgn-\else
+           \box\digitsepbox\digitzeroamount \fi\chardef\skipdigit0\else
+   \if#1+\digitsgn+\chardef\skipdigit0\else
+   \if#1=\box\digitsepbox\digitzeroamount \chardef\skipdigit0\else
+   \if#1s\digitsgn{\hphantom{\positive}}\chardef\skipdigit0\else
+   \if#1p\digitsgn\positive\chardef\skipdigit0\else
+   \if#1m\digitsgn\negative\chardef\skipdigit0\else
+   \if#1n\digitsgn\negative\chardef\skipdigit0\else
+         \box\digitsepbox #1\chardef\skipdigit0\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+\newbox\digitsepbox \chardef\autodigitmode=1
+
+\def\digitsep#1%
+  {\ifcase\autodigitmode
+     \doscandigit#1%
+   \else
+     \setbox\digitsepbox\hbox{\doscandigit#1}%
+   \fi
+   \chardef\skipdigit0\relax}
+
+% strange, does not work
+%
+% \def\digitnop
+%   {\hphantom{\box\digitsepbox}%
+%    \hphantom{0}\chardef\skipdigit1\relax}
+%
+% while this works
+
+\def\digitnop
+  {\hbox{\hphantom{\box\digitsepbox}}%
+   \hphantom{0}\chardef\skipdigit1\relax}
+
+% but this doesn't
+%
+% \def\digitnop
+%   {\hphantom{\box\digitsepbox0}%
+%    \chardef\skipdigit1\relax}
+
+\def\digitsgn#1%
+  {\ifcase\digitsignmode#1\else
+     \hbox
+       {\setbox\scratchbox\hbox{0}%
+        \scratchdimen\mathaxisheight\textfont\mathaxisfontid
+        \def\digitsgn##1##2%
+          {\advance\scratchdimen-\mathaxisheight##1\mathaxisfontid
+           \raise\scratchdimen
+           \hbox to \wd\scratchbox{\hss$##2#1$\hss}}%
+        \ifcase\digitsignmode\or
+          \digitsgn\textfont        \textstyle        \or
+          \digitsgn\scriptfont      \scriptstyle      \or
+          \digitsgn\scriptscriptfont\scriptscriptstyle\fi}%
+   \fi}
+
+\ifx\undefined\zeroamount \def\zeroamount{-} \fi
+\ifx\undefined\positive   \def\positive  {+} \fi
+\ifx\undefined\negative   \def\negative  {-} \fi
+
+%D The digit parser handles a bunch of special characters as
+%D well as different formats. We strongly suggest you to use
+%D the grouped call.
+%D
+%D \starttabulate[|l|l|l|]
+%D \NC \type{.} \NC , . \NC comma or period \NC \NR
+%D \NC \type{,} \NC , . \NC comma or period \NC \NR
+%D \NC \type{@} \NC \NC invisible space \NC \NR
+%D \NC \type{_} \NC \NC invisible space \NC \NR
+%D \NC \type{/} \NC \NC invisible sign \NC \NR
+%D \NC \type{-} \NC $-$ \NC minus sign \NC \NR
+%D \NC \type{+} \NC $+$ \NC plus sign \NC \NR
+%D \NC \type{s} \NC \NC invisible high sign \NC \NR
+%D \NC \type{p} \NC $\positive$ \NC high plus sign \NC \NR
+%D \NC \type{m} \NC $\negative$ \NC high minus sign \NC \NR
+%D \NC \type{n} \NC $\negative$ \NC high minus (negative) sign \NC \NR
+%D \NC \type{=} \NC $\zeroamount$ \NC zero padding \NC \NR
+%D \stoptabulate
+%D
+%D These triggers are used in the following examples.
+%D
+%D \startbuffer
+%D \digits 12
+%D \digits{~~~.~~~.~~~.68.712,34}
+%D \digits ~~~.~~~.~~~.68.712,34
+%D \digits ___.___.111.68.712,34
+%D \digits 111.111.111.68.712,34
+%D \digits 12.345,90
+%D \digits 12.345.000
+%D \digits 12,34
+%D \digits{392.857.230.68.712,34}
+%D {\digits1234}
+%D \digits{1234}
+%D \digits 1234\relax
+%D $\digits 123.222,00$
+%D \digits 123.222,00
+%D \digits 123.222,==
+%D \digits 123.222,00^10
+%D \digits 123.222,00e10
+%D \digits /123.222,00e-12
+%D \digits -123.222,00e-12
+%D \digits +123.222,00e-12
+%D \digits n123.222,00e-12
+%D \digits s123.222,00e-12
+%D \digits p123.222,00e-12
+%D \stopbuffer
+%D
+%D \typebuffer
+%
+%  \startlines
+%  \getbuffer
+%  \stoplines
+
+%D \macros
+%D   {Digits}
+%D
+%D We also permit:
+
+\let\Digits\digits
+
+%D These macros are complicated by the fact that we also
+%D have to support cases like:
+%D
+%D \starttyping
+%D {\digits1234}
+%D \digits{1234}
+%D \digits 1234\whatever
+%D $\digits 123.222,00$
+%D \digits 123.222,00.
+%D \stoptyping
+%D
+%D The latter case shows us that trailing non digits are to
+%D be passed untreated.
+%D
+%D Another interesting case is:
+%D
+%D \starttyping
+%D \digits 123.222,00^10
+%D \stoptyping
+%D
+%D The separator is defined as:
+
+% \def\digitpowerseparator%
+%   {\cdot10} % {\times10}
+
+\def\digitpowerseparator
+  {\ifx\collecteddigits\empty\else\cdot\fi10}
+
+%D \macros
+%D   {digittemplate}
+%D
+%D Users can specify the way they enter those digits by saying
+%D something like:
+%D
+%D \starttyping
+%D \digittemplate 12.000.000,00 % \digittemplate .,
+%D \stoptyping
+
+\def\digittemplate #1 %
+  {\chardef\digitinputmode\zerocount
+   \handletokens#1\with\scandigittemplate}
+
+\def\scandigittemplate#1%
+  {\if     #1.\ifcase\digitinputmode\chardef\digitinputmode\plusone \fi% period
+   \else\if#1,\ifcase\digitinputmode\chardef\digitinputmode\plustwo \fi% comma
+   \fi\fi}
+
+\protect \endinput
diff --git a/tex/context/base/mult-dim.mkvi b/tex/context/base/mult-dim.mkvi
index 0889b411e..bad7af713 100644
--- a/tex/context/base/mult-dim.mkvi
+++ b/tex/context/base/mult-dim.mkvi
@@ -35,6 +35,7 @@
 \installcorenamespace{dimensionnormal}
 
 \setvalue{\??dimensionnormal \v!none  }#value#dimension#small#medium#big{#dimension\zeropoint}
+\setvalue{\??dimensionnormal \empty   }#value#dimension#small#medium#big{#dimension\zeropoint}
 \setvalue{\??dimensionnormal \v!small }#value#dimension#small#medium#big{#dimension=#small\relax}
 \setvalue{\??dimensionnormal \v!medium}#value#dimension#small#medium#big{#dimension=#medium\relax}
 \setvalue{\??dimensionnormal \v!big   }#value#dimension#small#medium#big{#dimension=#big\relax}
diff --git a/tex/context/base/node-fin.lua b/tex/context/base/node-fin.lua
index dadbf80d3..84032c22d 100644
--- a/tex/context/base/node-fin.lua
+++ b/tex/context/base/node-fin.lua
@@ -699,26 +699,26 @@ local function stacker(namespace,attribute,head,default) -- no triggering, no in
             end
         elseif id == hlist_code or id == vlist_code then
             local content = current.list
-            if content then
-                if nslistwise then
-                    local a = has_attribute(current,attribute)
-                    if a and attrib ~= a and nslistwise[a] then -- viewerlayer
-                        local p = attrib
-                            attrib, done = a, true
-                            head = insert_node_before(head,current,copy_node(nsdata[a]))
-                            current.list = stacker(namespace,attribute,content,attrib)
-                        head, current = insert_node_after(head,current,copy_node(nsnone))
-                        attrib = p
-                    else
-                        local ok = false
-                        current.list, ok = stacker(namespace,attribute,content,attrib)
-                        done = done or ok
-                    end
+            if not content then
+            -- skip
+            elseif nslistwise then
+                local a = has_attribute(current,attribute)
+                if a and attrib ~= a and nslistwise[a] then -- viewerlayer
+                    local p = attrib
+                        attrib, done = a, true
+                        head = insert_node_before(head,current,copy_node(nsdata[a]))
+                        current.list = stacker(namespace,attribute,content,attrib)
+                    head, current = insert_node_after(head,current,copy_node(nsnone))
+                    attrib = p
                 else
                     local ok = false
-                    current.list, ok = stacker(namespace,attribute,content,default)
+                    current.list, ok = stacker(namespace,attribute,content,attrib)
                     done = done or ok
                 end
+            else
+                local ok = false
+                current.list, ok = stacker(namespace,attribute,content,default)
+                done = done or ok
             end
         end
         previous = current
diff --git a/tex/context/base/spac-ali.mkiv b/tex/context/base/spac-ali.mkiv
index 57806b6f2..0afbe313b 100644
--- a/tex/context/base/spac-ali.mkiv
+++ b/tex/context/base/spac-ali.mkiv
@@ -651,6 +651,10 @@
 
 \let\forgetragged    \spac_align_set_horizontal_none
 
+\appendtoks
+    \spac_align_set_horizontal_none
+\to \everyforgetall
+
 % Box commands.
 
 \unexpanded\def\ibox#1#2#3%
diff --git a/tex/context/base/spac-def.mkiv b/tex/context/base/spac-def.mkiv
index 4cd7b1d1c..ea537aea7 100644
--- a/tex/context/base/spac-def.mkiv
+++ b/tex/context/base/spac-def.mkiv
@@ -13,47 +13,13 @@
 
 \writestatus{loading}{ConTeXt Spacing Macros / Definitions}
 
-% todo: move resetters to other modules
+% Ideally these definitions should be moved to where they first appear and
+% this will happen at some point.
 
 \unprotect
 
-\unexpanded\def\forgeteverypar
-  {\everypar{\the\neverypar}}
-
-% worth trying:
-%
-% \unexpanded\def\forgeteverypar
-%   {\everypar\neverypar}
-
-\unexpanded\def\forgetparskip
-  {\s_spac_whitespace_parskip\zeropoint
-   \parskip\zeropoint
-   \let\v_spac_whitespace_current\v!none}
-
-\unexpanded\def\forgetbothskips
-  {\leftskip\zeropoint
-   \rightskip\zeropoint
-   \relax}
-
-\unexpanded\def\forgethorizontalstretch
-  {\emergencystretch\zeropoint}
-
-\unexpanded\def\forgetverticalstretch
-  {\spacing\plusone}
-
-\newif\ifforgotten % rather good signal for inner
-
-% This will become better: several resetters that do all in once as currently there is
-% redundant code.
-
-\appendtoks \forgottentrue             \to \everyforgetall
-\appendtoks \forgetragged              \to \everyforgetall
-\appendtoks \forgetparskip             \to \everyforgetall
-\appendtoks \forgetparindent           \to \everyforgetall
-\appendtoks \forgetbothskips           \to \everyforgetall
-\appendtoks \forgethorizontalstretch   \to \everyforgetall % needed in pagebody
-\appendtoks \forgetverticalstretch     \to \everyforgetall % needed in otr
-\appendtoks \everypar\emptytoks        \to \everyforgetall % indeed!
+% maybe \everysynchronizeglobalspacing
+% maybe \everysynchronizelocalspacing
 
 \appendtoks \forgetverticalstretch     \to \everybodyfont
 \appendtoks \presetnormallineheight    \to \everybodyfont
@@ -67,26 +33,17 @@
 \appendtoks \synchronizespacecodes     \to \everybodyfont % not needed, frozen factors
 \appendtoks \setrelativeinterlinespace \to \everybodyfont
 
+% why exception
+
 \appendtoks  \updateraggedskips        \to \everyfontswitch     % under test
-\prependtoks \let\par\normalpar        \to \everybeforepagebody % see \fillinline (was endgraf)
-\appendtoks  \synchronizespacecodes    \to \everydefinedfont    % not needed, frozen factors
 
-\setupwhitespace
-  [\v!none]
+% maybe more
 
-\indenting
-  [\v!never]
+\prependtoks \let\par\normalpar        \to \everybeforepagebody % see \fillinline (was endgraf)
 
-\setupindenting
-  [\v!none]
+% needs checking:
 
-\setupblank
-  [\v!big] % alternatively [\v!standard]
-
-\defineblank[\v!default]  [\v!big]      % todo: needs to adapt to \setupblank
-\defineblank[\v!before]   [\v!default]  % but we need to avoid circular references
-\defineblank[\v!inbetween][\v!default]  % then
-\defineblank[\v!after]    [\v!before]
+\appendtoks  \synchronizespacecodes    \to \everydefinedfont    % not needed, frozen factors
 
 \setupinterlinespace
   [\c!minheight=\zeropoint, % only special purpose
@@ -99,12 +56,8 @@
    \c!line=2.8\exheight,
    \c!stretch=\zerocount]
 
-\setupnarrower
-  [\c!before=\endgraf,
-   \c!after=\endgraf,
-   \c!left=1.5\emwidth,
-   \c!right=1.5\emwidth,
-   \c!middle=1.5\emwidth]
+\setupblank
+  [\v!big]
 
 \setuptolerance
   [\v!horizontal,\v!verystrict]
@@ -119,4 +72,10 @@
 \setupspacing
   [\v!packed]
 
+\indenting
+  [\v!never]
+
+\setupindenting
+  [\v!none]
+
 \protect \endinput
diff --git a/tex/context/base/spac-grd.mkiv b/tex/context/base/spac-grd.mkiv
index 487521f6c..cf350fdb6 100644
--- a/tex/context/base/spac-grd.mkiv
+++ b/tex/context/base/spac-grd.mkiv
@@ -15,37 +15,38 @@
 
 \writestatus{loading}{ConTeXt Spacing Macros / Grid Snapping}
 
-% buff-ver.mkiv: halfline spacing
-% strc-mat.mkiv: configure math grid (new code needed)
-% page-one.mkiv: to be checked
-% page-mul.mkiv: to be checked and redone
-% page-sid.mkiv: to be checked
-% page-set.mkiv: to be checked
-% strc-not.mkiv: to be checked
-% strc-ren.mkiv: to be checked
-% strc-flt.mkiv: to be checked (captions, probably top/bottom)
-% core-mis.mkiv: to be checked (placement, probbaly harmless)
-
 \unprotect
 
-%D Helpers:
+%D A rather crappy macro that we need to avoid and as such it will probably
+%D disappear:
+
+\installcorenamespace{lastnodepusher}
 
 \let\poplastnode\relax
 
-\def\pushlastnode
-  {\ifdim\lastskip=\zeropoint
-     \ifnum\lastpenalty=\zerocount
-       \ifnum\lastkern=\zerocount
-         \let\poplastnode\relax
-       \else
-         \edef\poplastnode{\kern\the\lastkern\relax}\kern-\lastkern % untested
-       \fi
+\unexpanded\def\pushlastnode
+  {\csname\??lastnodepusher
+     \ifcsname\??lastnodepusher\the\lastnodetype\endcsname
+       \the\lastnodetype
      \else
-       \edef\poplastnode{\penalty\the\lastpenalty\relax}\nobreak % untested
+       \s!unknown
      \fi
-   \else
-     \edef\poplastnode{\vskip\the\lastskip\relax}\vskip-\lastskip % \removelastskip
-   \fi}
+   \endcsname}
+
+\setvalue{\??lastnodepusher\number\kernnodecode}%
+  {\unexpanded\edef\poplastnode{\kern\the\lastkern\relax}%
+   \kern-\lastkern}
+
+\setvalue{\??lastnodepusher\number\gluenodecode}%
+  {\unexpanded\edef\poplastnode{\vskip\the\lastskip\relax}%
+   \vskip-\lastskip}
+
+\setvalue{\??lastnodepusher\number\penaltynodecode}%
+  {\unexpanded\edef\poplastnode{\penalty\the\lastpenalty\relax}%
+   \nobreak}
+
+\setvalue{\??lastnodepusher\s!unknown}%
+  {\let\poplastnode\relax}
 
 %D Moved from supp-box:
 
@@ -133,6 +134,8 @@
 % \startlinecorrection \framed{xxx} \stoplinecorrection
 % \input ward \par
 
+% to be redone:
+
 \unexpanded\def\dotopbaselinecorrection{\expandafter\blank\expandafter[\the\d_spac_lines_correction_before]}
 \unexpanded\def\dobotbaselinecorrection{\expandafter\blank\expandafter[\the\d_spac_lines_correction_after ]}
 
diff --git a/tex/context/base/spac-hor.mkiv b/tex/context/base/spac-hor.mkiv
index 47665e8b5..49187a6ad 100644
--- a/tex/context/base/spac-hor.mkiv
+++ b/tex/context/base/spac-hor.mkiv
@@ -34,7 +34,7 @@
 \unexpanded\def\setupindenting
   {\doifnextoptionalelse\spac_indentation_setup_options\spac_indentation_setup_size}
 
-\def\spac_indentation_setup_size
+\unexpanded\def\spac_indentation_setup_size
   {\assigndimension\v_spac_indentation_current\d_spac_indentation_par{1\emwidth}{1.5\emwidth}{2\emwidth}}
 
 \let\synchronizeindenting\spac_indentation_setup_size
@@ -286,6 +286,17 @@
    \parindent\zeropoint
    \let\v_spac_indentation_current\v!none}
 
+\appendtoks
+    \forgetparindent
+\to \everyforgetall
+
+\unexpanded\def\forgethorizontalstretch
+  {\emergencystretch\zeropoint}
+
+\appendtoks
+    \forgethorizontalstretch
+\to \everyforgetall % needed in pagebody
+
 %D Helper:
 
 \unexpanded\def\softbreak
@@ -479,8 +490,6 @@
 \unexpanded\def\tfskip    {\begingroup\tf\hskip\emwidth\endgroup}
 \unexpanded\def\dotfskip#1{\begingroup\tf\hskip      #1\endgroup} % used elsewhere
 
-% needs a proper \definenarrower or installnarrower
-%
 % maybe we should hash the analysis
 
 \installcorenamespace{narrower}
@@ -617,6 +626,24 @@
 \unexpanded\def\doadaptleftskip #1{\dosetleftskipadaption {#1}\advance\leftskip \leftskipadaption }
 \unexpanded\def\doadaptrightskip#1{\dosetrightskipadaption{#1}\advance\rightskip\rightskipadaption}
 
+\unexpanded\def\forgetbothskips
+  {\leftskip\zeropoint
+   \rightskip\zeropoint
+   \relax}
+
+\appendtoks
+    \forgetbothskips
+\to \everyforgetall
+
+\unexpanded\def\forgetparskip
+  {\s_spac_whitespace_parskip\zeropoint
+   \parskip\zeropoint
+   \let\v_spac_whitespace_current\v!none}
+
+\appendtoks
+    \forgetparskip
+\to \everyforgetall
+
 %D Tolerance (can also be set with align):
 
 \installcorenamespace{tolerancemethods}
diff --git a/tex/context/base/spac-ver.mkiv b/tex/context/base/spac-ver.mkiv
index 66d55a57a..e404dc9ef 100644
--- a/tex/context/base/spac-ver.mkiv
+++ b/tex/context/base/spac-ver.mkiv
@@ -414,6 +414,10 @@
    \parskip\zeropoint
    \let\v_spac_whitespace_current\v!none}
 
+\appendtoks
+    \forgetparskip
+\to \everyforgetall
+
 % \installwhitespacemethod \s!unknown  {\s_spac_whitespace_parskip\commalistelement\relax}
 %
 % \def\spac_whitespace_setup_method#1%
@@ -422,6 +426,9 @@
 \unexpanded\def\nowhitespace{\vspacing[\v!nowhite]}
 \unexpanded\def\whitespace  {\vspacing[\v!white]}
 
+\setupwhitespace
+  [\v!none]
+
 % Packed:
 
 % todo: when packed blocks blank, we need to enable forced
@@ -748,6 +755,13 @@
    \setnormalbaselines
    \setstrut}
 
+\unexpanded\def\forgetverticalstretch % \forgetspacing
+  {\spacing\plusone}
+
+\appendtoks
+    \forgetverticalstretch
+\to \everyforgetall % needed in otr
+
 %D Sometimes one needs to freeze the interlinespacing
 %D
 %D \starttyping
@@ -885,7 +899,7 @@
 
 \def\spac_struts_set_vide
   {\setbox\strutbox\hbox
-     {\hbox to \zeropoint
+     {\spac_struts_vide_hbox to \zeropoint
         {% \hss % new, will be option
          \vrule
            \!!width \strutwidth
@@ -893,6 +907,8 @@
            \!!depth \strutdp
          \hss}}}
 
+\let\spac_struts_vide_hbox\hbox % overloaded in trac-vis.mkiv
+
 %D The dimen \type {\struttotal} holds the exact size of the
 %D strut; occasionally a one scaled point difference can show
 %D up with the lineheight.
@@ -1728,17 +1744,6 @@
 
 \let\synchronizevspacing\setupvspacing_nop
 
-% used both
-
-\unexpanded\def\inhibitblank
-  {\vspacing[\v!disable]} % can be made faster
-
-\let\doinhibitblank\inhibitblank % keep this command, used in styles
-
-\let\setupblank      \setupvspacing
-\let\blank           \vspacing
-\let\synchronizeblank\synchronizevspacing
-
 % category:4 is default
 
 % this interface might change (into an \install, buw we will then keep this one hidden)
@@ -1788,12 +1793,27 @@
 \dorecurse{10} % todo: other values < 4000
   {\normalexpanded{\definevspacing[\v!samepage-\recurselevel][penalty:\the\numexpr4000+250*\recurselevel\relax]}}
 
+\definevspacing[\v!default]  [\v!big]      % todo: needs to adapt to \setupblank
+\definevspacing[\v!before]   [\v!default]  % but we need to avoid circular references
+\definevspacing[\v!inbetween][\v!default]  % then
+\definevspacing[\v!after]    [\v!before]
+
+\setupvspacing
+  [\v!big] % alternatively [\v!standard]
+
 %D Maybe at some point we will differ between \type {\vspacing} and
 %D \type {\blank} (we needed the first one while playing with the
 %D new code).
 
-\let\blank            \vspacing
+\unexpanded\def\inhibitblank
+  {\vspacing[\v!disable]} % can be made faster
+
+\let\doinhibitblank\inhibitblank % keep this command, used in styles
+
 \let\defineblank      \definevspacing
+\let\setupblank       \setupvspacing
+\let\blank            \vspacing
+\let\synchronizeblank \synchronizevspacing
 \let\defineblankmethod\definevspacingamount
 
 %D The following command is for Wolfgang. It has to be used with
diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf
index 08010c8b9..d72c1e335 100644
Binary files a/tex/context/base/status-files.pdf and b/tex/context/base/status-files.pdf differ
diff --git a/tex/context/base/status-lua.pdf b/tex/context/base/status-lua.pdf
index 8b8f0f3dc..fd57767c1 100644
Binary files a/tex/context/base/status-lua.pdf and b/tex/context/base/status-lua.pdf differ
diff --git a/tex/context/base/status-mkiv.lua b/tex/context/base/status-mkiv.lua
index aa5aa4d20..5240b43d4 100644
--- a/tex/context/base/status-mkiv.lua
+++ b/tex/context/base/status-mkiv.lua
@@ -74,7 +74,7 @@ return {
         {
             filename = "syst-aux",
             marktype = "mkiv",
-            status   = "okay",
+            status   = "unknown",
             comment  =  "will be better protected"
         },
         {
@@ -283,12 +283,12 @@ return {
      --     status   = "unknown",
      --     comment  = "will become a module (and part will stay in the core)",
      -- },
-        {
-            filename = "supp-fun",
-            marktype = "mkiv",
-            status   = "unknown",
-            comment  = "will be integrated elsewhere",
-        },
+     -- {
+     --     filename = "supp-fun",
+     --     marktype = "mkiv",
+     --     status   = "unknown",
+     --     comment  = "will be integrated elsewhere",
+     -- },
         {
             filename = "supp-ran",
             marktype = "mkiv",
@@ -300,12 +300,12 @@ return {
             status   = "okay",
             comment  = "will be moved to the math-* modules",
         },
-        {
-            filename = "supp-num",
-            marktype = "mkiv",
-            status   = "obsolete",
-            comment  = "replaced by units",
-        },
+     -- {
+     --     filename = "supp-num",
+     --     marktype = "mkiv",
+     --     status   = "obsolete",
+     --     comment  = "replaced by units",
+     -- },
         {
             filename = "typo-ini",
             marktype = "mkiv",
@@ -595,7 +595,7 @@ return {
         {
             filename = "spac-lin",
             marktype = "mkiv",
-            status   = "unknown",
+            status   = "okay",
             comment  = "could be improved if needed"
         },
         {
@@ -618,6 +618,7 @@ return {
             filename = "spac-grd",
             marktype = "mkiv",
             status   = "unknown",
+            comment  = "needs thinking and redoing",
         },
         {
             filename = "anch-pos",
@@ -1074,6 +1075,11 @@ return {
             marktype = "mkvi",
             status   = "okay",
         },
+        {
+            filename = "font-aux",
+            marktype = "mkvi",
+            status   = "okay",
+        },
         {
             filename = "lxml-css",
             marktype = "mkiv",
diff --git a/tex/context/base/supp-fun.mkiv b/tex/context/base/supp-fun.mkiv
deleted file mode 100644
index 33bee0306..000000000
--- a/tex/context/base/supp-fun.mkiv
+++ /dev/null
@@ -1,716 +0,0 @@
-%D \module
-%D   [       file=supp-fun,
-%D        version=1995.10.10,
-%D          title=\CONTEXT\ Support Macros,
-%D       subtitle=Fun Stuff,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-\unprotect
-
-%D Beware, these macros wil be replaced and at some point this
-%D module will not be preloaded any more.
-
-%D This module implements some typographics tricks that can
-%D be fun when designing document layouts. The examples use
-%D macros that are typical to \CONTEXT, but non \CONTEXT\
-%D users can use the drop caps and first line treatment
-%D macros without problems. This module will be extended
-%D when the need for more of such tricks arises.
-
-\writestatus{loading}{ConTeXt Support Macros / Fun Stuff}
-
-%D \macros
-%D   {DroppedCaps, DroppedString, DroppedIndent, DroppedLines}
-%D
-%D \startbuffer
-%D \DroppedCaps
-%D   {\color[green]} {SerifBold}
-%D   {\the\dimexpr2.2\baselineskip} {2pt} {\the\baselineskip} {2}
-%D   Let's start
-%D \stopbuffer
-%D
-%D \getbuffer with dropped caps, those blown up first
-%D characters of a paragraph. It's hard to implement a general
-%D mechanism that suits all situations, but dropped caps are so
-%D seldomly used that we can permit ourselves a rather user
-%D unfriendly implementation.
-%D
-%D \typebuffer
-%D
-%D As we will see, there are 7 different settings involved. The
-%D first argument takes a command that is used to do whatever
-%D fancy things we want to do, but normally this one will be
-%D empty. The second argument takes the font. Because we're
-%D dealing with something very typographic, there is no real
-%D reason to adopt complicated font switching schemes, a mere
-%D name will do. Font encodings can bring no harm, because the
-%D alphanumeric characters are nearly always located at their
-%D natural position in the encoding vector.
-%D
-%D \startbuffer
-%D \DroppedCaps
-%D   {\color[red]} {SerifBold}
-%D   {\the\baselineskip} {0pt} {0pt} {1}
-%D   This simple
-%D \stopbuffer
-%D
-%D \getbuffer case shows us what happens when we apply minimal
-%D values. Here we used:
-%D
-%D \typebuffer
-%D
-%D \startbuffer
-%D \DroppedCaps
-%D   {\color[red]} {SerifBold}
-%D   {\the\dimexpr2\baselineskip} {0pt} {\the\baselineskip} {2}
-%D   Is this ugly
-%D \stopbuffer
-%D
-%D \getbuffer example the third argument tells
-%D this macro that we want a dropped capital scaled to the
-%D baseline distance. The two zero point arguments are the
-%D horizontal and vertical offsets and the last arguments
-%D determines the hanging indentation. In this paragraph we
-%D set the height to two times the baselinedistance and use
-%D two hanging lines:
-%D
-%D \typebuffer
-%D
-%D Here, the first character is moved down one baseline. Here
-%D we also see why the horizontal offset is important. The
-%D first example (showing the~L) sets this to a few points and
-%D also used a slightly larger height.
-%D
-%D Of course common users (typist) are not supposed to see this
-%D kind of fuzzy definitions, but fortunately \TEX\ permits us
-%D to hide them in macros. Using a macro also enables us to
-%D garantee consistency throughout the document:
-%D
-%D \startbuffer
-%D \def\MyDroppedCaps%
-%D   {\DroppedCaps
-%D      {\color[green]} {SerifBold}
-%D      {\the\dimexpr5\baselineskip} {3pt} {\the\dimexpr3\baselineskip} {4}}
-%D
-%D \MyDroppedCaps The implementation
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D \getbuffer of the general macro is rather simple and only
-%D depends on the arguments given and the dimensions of the
-%D strut box. We explicitly load the font, which is no problem
-%D because \TEX\ does not load a font twice. We could have
-%D combined some arguments, like the height, vertical offset
-%D and the number of lines, but the current implementation
-%D proved to be the most flexible. One should be aware of the
-%D fact that the offsets depend on the design of the glyphs
-%D used.
-
-\let\DroppedIndent\!!zeropoint \def\DroppedLines{0}
-
-\def\DroppedString{ABCDEFGHIJKLMNOPQRSTUVWXYZ}
-
-\let\globaldropcaps\global % will be an option, but on by default
-
-\def\localdropcaps{\let\globaldropcaps\relax}
-
-\chardef\DroppedStatus = 0 % 0=done 1=starting 2=doing 3=error
-\chardef\DropMode      = 0 % 1 == marginhang
-
-\ifx\keeplinestogether\undefined
-  \let\keeplinestogether\gobbleoneargument
-\fi
-
-\def\DroppedCaps#1#2#3#4#5#6#7% does not yet handle accented chars
-  {\defconvertedargument\asciia{#7}%
-   \defconvertedcommand \asciib{\DroppedString}%
-   \doifinstringelse\asciia\asciib
-     {\noindentation
-      \dontleavehmode
-      \checkindentation % redo this one
-     %\ifhmode\hskip-\parindent\fi % sensitive for context mechanism
-      \keeplinestogether{#6}%
-      \setbox0\hbox{\definedfont[#2 at #3]#1{#7}\hskip#4}%
-      \ifdim\dp0>\strutdp % one of those Q's , will be option
-        \setbox2\hbox{\raise\dp0\hbox{\lower\strutdp\copy0}}%
-        \ht2\ht0
-        \dp0\strutdp
-        \setbox0\box2
-      \fi
-      \setbox0\hbox
-        {\ifnum\DropMode=\plusone
-           \hskip-\wd0\wd0\zeropoint
-         \fi
-         \lower#5\box0}%
-      \ht0\strutht
-      \dp0\strutdp
-      \ifnum\DropMode=\plusone
-        \globaldropcaps\let\DroppedIndent\!!zeropoint
-        \globaldropcaps\edef\DroppedLines{\number\maxdimen}%
-        \globaldropcaps\chardef\DroppedStatus\plusthree
-      \else
-        \globaldropcaps\edef\DroppedIndent{\the\wd0}%
-        \globaldropcaps\edef\DroppedLines {\number#6}%
-        \globaldropcaps\chardef\DroppedStatus\plustwo
-        \globaldropcaps\hangindent\DroppedIndent
-        \globaldropcaps\hangafter-\DroppedLines
-%         \noindent
-        \noindentation
-        \checkindentation % redo this one
-        \hskip-\DroppedIndent
-      \fi
-      \vbox{\forgetall\box0}%
-      \nobreak
-      \let\next\ignorespaces} % Could be a one character word !
-     {\globaldropcaps\let\DroppedIndent\!!zeropoint
-      \globaldropcaps\edef\DroppedLines{\number\maxdimen}%
-      \globaldropcaps\chardef\DroppedStatus\plusthree
-      \def\next{#7}}%
-   \let\globaldropcaps\global
-   \next}
-
-%D Before we go to the next topic, we summarize this command:
-%D
-%D \starttyping
-%D \DroppedCaps
-%D   {command} {font}
-%D   {height} {hoffset} {voffset} {lines}
-%D \stoptyping
-%D
-%D Sometimes you need to make sure that the global settings are
-%D kept local, as in:
-%D
-% %D \startbuffer
-% %D \defineparagraphs[SomePar][n=2,rule=on]
-% %D \setupparagraphs [SomePar][1][width=.5\textwidth]
-% %D \setupparagraphs [SomePar][2][width=.5\textwidth]
-%D \startbuffer
-%D \defineparagraphs[SomePar][n=2,rule=on]
-%D \setupparagraphs [SomePar][1][width=.5\textwidth]
-%D \setupparagraphs [SomePar][2][width=.5\textwidth]
-%D
-%D \startSomePar
-%D   \localdropcaps\NiceDroppedCaps{}{cmr12}{0pt}{2}Here we need
-%D   to explicitly keep the hanging indentation local, like it or
-%D   not.
-%D \SomePar
-%D   \localdropcaps\NiceDroppedCaps{}{cmr12}{0pt}{2}Here we need
-%D   to explicitly keep the hanging indentation local, like it or
-%D   not.
-%D \stopSomePar
-%D \stopbuffer
-%D
-%D \typebuffer \getbuffer
-
-%D \macros
-%D   {AutoDroppedCaps, CheckDroppedCaps}
-%D
-%D {\em To be documented.}
-
-% example usage
-%
-% \def\bpar{\ifvmode\CheckDroppedCaps\fi}
-% \def\epar{\ifhmode\par\fi\CheckDroppedCaps}
-
-\newcount\lastprevgraf
-\newcount\droppedlines
-
-\def\CheckDroppedCaps
-  {\global\lastprevgraf\prevgraf}
-
-\def\AutoDroppedCaps % will be proper core stuff since it
-  {\globaldropcaps\chardef\DroppedStatus\plusone
-   \global\lastprevgraf\zerocount
-   \global\droppedlines\zerocount
-   \EveryPar{\doAutoDroppedCaps}}
-
-\let\AutoDroppedNext\relax
-
-\ifx\AutoDroppedCapsCommand\undefined
-    \def\AutoDroppedCapsCommand{\NiceDroppedCaps{}{SerifBold}{.125em}{3}}
-\fi
-
-\def\doAutoDroppedCaps
-  {\ifcase\DroppedStatus % done
-     \let\next\relax
-   \or % starting
-   % \ifnum\lastprevgraf>0 % tricky, probably a wrong par
-   %   \globaldropcaps\chardef\DroppedStatus=3 % and inhibits dropped
-   %   \let\next\relax % caps after titles and more than once
-   % \else % so let's nill this rubishly code fragment
-       \let\next\AutoDroppedCapsCommand
-   % \fi % and hope for the best
-   \or % doing
-     \global\advance\droppedlines \lastprevgraf
-     \ifnum\droppedlines=\zerocount
-       \globaldropcaps\chardef\DroppedStatus\zerocount
-       \let\next\relax
-     \else\ifnum\droppedlines>\zerocount
-       \ifnum\droppedlines<\DroppedLines\relax
-         \globaldropcaps\hangindent\DroppedIndent
-         \globaldropcaps\hangafter-\DroppedLines
-         \globaldropcaps\advance\hangafter \droppedlines
-         \hskip-\parindent % brrr
-         \let\next\AutoDroppedNext
-       \else
-         \globaldropcaps\chardef\DroppedStatus\zerocount
-         \let\next\relax
-       \fi
-     \else
-       \globaldropcaps\chardef\DroppedStatus\zerocount
-       \let\next\relax
-     \fi\fi
-   \or % error
-     \globaldropcaps\chardef\DroppedStatus\zerocount
-     \let\next\relax
-   \fi
-   \next}
-
-%D \macros
-%D   {LineDroppedCaps, NiceDroppedCaps}
-%D
-%D To save definitions, we also provide:
-%D
-%D \starttyping
-%D \LineDroppedCaps {command} {font} {hoffset} {lines}
-%D \NiceDroppedCaps {command} {font} {hoffset} {lines}
-%D \stoptyping
-%D
-%D The first command scales the font to the exact height, while
-%D the second command scales the font to a nice 2.5 times the
-%D line height, a value that gives a pleasant grayness.
-
-\def\DoLineDroppedCaps#1#2#3#4#5% compensation command font offset lines
-  {\scratchcounter#5%
-   \advance\scratchcounter \minusone
-   \scratchdimen\scratchcounter\baselineskip
-   \advance\scratchdimen #1%
-   \NormalizeFontHeight\DummyFont{W}\scratchdimen{#3}%
-   \DroppedCaps{#2}{#3}\TheNormalizedFontSize{#4}
-     {\scratchcounter\baselineskip}{#5}}
-
-\def\LineDroppedCaps% command font offset lines
-  {\DoLineDroppedCaps{\strutht}}
-
-\def\NiceDroppedCaps% command font offset lines
-  {\DoLineDroppedCaps{.5\baselineskip}}
-
-%D \macros
-%D   {TreatFirstLine}
-%D
-%D \startbuffer
-%D \TreatFirstLine {\sc} {} {} {}
-%D Instead of limiting its action to one token, the next macro
-%D treats the whole first line. This paragraph was typeset by
-%D saying:
-%D \stopbuffer
-%D
-%D \getbuffer
-%D
-%D \typebuffer
-%D
-%D \startbuffer
-%D \TreatFirstLine {\startcolor[red]\bf} {\stopcolor} {} {}
-%D The combined color and font effect is also possible,
-%D although one must be careful in using macros that accumulate
-%D grouping, but the commands used here are pretty save in that
-%D respect.
-%D \stopbuffer
-%D
-%D \getbuffer
-%D
-%D \typebuffer
-%D
-%D Before we explain the third and fourth argument, we show the
-%D implementation. Those who know a bit about the way \TEX\
-%D treats tokens, will probably see in one glance that this
-%D alternative works all right for most text||only situations
-%D in which there is enough text available for the first line,
-%D but that more complicated things will blow. One has to live
-%D with that. A workaround is rather trivial but obscures the
-%D principles used.
-
-\def\TreatFirstLine#1#2#3#4% before, after, first, next
-  {\leavevmode
-   \bgroup
-   \forgetall
-   \bgroup
-   #1%
-   \setbox0\emptybox
-   \setbox2\emptybox
-   \def\grabfirstline##1 %
-     {\setbox2\hbox
-        {\ifvoid0
-           {#3{\ignorespaces##1}}%
-         \else
-           \unhcopy0\ {#4{##1}}%
-         \fi}%
-      \ifdim\wd2=\zeropoint
-        \setbox0\emptybox
-        \setbox2\emptybox
-        \@EA\grabfirstline
-      \else\ifdim\wd2>\hsize
-        \hbox to \hsize{\strut\unhbox0}#2\egroup
-        \break##1\
-        \egroup
-      \else
-        \setbox0\box2
-        \@EAEAEA\grabfirstline
-      \fi\fi}%
-   \grabfirstline}
-
-%D \startbuffer
-%D \gdef\FunnyCommand
-%D   {\getrandomfloat\FunnyR{0}{1}%
-%D    \getrandomfloat\FunnyG{0}{1}%
-%D    \getrandomfloat\FunnyB{0}{1}%
-%D    \definecolor[FunnyColor][r=\FunnyR,g=\FunnyG,b=\FunnyB]%
-%D    \color[FunnyColor]}
-%D
-%D %\TreatFirstLine {\bf} {} {\FunnyCommand} {\FunnyCommand}
-%D The third and fourth argument can be used to gain special
-%D effects on the individual words. Of course one needs ...
-%D \stopbuffer
-%D
-%D \getbuffer
-%D to know a bit more about the macro package used to get real
-%D nice effects, but this example probably demonstrates the
-%D principles well.
-%D
-%D \typebuffer
-%D
-%D Like in dropped caps case, one can hide such treatments in a
-%D macro, like:
-%D
-%D \starttyping
-%D \def\MyTreatFirstLine%
-%D   {\TreatFirstLine{\bf}{}{\FunnyCommand}{\FunnyCommand}}
-%D \stoptyping
-
-%D \macros
-%D   {reshapebox}
-%D
-%D \startbuffer
-%D \beginofshapebox
-%D When using \CONTEXT, one can also apply this funny command
-%D to whole lines by using the reshape mechanism. Describing
-%D this interesting mechanism falls outside the scope of this
-%D module, so we only show the trick. This is an example of
-%D low level \CONTEXT\ functionality: it's all there, and it's
-%D stable, but not entirely meant for novice users.
-%D \endofshapebox
-%D
-%D \reshapebox{\FunnyCommand{\box\shapebox}} \flushshapebox
-%D \stopbuffer
-%D
-%D \getbuffer
-%D
-%D \typebuffer
-%D
-%D This mechanism permits hyphenation and therefore gives
-%D better results than the previously discussed macro
-%D \type{\TreatFirstLine}.
-
-%D \macros
-%D   {TreatFirstCharacter}
-%D
-%D \startbuffer
-%D \TreatFirstCharacter{\bf\color[green]} Just to be
-%D \stopbuffer
-%D
-%D \getbuffer complete we also offer a very simple one
-%D character alternative, that is not that hard to understand:
-
-\def\TreatFirstCharacter#1#2% command, character
-  {{#1{#2}}}
-
-%D A previous paragraph started with:
-%D
-%D \typebuffer
-
-%D \macros
-%D   {StackCharacters}
-%D
-%D The next hack deals with vertical stacking.
-
-\def\StackCharacters#1#2#3#4% sequence vsize vskip command
-  {\vbox #2
-     {\forgetall
-      \baselineskip\zeropoint
-      \def\StackCharacter##1{#4{##1}\cr\noalign{#3}}%
-      \halign
-        {\hss##\hss&##\cr
-         \handletokens#1\with\StackCharacter\cr}}}
-
-%D \startbuffer
-%D \StackCharacters{CONTEXT}{}{\vskip.2ex}{\FunnyCommand}
-%D \stopbuffer
-%D
-%D Such a stack looks like:
-%D
-%D \startlinecorrection
-%D \hbox to \hsize
-%D    {$\hss\bfd
-%D     \vcenter{\StackCharacters{TEX}    {}{\vskip.2ex}{\FunnyCommand}}%
-%D     \hss
-%D     \vcenter{\StackCharacters{CON}    {}{\vskip.2ex}{\FunnyCommand}}
-%D     \hss
-%D     \vcenter{\StackCharacters{TEXT}   {}{\vskip.2ex}{\FunnyCommand}}
-%D     \hss
-%D     \vcenter{\StackCharacters{CONTEXT}{}{\vskip.2ex}{\FunnyCommand}}
-%D     \hss$}
-%D \stoplinecorrection
-%D
-%D and is typeset by saying:
-%D
-%D \typebuffer
-%D
-%D An alternative would have been
-%D
-%D \starttyping
-%D \StackCharacters {CONTEXT} {to 5cm} {\vfill} {\FunnyCommand}
-%D \stoptyping
-
-%D \macros
-%D   {processtokens}
-%D
-%D At a lower level horizontal and vertical manipulations are
-%D already supported by:
-%D
-%D \starttyping
-%D \processtokens {begin} {between} {end} {space} {text}
-%D \stoptyping
-%D
-%D \startbuffer[a]
-%D \processtokens
-%D   {\hbox to .5\hsize\bgroup} {\hfill}
-%D   {\egroup} {\space} {LET'S HAVE}
-%D \stopbuffer
-%D
-%D \startbuffer[b]
-%D \processtokens
-%D   {\vbox\bgroup\raggedcenter\hsize1em}
-%D   {\vskip.25ex} {\egroup} {\strut} {FUN}
-%D \stopbuffer
-%D
-%D This macro is able to typeset:
-%D
-%D \leavevmode\hbox to \hsize
-%D   {$\hfil\hfil
-%D    \vcenter{\bf\getbuffer[a]}%
-%D    \hfil
-%D    \vcenter{\bfd\getbuffer[b]}%
-%D    \hfil\hfil$}
-%D
-%D which was specified as:
-%D
-%D \typebuffer[a]
-%D \typebuffer[b]
-
-%D \macros
-%D   {NormalizeFontHeight, NormalizeFontWidth,
-%D    TheNormalizedFontSize}
-%D
-%D Next we introduce some font manipulation macros. When we
-%D want to typeset some text spread in a well defined area, it
-%D can be considered bad practice to manipulate character and
-%D word spacing. In such situations the next few macros can be
-%D of help:
-%D
-%D \starttyping
-%D \NormalizeFontHeight \name {sample text} {height} {font}
-%D \NormalizeFontWidth  \name {sample text} {width}  {font}
-%D \stoptyping
-%D
-%D These are implemented using an auxilliary macro:
-
-\def\NormalizeFontHeight{\NormalizeFontSize\ht}
-\def\NormalizeFontWidth {\NormalizeFontSize\wd}
-
-\def\NormalizeFontSize#1#2#3#4#5%
-  {\bgroup
-   \dimen0=#4% #4 can be \ht0 or so
-   \setbox0\hbox{\definedfont[#5 at 5pt]#3}% 10pt
-   \ifdim\wd0>\zeropoint
-     \dimen2=#10 % #1 is \wd or \ht
-     \dimen4=\maxdimen % 10000pt
-     \divide\dimen4 \dimen2
-     \divide\dimen0 1638 % 1000
-     \dimen0=\number\dimen4\dimen0
-     \divide \dimen0 \plustwo % ...
-     \xdef\TheNormalizedFontSize{\the\dimen0}%
-   \else
-     \dimen0\bodyfontsize
-   \fi
-   \normalexpanded{\egroup\def\noexpand#2{\definedfont[#5 at \the\dimen0]}}}
-
-%D Afterwards, we have access to the calculated size by:
-
-\let\TheNormalizedFontSize\!!zeropoint
-
-%D Extra:
-
-\def\WidthSpanningText#1#2#3% text width font
-  {\hbox{\NormalizeFontWidth\temp{#1}{#2}{#3}\temp\the\everydefinedfont#1}}
-
-%D Consider for instance:
-%D
-%D \startbuffer
-%D \NormalizeFontHeight \tmp {X} {2\baselineskip} {cmr10}
-%D
-%D {\tmp To Be Or Not To Be}
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D This shows up as (we also show the baselines):
-%D
-%D {\showbaselines\getbuffer}
-%D
-%D The horizontal counterpart is:
-%D
-%D \startbuffer
-%D \NormalizeFontWidth \tmp {This Line Fits} {\hsize} {cmr10}
-%D
-%D \hbox{\tmp This Line Fits}
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D The calculated font scale is avaliable in the macro
-%D \type{\NormalizedFontSize}.
-%D
-%D \startlinecorrection
-%D \ruledhbox{\getbuffer}
-%D \stoplinecorrection
-%D
-%D One can of course combine these macros with the ones
-%D described earlier, like in:
-%D
-%D \starttyping
-%D \NormalizeFontHeight {text} \DroppedFont {2\baselineskip} {cmbx12}
-%D
-%D \def\NicelyDroppedCaps
-%D   {\DroppedCaps
-%D      {\color[green]}
-%D      {\DroppedFont}
-%D      {2pt}
-%D      {\baselineskip}
-%D      {2}}
-%D \stoptyping
-%D
-%D It's up to the reader to test this one.
-
-\unexpanded\def\FirstNCharacters#1#2% \FirstNCharacters{3}{fr{\"o}beln}
-  {\bgroup
-   \scratchcounter\zerocount
-   \def\docommand##1%
-     {\ifnum\scratchcounter=#1\else
-        ##1\relax % catches ##1 = \"e and alike
-        \advance\scratchcounter\plusone
-      \fi}
-   \handletokens#2\with\docommand
-   \egroup}
-
-%D \macros
-%D   {FittingText}
-%D
-%D First used in Pascal (demo-bbv):
-%D
-%D \startbuffer
-%D \ruledvbox{\FittingText{3cm}{1cm}{Serif}{24pt}{1pt}{1}
-%D   {\veryraggedright
-%D    \hangindent1em\hangafter1\relax
-%D    \begstrut \dorecurse{8}{Bram Marta }\unskip \endstrut}}
-%D
-%D \ruledvbox{\FittingText{3cm}{1cm}{Serif}{24pt}{1pt}{1}
-%D   {\raggedleft\begstrut Bram\\Marta \unskip\endstrut}}
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%D \startlinecorrection
-%D \getbuffer
-%D \stoplinecorrection
-
-% #1 width #2 height #3 font #4 size #5 step #6 interlinie #7 text
-
-\long\def\FittingText#1#2#3#4#5#6#7%
-  {\bgroup
-   \forgetall
-   \dontcomplain
-   \setuptolerance[\v!verytolerant]% == \tolerance4500
-   \hsize#1%
-   \def\\{\softbreak}%
-   \!!heighta#4%
-   \!!heightb#2%
-   \doloop
-     {\ifdim\!!heighta>\onepoint
-        \expanded{\definefont[\s!dummy][#3 at \the\!!heighta][\c!interlinespace=#6]}%
-        \getvalue\s!dummy
-        \setbox\scratchbox\vbox{#7\endgraf}%
-        \ifdim\ht\scratchbox>\!!heightb
-          \advance\!!heighta-#5%
-        \else
-          \beginshapebox
-          \unvcopy\scratchbox
-          \endshapebox
-          \global\dimen1\hsize
-          \reshapebox
-            {\setbox\shapebox\hbox{\unhbox\shapebox}%
-             \ifdim\wd\shapebox>\dimen1
-               \global\dimen1\wd\shapebox
-             \fi}%
-          \ifdim\dimen1>\hsize
-            \advance\!!heighta-#5%
-          \else
-            \exitloop
-          \fi
-        \fi
-      \else
-        \exitloop
-      \fi}%
-  %\writestatus{\strippedcsname\FittingText}{height: \the\!!heighta}%
-   \unvbox\scratchbox
-   \egroup}
-
-%D New:
-
-% \font width gap font spec text
-
-\def\NormalizeFontWidthSpread#1#2#3#4#5#6%
-  {\global\setfalse\NFSpread
-   \scratchdimen#3%
-   \scratchdimen-.5\scratchdimen
-   \advance\scratchdimen#2\relax
-   \NormalizeFontWidth
-     #1%
-     {\def\+{\global\settrue\NFSpread\gobbleuntil\relax}%
-      \def\\{\gobbleuntil\relax}% newline
-      \setupspacing
-      #6\relax}%
-     {\scratchdimen}%
-     {#4}%
-   \ifconditional\NFSpread
-     % de gap valt in de binding
-   \else
-     \definefont[\strippedcsname#1][#4 #5]%
-   \fi}
-
-\def\SpreadGapText#1#2%
-  {{\def\+{\kern#1}#2}}
-
-\def\GapText#1#2#3#4#5% width distance font spec title
-  {\bgroup
-   \NormalizeFontWidthSpread\DummyFont{#1}{#2}{#3}{#4}{#5}%
-   \DummyFont\setupspacing\SpreadGapText{#2}{#5}\endgraf
-   \egroup}
-
-\protect \endinput
diff --git a/tex/context/base/supp-mat.mkiv b/tex/context/base/supp-mat.mkiv
index bc26611ae..21871e80d 100644
--- a/tex/context/base/supp-mat.mkiv
+++ b/tex/context/base/supp-mat.mkiv
@@ -52,31 +52,26 @@
 \let\normalstopimath   \Ustopmath
 \let\normalstartdmath  \Ustartdisplaymath
 \let\normalstopdmath   \Ustopmath
+
 \def\normalmathaligntab{&} % \let\normalmathaligntab\aligntab does to work well in a let to & (a def works ok)
 
-\let\normalsuper      \Usuperscript             % obsolete
-\let\normalsuber      \Usubscript               % obsolete
-\let\startimath       \Ustartmath               % obsolete, less safe
-\let\stopimath        \Ustopmath                % obsolete, less safe
-\let\startdmath       \Ustartdisplaymath        % obsolete, less safe
-\let\stopdmath        \Ustopmath                % obsolete, less safe
+\let\normalsuper       \Usuperscript       % obsolete
+\let\normalsuber       \Usubscript         % obsolete
+
+\let\startimath        \Ustartmath
+\let\stopimath         \Ustopmath
+\let\startdmath        \Ustartdisplaymath
+\let\stopdmath         \Ustopmath
 
 \unexpanded\def\mathematics#1{\relax         \ifmmode#1\else\normalstartimath#1\normalstopimath\fi}
 \unexpanded\def\displaymath#1{\noindent      \ifmmode#1\else\normalstartdmath#1\normalstopdmath\fi}
 \unexpanded\def\inlinemath #1{\dontleavehmode\ifmmode#1\else\normalstartimath#1\normalstopimath\fi}
 \unexpanded\def\textmath   #1{\dontleavehmode\ifmmode#1\else\begingroup\everymath\emptytoks\normalstartimath#1\normalstopimath\endgroup\fi} % \mathsurround\zeropoint
 
-\let\m\mathematics % unexpanded?
+\let\m\mathematics
 
 \let\stopmathmode\relax
 
-% \unexpanded\def\startmathmode % cannot be used nested
-%   {\relax\ifmmode
-%      \let\stopmathmode\relax
-%    \else
-%      \normalstartimath\let\stopmathmode\normalstopimath
-%    \fi}
-
 \unexpanded\def\startmathmode % nested variant
   {\relax\ifmmode
      \begingroup
@@ -128,7 +123,8 @@
 \def\dimensionhalfspace {\,}
 
 \unexpanded\def\dimension#1%
-  {\def\dodimensionsignal{\kern\dimensionsignal}%
+  {\pushmacro\dodimensionsignal
+   \gdef\dodimensionsignal{\kern\dimensionsignal}%
    \ifdim\lastskip=\zeropoint\relax
      \ifdim\lastkern=\zeropoint\relax
        \ifmmode
@@ -144,70 +140,16 @@
    \else
      \unskip\mathematics{\dimensionhalfspace\dimensionhalfspace\dimensiontypeface#1}%
    \fi
-   \dodimensionsignal}
+   \dodimensionsignal
+   \popmacro\dodimensionsignal}
 
 \unexpanded\def\nodimension#1%
   {\unskip#1\global\let\dodimensionsignal\relax}
 
-% %D \macros
-% %D   {super, suber}
-% %D
-% %D \TEX\ uses \type{^} and \type{_} for entering super- and
-% %D subscript mode. We want however a bit more control than
-% %D normally provided, and therefore provide \type {\super}
-% %D and \type{\suber} (\type {\sub} is already taken).
-%
-% \global\let\normalsuper=\normalsuperscript % will become obsolete
-% \global\let\normalsuber=\normalsubscript   % will become obsolete
-%
-% \newcount\supersubmode
-%
-% \newevery\everysupersub \EverySuperSub
-%
-% \appendtoks \advance\supersubmode\plusone \to \everysupersub
-%
-% \def\super#1{\normalsuperscript{\the\everysupersub#1}}
-% \def\suber#1{\normalsubscript  {\the\everysupersub#1}}
-%
-% %D \macros
-% %D   {enablesupsub}
-% %D
-% %D We can let \type {^} and \type {_} act like \type {\super}
-% %D and \type {\suber} by saying \type {\enablesupsub}.
-%
-% \bgroup
-% \catcode\circumflexasciicode\activecatcode
-% \catcode\underscoreasciicode\activecatcode
-% \gdef\enablesupsub
-%   {\catcode\circumflexasciicode\activecatcode
-%    \catcode\underscoreasciicode\activecatcode
-%    \def^{\ifmmode\expandafter\super\else\expandafter\normalsuper\fi}%
-%    \def_{\ifmmode\expandafter\suber\else\expandafter\normalsuber\fi}}
-% \egroup
-%
-% %D \macros
-% %D   {restoremathstyle}
-% %D
-% %D We can pick up the current math style by calling \type
-% %D {\restoremathstyle}.
-%
-% \def\restoremathstyle
-%   {\ifmmode
-%      \ifcase\supsubmode
-%        \textstyle
-%      \or
-%        \scriptstyle
-%      \else
-%        \scriptscriptstyle
-%      \fi
-%    \fi}
-
 %D \macros
 %D   {cramped}
 %D
-%D \TEX provides no primitive to force in cramped math mode. Here is
-%D a macro that does so. It is based on a solution by Don Knuth (\useurl
-%D {http://www.ctan.org/tex-archive/digests/tex-implementors/042}).
+%D Cramped math:
 %D
 %D \startbuffer
 %D \ruledhbox{$\left\{{x^2\over y^2}\right\}$}
@@ -305,7 +247,7 @@
 
 % experiment, not yet to be used
 
-% \def\displaybreak
+% \unexpanded\def\displaybreak
 %   {\ifhmode
 %      \removeunwantedspaces
 %      \ifcase\raggedstatus\hfill\fi
diff --git a/tex/context/base/supp-num.mkiv b/tex/context/base/supp-num.mkiv
deleted file mode 100644
index be0df026d..000000000
--- a/tex/context/base/supp-num.mkiv
+++ /dev/null
@@ -1,416 +0,0 @@
-%D \module
-%D   [       file=supp-num,
-%D        version=1998.05.15,
-%D          title=\CONTEXT\ Support Macros,
-%D       subtitle=Numbers,
-%D         author=Hans Hagen,
-%D           date=\currentdate,
-%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
-
-% See end for transition to mkiv.
-
-\writestatus{loading}{ConTeXt Support Macros / Numbers}
-
-\unprotect
-
-%D \macros
-%D   {digits, setdigitmode, setdigitsign}
-%D
-%D Depending on the digit mode the command \type {\digits}
-%D normalizes number patterns depending on the language set.
-%D
-%D \starttyping
-%D This will never be a \digits{1.000.000} seller.
-%D \stoptyping
-%D
-%D or
-%D
-%D \starttyping
-%D I will never grow longer than \digits 1.86 \Meter.
-%D \stoptyping
-%D
-%D The different modes are shown in:
-%D
-%D \startbuffer
-%D \setdigitmode 1 \digits 12.345,90 \digits 12.345.000 \digits 1,23
-%D \setdigitmode 2 \digits 12.345,90 \digits 12.345.000 \digits 1,23
-%D \setdigitmode 3 \digits 12.345,90 \digits 12.345.000 \digits 1,23
-%D \setdigitmode 4 \digits 12.345,90 \digits 12.345.000 \digits 1,23
-%D \setdigitmode 5 \digits 12.345,90 \digits 12.345.000 \digits 1,23
-%D \setdigitmode 6 \digits 12.345,90 \digits 12.345.000 \digits 1,23
-%D \stopbuffer
-%D
-%D \typebuffer
-%
-%  This is typset as:
-%
-%  \startlines
-%  \getbuffer
-%  \stoplines
-%D
-%D The sign can be typeset as is or within the space of a
-%D digit.
-%D
-%D \startbuffer
-%D \setdigitsign 0 \digits +12.345,90
-%D \setdigitsign 1 \digits +12.345,90
-%D \setdigitsign 2 \digits +12.345,90
-%D \setdigitsign 3 \digits +12.345,90
-%D \stopbuffer
-%D
-%D \typebuffer
-%D
-%  This is typset as:
-%
-%  \startlines
-%  \getbuffer
-%  \stoplines
-
-\chardef\digitoutputmode=1 % 0..6
-\chardef\digitsignmode  =0 % 0..3
-
-\def\setdigitmode{\chardef\digitoutputmode}
-\def\setdigitsign{\chardef\digitsignmode}
-
-%D The digit modes are:
-%D
-%D \startitemize[packed]
-%D \item periods      \& comma
-%D \item commas       \& period
-%D \item thinmuskips  \& comma
-%D \item thinmuskips  \& period
-%D \item thickmuskips \& comma
-%D \item thickmuskips \& period
-%D \stopitemize
-
-\let\collecteddigits \empty \chardef\digitinputmode =1
-\let\saveddigits     \empty \chardef\skipdigit      =0
-\let\savedpowerdigits\empty \chardef\powerdigits    =0
-
-%D The first stage of the \type {\digit} macro takes care of
-%D the grouped call, the other branch handles the fuzzy
-%D delimited calls.
-
-\ifdefined\mbox \else \let\mbox\hbox \fi
-
-\unexpanded\def\digits
-  {\bgroup
-   \let~@%
-   \doifnextbgroupelse\dodigits{\doifnextcharelse\normalmathshift\domathdigits\grabdigit}}
-
-\def\dodigits#1%
-  {\grabdigit#1\relax}
-
-\def\domathdigits$#1$%
-  {\mbox{\grabdigit#1\relax}} % adding $ $ goes wrong in tabulate
-
-\def\grabdigit
-  {\futurelet\next\scandigit}
-
-%D Watch the test for \type {\nextobeyedline}, because the
-%D endofline token can be \type {\def'd}, not \type {\let}'d,
-%D we need to do an indirect test (see \type {verb-ini.tex})
-%D for details. (This probably needs an update.)
-
-\ifx\normalmathshift\undefined \let\normalmathshift=$ \fi
-
-\def\scandigit
-  {\ifx\next\blankspace
-     \let\next\handledigits
-   \else\ifx\next\nextobeyedline % the indirect one
-     \let\next\handledigits
-   \else\ifx\next\bgroup
-     \let\next\handledigits
-   \else\ifx\next\egroup
-     \let\next\handledigits
-   \else\ifx\next\normalmathshift
-     \let\next\handledigits
-   \else
-     \let\next\collectdigit
-   \fi\fi\fi\fi\fi
-   \next}
-
-%D We store the power||of||ten (to be signaled by \type {^},
-%D \type {e} or~\type {E}) in a seperate macro so that we can
-%D typeset it in superscript. The space placeholders are
-%D replaced by a \type {@}.
-
-\def\savedigit#1#2%
-  {\edef#1{#1\saveddigits#2}\let\saveddigits\empty}
-
-\long\def\collectdigit#1%
-  {\ifx#1~%
-     \savedigit\collecteddigits @%
-   \else\if#1_% tricky as can be several catcodes ... will become lua code anyway
-     \savedigit\collecteddigits @%
-   \else\if\noexpand#1\relax
-     \let\grabdigit\handledigits
-   \else\ifcase\powerdigits
-     \if#1E%
-       \chardef\powerdigits\plusone
-     \else\if#1e%
-       \chardef\powerdigits\plusone
-     \else\if#1^%
-       \chardef\powerdigits\plusone
-     \else
-       \savedigit\collecteddigits#1%
-       %\doifnumberelse{#1}
-       %  {\savedigit\collecteddigits#1}
-       %  {\def\saveddigits{#1}}%
-     \fi\fi\fi
-   \else
-     \savedigit\savedpowerdigits#1%
-     %\doifnumberelse{#1}
-     %  {\savedigit\savedpowerdigits#1}
-     %  {\def\saveddigits{#1}}%
-   \fi\fi\fi\fi
-   \grabdigit}
-
-\let\handlemathdigits\firstofoneargument
-\let\handletextdigits\mathematics
-
-\def\handledigits
-  {%\ifcase\powerdigits
-   %  \edef\collecteddigits{\collecteddigits\saveddigits}%
-   %\else
-   %  \edef\savedpowerdigits{\savedpowerdigits\saveddigits}%
-   %\fi
-   \ifmmode
-     \handlemathdigits{\dohandledigits}%
-   \else
-     \dontleavehmode\hbox{\handletextdigits{\dohandledigits}}%
-   \fi
-   \egroup}
-
-%D Although we could do with one pass, a second pass for
-%D handling the stored sequence is more readable.
-
-\ifnum\texengine=\luatexengine
-
-    \def\dohandledigits
-      {\mathcode`\,="002C \mathcode`\.="002E % pretty hard coded
-       \expandafter\handletokens\collecteddigits\with\scandigits
-       \ifcase\powerdigits\else\digitpowerseparator^{\savedpowerdigits}\fi}
-
-    \chardef\mathaxisfontid\zerocount
-
-\else
-
-    \def\dohandledigits
-      {\mathcode`\,="013B \mathcode`\.="013A % pretty hard coded
-       \expandafter\handletokens\collecteddigits\with\scandigits
-       \ifcase\powerdigits\else\digitpowerseparator^{\savedpowerdigits}\fi}
-
-    \chardef\mathaxisfontid\plustwo
-
-\fi
-
-\def\doscandigit#1%
-  {\ifcase\skipdigit\@EA\hbox\else\@EA\hphantom\fi\bgroup
-     \mathematics % brr, needed because of stored punctuation
-       {\ifnum\digitinputmode=#1\relax
-        \ifcase\digitoutputmode
-        \or .%
-        \or ,%
-        \or \mskip\thinmuskip
-        \or \mskip\thinmuskip
-        \or \mskip\thickmuskip
-        \or \mskip\thickmuskip
-        \fi
-      \else
-        \ifodd\digitoutputmode,\else.\fi
-      \fi}%
-   \egroup}
-
-%D The signs can be made smaller and sqeezed into the width
-%D of a digit. Watch the \type {\mathaxisheight} trickery (this
-%D font related register stored the math axis).
-
-% 0,=
-% 0,==  second = results in delta(00,=)
-% 0,-   is invalid, should be =
-% 0,--  is invalid, should be ==
-
-\def\digitzeroamount
-  {\digitsgn\zeroamount
-   \def\digitzeroamount
-     {\hphantom
-        {00\setbox\scratchbox\hbox{$\zeroamount$}%
-         \hskip-\wd\scratchbox}%
-      \let\digitzeroamount\empty}}
-
-\def\scandigits#1%
-  {\if#1.\digitsep1\else
-   \if#1,\digitsep2\else
-   \if#1@\digitnop \else
-   \if#1_\digitnop \else
-   \if#1/\digitsgn{\hphantom{+}}\chardef\skipdigit0\else
-   \if#1-\ifcase\skipdigit\digitsgn-\else
-           \box\digitsepbox\digitzeroamount \fi\chardef\skipdigit0\else
-   \if#1+\digitsgn+\chardef\skipdigit0\else
-   \if#1=\box\digitsepbox\digitzeroamount \chardef\skipdigit0\else
-   \if#1s\digitsgn{\hphantom{\positive}}\chardef\skipdigit0\else
-   \if#1p\digitsgn\positive\chardef\skipdigit0\else
-   \if#1m\digitsgn\negative\chardef\skipdigit0\else
-   \if#1n\digitsgn\negative\chardef\skipdigit0\else
-         \box\digitsepbox #1\chardef\skipdigit0\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
-
-\newbox\digitsepbox \chardef\autodigitmode=1
-
-\def\digitsep#1%
-  {\ifcase\autodigitmode
-     \doscandigit#1%
-   \else
-     \setbox\digitsepbox\hbox{\doscandigit#1}%
-   \fi
-   \chardef\skipdigit0\relax}
-
-% strange, does not work
-%
-% \def\digitnop
-%   {\hphantom{\box\digitsepbox}%
-%    \hphantom{0}\chardef\skipdigit1\relax}
-%
-% while this works
-
-\def\digitnop
-  {\hbox{\hphantom{\box\digitsepbox}}%
-   \hphantom{0}\chardef\skipdigit1\relax}
-
-% but this doesn't
-%
-% \def\digitnop
-%   {\hphantom{\box\digitsepbox0}%
-%    \chardef\skipdigit1\relax}
-
-\def\digitsgn#1%
-  {\ifcase\digitsignmode#1\else
-     \hbox
-       {\setbox\scratchbox\hbox{0}%
-        \scratchdimen\mathaxisheight\textfont\mathaxisfontid
-        \def\digitsgn##1##2%
-          {\advance\scratchdimen-\mathaxisheight##1\mathaxisfontid
-           \raise\scratchdimen
-           \hbox to \wd\scratchbox{\hss$##2#1$\hss}}%
-        \ifcase\digitsignmode\or
-          \digitsgn\textfont        \textstyle        \or
-          \digitsgn\scriptfont      \scriptstyle      \or
-          \digitsgn\scriptscriptfont\scriptscriptstyle\fi}%
-   \fi}
-
-\ifx\undefined\zeroamount \def\zeroamount{-} \fi
-\ifx\undefined\positive   \def\positive  {+} \fi
-\ifx\undefined\negative   \def\negative  {-} \fi
-
-%D The digit parser handles a bunch of special characters as
-%D well as different formats. We strongly suggest you to use
-%D the grouped call.
-%D
-%D \starttabulate[|l|l|l|]
-%D \NC \type{.} \NC , . \NC comma or period \NC \NR
-%D \NC \type{,} \NC , . \NC comma or period \NC \NR
-%D \NC \type{@} \NC \NC invisible space \NC \NR
-%D \NC \type{_} \NC \NC invisible space \NC \NR
-%D \NC \type{/} \NC \NC invisible sign \NC \NR
-%D \NC \type{-} \NC $-$ \NC minus sign \NC \NR
-%D \NC \type{+} \NC $+$ \NC plus sign \NC \NR
-%D \NC \type{s} \NC \NC invisible high sign \NC \NR
-%D \NC \type{p} \NC $\positive$ \NC high plus sign \NC \NR
-%D \NC \type{m} \NC $\negative$ \NC high minus sign \NC \NR
-%D \NC \type{n} \NC $\negative$ \NC high minus (negative) sign \NC \NR
-%D \NC \type{=} \NC $\zeroamount$ \NC zero padding \NC \NR
-%D \stoptabulate
-%D
-%D These triggers are used in the following examples.
-%D
-%D \startbuffer
-%D \digits 12
-%D \digits{~~~.~~~.~~~.68.712,34}
-%D \digits ~~~.~~~.~~~.68.712,34
-%D \digits ___.___.111.68.712,34
-%D \digits 111.111.111.68.712,34
-%D \digits 12.345,90
-%D \digits 12.345.000
-%D \digits 12,34
-%D \digits{392.857.230.68.712,34}
-%D {\digits1234}
-%D \digits{1234}
-%D \digits 1234\relax
-%D $\digits 123.222,00$
-%D \digits 123.222,00
-%D \digits 123.222,==
-%D \digits 123.222,00^10
-%D \digits 123.222,00e10
-%D \digits /123.222,00e-12
-%D \digits -123.222,00e-12
-%D \digits +123.222,00e-12
-%D \digits n123.222,00e-12
-%D \digits s123.222,00e-12
-%D \digits p123.222,00e-12
-%D \stopbuffer
-%D
-%D \typebuffer
-%
-%  \startlines
-%  \getbuffer
-%  \stoplines
-
-%D \macros
-%D   {Digits}
-%D
-%D We also permit:
-
-\let\Digits\digits
-
-%D These macros are complicated by the fact that we also
-%D have to support cases like:
-%D
-%D \starttyping
-%D {\digits1234}
-%D \digits{1234}
-%D \digits 1234\whatever
-%D $\digits 123.222,00$
-%D \digits 123.222,00.
-%D \stoptyping
-%D
-%D The latter case shows us that trailing non digits are to
-%D be passed untreated.
-%D
-%D Another interesting case is:
-%D
-%D \starttyping
-%D \digits 123.222,00^10
-%D \stoptyping
-%D
-%D The separator is defined as:
-
-% \def\digitpowerseparator%
-%   {\cdot10} % {\times10}
-
-\def\digitpowerseparator
-  {\ifx\collecteddigits\empty\else\cdot\fi10}
-
-%D \macros
-%D   {digittemplate}
-%D
-%D Users can specify the way they enter those digits by saying
-%D something like:
-%D
-%D \starttyping
-%D \digittemplate 12.000.000,00 % \digittemplate .,
-%D \stoptyping
-
-\def\digittemplate #1 %
-  {\chardef\digitinputmode\zerocount
-   \handletokens#1\with\scandigittemplate}
-
-\def\scandigittemplate#1%
-  {\if     #1.\ifcase\digitinputmode\chardef\digitinputmode\plusone \fi% period
-   \else\if#1,\ifcase\digitinputmode\chardef\digitinputmode\plustwo \fi% comma
-   \fi\fi}
-
-\protect \endinput
diff --git a/tex/context/base/syst-aux.mkiv b/tex/context/base/syst-aux.mkiv
index 8a791e900..824754a77 100644
--- a/tex/context/base/syst-aux.mkiv
+++ b/tex/context/base/syst-aux.mkiv
@@ -3747,7 +3747,7 @@
    \expandafter\appendtoks\expandafter\the\csname t\strippedcsname#1\endcsname\to  #1%
    \csname t\strippedcsname#1\endcsname}
 
-\def\newevery#1#2%
+\unexpanded\def\newevery#1#2%
   {\ifx#1\everypar\else\newtoks#1\fi% we test for redefinition elsewhere
    \ifx#2\relax\else\ifdefined#2\else
      \expandafter\newtoks\csname t\strippedcsname#1\endcsname
@@ -3763,6 +3763,9 @@
 
 \newevery \neverypar  \NeveryPar
 
+\unexpanded\def\forgeteverypar
+  {\everypar{\the\neverypar}}
+
 %D Which we're going to use indeed! When the second argument
 %D equals \type {\relax}, the first token list is created
 %D unless it is already defined.
diff --git a/tex/context/base/trac-vis.lua b/tex/context/base/trac-vis.lua
index aff044921..556dc1347 100644
--- a/tex/context/base/trac-vis.lua
+++ b/tex/context/base/trac-vis.lua
@@ -24,6 +24,9 @@ local format = string.format
 -- with full visualization enabled. In practice this will never happen
 -- unless one is demoing.
 
+-- We could use pdf literals and re stream codes but it's not worth the
+-- trouble because we would end up in color etc mess.
+
 -- todo: global switch (so no attributes)
 -- todo: maybe also xoffset, yoffset of glyph
 -- todo: inline concat (more efficient)
@@ -32,10 +35,12 @@ local nodecodes           = nodes.nodecodes
 local disc_code           = nodecodes.disc
 local kern_code           = nodecodes.kern
 local glyph_code          = nodecodes.glyph
+local disc_code           = nodecodes.disc
 local hlist_code          = nodecodes.hlist
 local vlist_code          = nodecodes.vlist
 local glue_code           = nodecodes.glue
 local penalty_code        = nodecodes.penalty
+local whatsit_code        = nodecodes.whatsit
 
 local kerncodes           = nodes.kerncodes
 local font_kern_code      = kerncodes.fontkern
@@ -60,7 +65,9 @@ local free_node           = node.free
 local free_node_list      = node.flush_list
 local has_attribute       = node.has_attribute
 local set_attribute       = node.set_attribute
+local unset_attribute     = node.unset_attribute
 local insert_before       = node.insert_before
+local insert_after        = node.insert_after
 local fast_hpack          = nodes.fasthpack
 
 local tex_attribute       = tex.attribute
@@ -105,28 +112,39 @@ local bit                 = number.bit
 local setbit              = number.setbit
 local clearbit            = number.clearbit
 
-local trace_hbox     --  1
-local trace_vbox     --  2
-local trace_kern     --  4
-local trace_glue     --  8
-local trace_penalty  -- 16
-local trace_fontkern -- 32
+local trace_hbox
+local trace_vbox
+local trace_vtop
+local trace_kern
+local trace_glue
+local trace_penalty
+local trace_fontkern
+local trace_strut
+local trace_whatsit
 
 local report_visualize = logs.reporter("visualize")
 
 local modes = {
-    hbox     =  1,
-    vbox     =  2,
-    kern     =  4,
-    glue     =  8,
-    penalty  = 16,
-    fontkern = 32,
+    hbox     =   1,
+    vbox     =   2,
+    vtop     =   4,
+    kern     =   8,
+    glue     =  16,
+    penalty  =  32,
+    fontkern =  64,
+    strut    = 128,
+    whatsit  = 256,
+    glyph    = 512,
 }
 
+local makeup_modes = { "hbox", "vbox", "vtop", "kern", "glue", "penalty" }
+local all_modes    = { "hbox", "vbox", "vtop", "kern", "glue", "penalty", "fontkern", "whatsit", "glyph" }
+
 local usedfont, exheight, emwidth
-local l_penalty, l_glue, l_kern, l_fontkern, l_hbox, l_vbox
+local l_penalty, l_glue, l_kern, l_fontkern, l_hbox, l_vbox, l_vtop, l_strut, l_whatsit, l_glyph
 
 local enabled = false
+local layers  = { }
 
 function visualizers.setfont(id)
     usedfont = id or current_font()
@@ -138,17 +156,15 @@ local function setvisual(n,a,what) -- this will become more efficient when we ha
     if not n or n == "reset" then
         return unsetvalue
     elseif n == "makeup" then
-        a = setvisual("hbox",a)
-        a = setvisual("vbox",a)
-        a = setvisual("kern",a)
-        a = setvisual("glue",a)
-        a = setvisual("penalty",a)
+        for i=1,#makeup_modes do
+            a = setvisual(makeup_modes[i],a)
+        end
     elseif n == "all" then
         if what == false then
             return unsetvalue
         else
-            for k, v in next, modes do
-                a = setvisual(k,a)
+            for i=1,#all_modes do
+                a = setvisual(all_modes[i],a)
             end
         end
     else
@@ -176,7 +192,6 @@ local function setvisual(n,a,what) -- this will become more efficient when we ha
             -- we use a narrow monospaced font
             visualizers.setfont(fonts.definers.define { name = "lmmonoltcond10regular", size = tex.sp("4pt") })
         end
-        local layers = { }
         for mode, value in next, modes do
             local tag = format("v_%s",mode)
             attributes.viewerlayers.define {
@@ -188,12 +203,16 @@ local function setvisual(n,a,what) -- this will become more efficient when we ha
             }
             layers[mode] = attributes.viewerlayers.register(tag,true)
         end
-        l_penalty  = layers.penalty
+        l_hbox     = layers.hbox
+        l_vbox     = layers.vbox
+        l_vtop     = layers.vtop
         l_glue     = layers.glue
         l_kern     = layers.kern
+        l_penalty  = layers.penalty
         l_fontkern = layers.fontkern
-        l_hbox     = layers.hbox
-        l_vbox     = layers.vbox
+        l_strut    = layers.strut
+        l_whatsit  = layers.whatsit
+        l_glyph    = layers.glyph
         nodes.tasks.enableaction("shipouts","nodes.visualizers.handler")
         report_visualize("enabled")
         enabled = true
@@ -205,7 +224,12 @@ function visualizers.setvisual(n)
     tex_attribute[a_visual] = setvisual(n,tex_attribute[a_visual])
 end
 
+function visualizers.setlayer(n)
+    tex_attribute[a_layer] = layers[n] or unsetvalue
+end
+
 commands.setvisual = visualizers.setvisual
+commands.setlayer  = visualizers.setlayer
 
 function commands.visual(n)
     context(setvisual(n,0))
@@ -230,6 +254,7 @@ local c_text       = "trace:s"
 local c_space      = "trace:y"
 local c_skip_a     = "trace:c"
 local c_skip_b     = "trace:m"
+local c_glyph      = "trace:o"
 
 local c_positive_d = "trace:db"
 local c_negative_d = "trace:dr"
@@ -238,6 +263,7 @@ local c_text_d     = "trace:ds"
 local c_space_d    = "trace:dy"
 local c_skip_a_d   = "trace:dc"
 local c_skip_b_d   = "trace:dm"
+local c_glyph_d    = "trace:do"
 
 local function sometext(str,layer,color)
     local text = fast_hpack_string(str,usedfont)
@@ -291,15 +317,29 @@ local function fontkern(head,current)
         info.depth = 0
         f_cache[kern] = info
     end
-    head, current = insert_before(head,current,copy_list(info))
-    return head, current.next
+    head = insert_before(head,current,copy_list(info))
+    return head, current
 end
 
--- cache baseline
+local w_cache = { }
+
+local function whatsit(head,current)
+    local what = current.subtype
+    local info = w_cache[what]
+    if info then
+        -- print("hit whatsit")
+    else
+        local info = sometext(format("W:%s",what),usedfont)
+        set_attribute(info,a_layer,l_whatsit)
+        w_cache[what] = info
+    end
+    head, current = insert_after(head,current,copy_list(info))
+    return head, current
+end
 
 local b_cache
 
-local function ruledbox(head, current, vertical)
+local function ruledbox(head,current,vertical,layer)
     local wd = current.width
     if wd ~= 0 then
         local ht, dp = current.height, current.depth
@@ -348,10 +388,13 @@ local function ruledbox(head, current, vertical)
         info.width = 0
         info.height = 0
         info.depth = 0
-        set_attribute(info,a_layer,vertical and l_vbox or l_hbox)
+        set_attribute(info,a_layer,layer)
         local info = concat_nodes {
-            info,
+--             info,
+--             current,
             current,
+            new_kern(-wd),
+            info,
         }
         info = fast_hpack(info)
         if vertical then
@@ -375,6 +418,59 @@ local function ruledbox(head, current, vertical)
     end
 end
 
+local function ruledglyph(head,current)
+    local wd = current.width
+    if wd ~= 0 then
+        local ht, dp = current.height, current.depth
+        local next, prev = current.next, current.prev
+        current.next, current.prev = nil, nil
+        local linewidth = .05 * emwidth
+        local baseline
+        if dp ~= 0 and ht ~= 0 then
+            baseline = new_rule(wd-2*linewidth,linewidth,0)
+        end
+        local doublelinewidth = 2*linewidth
+        local info = concat_nodes {
+            new_rule(linewidth,ht,dp),
+            new_rule(wd-doublelinewidth,-dp+linewidth,dp),
+            new_rule(linewidth,ht,dp),
+            new_kern(-wd+linewidth),
+            new_rule(wd-doublelinewidth,ht,-ht+linewidth),
+            new_kern(-wd+doublelinewidth),
+            baseline,
+        }
+        setlistcolor(info,c_glyph)
+        setlisttransparency(info,c_glyph_d)
+        info = fast_hpack(info)
+        info.width = 0
+        info.height = 0
+        info.depth = 0
+        set_attribute(info,a_layer,l_glyph)
+        local info = concat_nodes {
+            current,
+            new_kern(-wd),
+            info,
+        }
+        info = fast_hpack(info)
+        info.width = wd
+        if next then
+            info.next = next
+            next.prev = info
+        end
+        if prev then
+            info.prev = prev
+            prev.next = info
+        end
+        if head == current then
+            return info, info
+        else
+            return head, info
+        end
+    else
+        return head, current
+    end
+end
+
 local g_cache = { }
 
 local tags = {
@@ -494,10 +590,14 @@ end
 local function visualize(head,vertical)
     local trace_hbox     = false
     local trace_vbox     = false
+    local trace_vtop     = false
     local trace_kern     = false
     local trace_glue     = false
     local trace_penalty  = false
     local trace_fontkern = false
+    local trace_strut    = false
+    local trace_whatsit  = false
+    local trace_glyph    = false
     local current = head
     local prev_trace_fontkern = nil
     local attr = unsetvalue
@@ -509,21 +609,50 @@ local function visualize(head,vertical)
             if not a then
                 trace_hbox     = false
                 trace_vbox     = false
+                trace_vtop     = false
                 trace_kern     = false
                 trace_glue     = false
                 trace_penalty  = false
                 trace_fontkern = false
+                trace_strut    = false
+                trace_whatsit  = false
+                trace_glyph    = false
             else
-                trace_hbox     = hasbit(a,1)
-                trace_vbox     = hasbit(a,2)
-                trace_kern     = hasbit(a,4)
-                trace_glue     = hasbit(a,8)
-                trace_penalty  = hasbit(a,16)
-                trace_fontkern = hasbit(a,32)
+                trace_hbox     = hasbit(a,  1)
+                trace_vbox     = hasbit(a,  2)
+                trace_vtop     = hasbit(a,  4)
+                trace_kern     = hasbit(a,  8)
+                trace_glue     = hasbit(a, 16)
+                trace_penalty  = hasbit(a, 32)
+                trace_fontkern = hasbit(a, 64)
+                trace_strut    = hasbit(a,128)
+                trace_whatsit  = hasbit(a,256)
+                trace_glyph    = hasbit(a,512)
             end
             attr = a
         end
-        if id == kern_code then
+        if trace_strut then
+            set_attribute(current,a_layer,l_strut)
+        elseif id == glyph_code then
+            if trace_glyph then
+                head, current = ruledglyph(head,current)
+            end
+        elseif id == disc_code then
+            if trace_glyph then
+                local pre = current.pre
+                if pre then
+                    current.pre = ruledglyph(pre,pre)
+                end
+                local post = current.post
+                if post then
+                    current.post = ruledglyph(post,post)
+                end
+                local replace = current.replace
+                if replace then
+                    current.replace = ruledglyph(replace,replace)
+                end
+            end
+        elseif id == kern_code then
             local subtype = current.subtype
             -- tricky ... we don't copy the trace attribute in node-inj (yet)
             if subtype == font_kern_code or has_attribute(current,a_fontkern) then
@@ -538,7 +667,7 @@ local function visualize(head,vertical)
         elseif id == glue_code then
             local content = current.leader
             if content then
-                current.leaders = visualize(content,false)
+                current.leader = visualize(content,false)
             elseif trace_glue then
                 head, current = ruledglue(head,current,vertical)
             end
@@ -556,15 +685,21 @@ local function visualize(head,vertical)
                 current.list = visualize(content,false)
             end
             if trace_hbox then
-                head, current = ruledbox(head,current,false)
+                head, current = ruledbox(head,current,false,l_hbox)
             end
         elseif id == vlist_code then
             local content = current.list
             if content then
                 current.list = visualize(content,true)
             end
-            if trace_vbox then
-                head, current = ruledbox(head,current,true)
+            if trace_vtop then
+                head, current = ruledbox(head,current,true,l_vtop)
+            elseif trace_vbox then
+                head, current = ruledbox(head,current,true,l_vbox)
+            end
+        elseif id == whatsit_code then
+            if trace_whatsit then
+                head, current = whatsit(head,current)
             end
         end
         current = current.next
@@ -586,30 +721,37 @@ local function freed(cache)
 end
 
 local function cleanup()
-    local hf, ng, np, nk
+    local hf, ng, np, nk, nw
     nf, f_cache = freed(f_cache)
     ng, g_cache = freed(g_cache)
     np, p_cache = freed(p_cache)
     nk, k_cache = freed(k_cache)
+    nw, w_cache = freed(w_cache)
     if b_cache then
         free_node_list(b_cache)
         b_cache = nil
     end
- -- report_visualize("cache: %s fontkerns, %s skips, %s penalties, %s kerns",nf,ng,np,nk)
+ -- report_visualize("cache: %s fontkerns, %s skips, %s penalties, %s kerns, %s whatsits",nf,ng,np,nk,nw)
 end
 
 function visualizers.handler(head)
     if usedfont then
         starttiming(visualizers)
+     -- local l = tex_attribute[a_layer]
+     -- local v = tex_attribute[a_visual]
+     -- tex_attribute[a_layer] = unsetvalue
+     -- tex_attribute[a_visual] = unsetvalue
         head = visualize(head)
---      cleanup()
+     -- tex_attribute[a_layer] = l
+     -- tex_attribute[a_visual] = v
+     -- -- cleanup()
         stoptiming(visualizers)
     end
     return head, false
 end
 
-function nodes.visualizers.box(n)
-    tex.box[n].list = nodes.visualizers.handler(tex.box[n].list)
+function visualizers.box(n)
+    tex.box[n].list = visualizers.handler(tex.box[n].list)
 end
 
 statistics.register("visualization time",function()
diff --git a/tex/context/base/trac-vis.mkiv b/tex/context/base/trac-vis.mkiv
index 256c648fc..ed24edf92 100644
--- a/tex/context/base/trac-vis.mkiv
+++ b/tex/context/base/trac-vis.mkiv
@@ -41,13 +41,27 @@
 %D We only provide box visualizers as they can come in handy for testing
 %D macros. In due time we will move some of the m-visual code here too.
 
+\let\syst_visualizers_hbox\hbox
+\let\syst_visualizers_vbox\vbox
+\let\syst_visualizers_vtop\vtop
 
-\unexpanded\def\ruledhbox{\hbox attr \visualattribute \ctxcommand{visual("hbox")} }
-\unexpanded\def\ruledvbox{\vbox attr \visualattribute \ctxcommand{visual("vbox")} }
-\unexpanded\def\ruledvtop{\vtop attr \visualattribute \ctxcommand{visual("vbox")} }
+\unexpanded\def\ruledhbox{\syst_visualizers_hbox attr \visualattribute \ctxcommand{visual("hbox")} }
+\unexpanded\def\ruledvbox{\syst_visualizers_vbox attr \visualattribute \ctxcommand{visual("vbox")} }
+\unexpanded\def\ruledvtop{\syst_visualizers_vtop attr \visualattribute \ctxcommand{visual("vtop")} } % special case
 
 \unexpanded\def\showmakeup
-  {\ctxcommand{setvisual("makeup")} }
+  {\ctxcommand{setvisual("makeup")}%
+   \let\normalvtop\ruledvtop
+   \let\vtop      \ruledvtop}
+
+\unexpanded\def\showallmakeup
+  {\ctxcommand{setvisual("all")}%
+   \let\normalvtop\ruledvtop
+   \let\vtop      \ruledvtop
+   \showstruts}
+
+\unexpanded\def\showglyphs
+  {\ctxcommand{setvisual("glyph")}}
 
 \unexpanded\def\setvisualizerfont
   {\dosingleempty\syst_visualizers_setfont}
@@ -58,6 +72,15 @@
    \ctxlua{nodes.visualizers.setfont()}%
    \endgroup}
 
+%D Overload:
+
+% \def\spac_struts_vide_hbox
+%   {\hbox attr \visualattribute \ctxcommand{visual("strut")} }
+
+\def\spac_struts_vide_hbox
+  {\edef\spac_struts_vide_hbox{\hbox attr \visualattribute \ctxcommand{visual("strut")} }%
+   \spac_struts_vide_hbox}
+
 %D We keep this one:
 
 \unexpanded\def\dontinterfere
diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua
index 8e9102cb6..c2af5a944 100644
--- a/tex/generic/context/luatex/luatex-fonts-merged.lua
+++ b/tex/generic/context/luatex/luatex-fonts-merged.lua
@@ -1,6 +1,6 @@
 -- merged file : luatex-fonts-merged.lua
 -- parent file : luatex-fonts.lua
--- merge date  : 06/26/12 10:59:33
+-- merge date  : 06/27/12 14:37:43
 
 do -- begin closure to overcome local limits and interference
 
-- 
cgit v1.2.3