summaryrefslogtreecommitdiff
path: root/tex
diff options
context:
space:
mode:
Diffstat (limited to 'tex')
-rw-r--r--tex/context/base/mkii/cont-new.mkii2
-rw-r--r--tex/context/base/mkii/context.mkii2
-rw-r--r--tex/context/base/mkiv/cont-new.mkiv2
-rw-r--r--tex/context/base/mkiv/context.mkiv2
-rw-r--r--tex/context/base/mkiv/context.mkxl2
-rw-r--r--tex/context/base/mkiv/file-lib.lua19
-rw-r--r--tex/context/base/mkiv/font-ogr.lua85
-rw-r--r--tex/context/base/mkiv/lpdf-emb.lua66
-rw-r--r--tex/context/base/mkiv/lpdf-lmt.lua19
-rw-r--r--tex/context/base/mkiv/mlib-ctx.lua1
-rw-r--r--tex/context/base/mkiv/mlib-run.lua4
-rw-r--r--tex/context/base/mkiv/mlib-scn.lua4
-rw-r--r--tex/context/base/mkiv/mult-aux.mkiv66
-rw-r--r--tex/context/base/mkiv/mult-aux.mkxl65
-rw-r--r--tex/context/base/mkiv/status-files.pdfbin26662 -> 26651 bytes
-rw-r--r--tex/context/base/mkiv/status-lua.pdfbin268380 -> 267548 bytes
-rw-r--r--tex/context/base/mkiv/supp-box.mkiv4
-rw-r--r--tex/context/base/mkiv/supp-box.mkxl4
-rw-r--r--tex/context/interface/mkiv/i-context.pdfbin893252 -> 893159 bytes
-rw-r--r--tex/context/interface/mkiv/i-readme.pdfbin61165 -> 61165 bytes
-rw-r--r--tex/context/modules/mkiv/m-catchword.mkiv136
-rw-r--r--tex/context/modules/mkiv/x-setups-overview.mkiv6
-rw-r--r--tex/generic/context/luatex/luatex-fonts-merged.lua2
23 files changed, 358 insertions, 133 deletions
diff --git a/tex/context/base/mkii/cont-new.mkii b/tex/context/base/mkii/cont-new.mkii
index 08e2176a8..bcfd567ac 100644
--- a/tex/context/base/mkii/cont-new.mkii
+++ b/tex/context/base/mkii/cont-new.mkii
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\newcontextversion{2019.10.05 14:45}
+\newcontextversion{2019.10.08 19:15}
%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/mkii/context.mkii b/tex/context/base/mkii/context.mkii
index e1b15ce6a..cf799ddf2 100644
--- a/tex/context/base/mkii/context.mkii
+++ b/tex/context/base/mkii/context.mkii
@@ -20,7 +20,7 @@
%D your styles an modules.
\edef\contextformat {\jobname}
-\edef\contextversion{2019.10.05 14:45}
+\edef\contextversion{2019.10.08 19:15}
%D For those who want to use this:
diff --git a/tex/context/base/mkiv/cont-new.mkiv b/tex/context/base/mkiv/cont-new.mkiv
index 07821ba93..eab60bbf9 100644
--- a/tex/context/base/mkiv/cont-new.mkiv
+++ b/tex/context/base/mkiv/cont-new.mkiv
@@ -13,7 +13,7 @@
% \normalend % uncomment this to get the real base runtime
-\newcontextversion{2019.10.05 14:45}
+\newcontextversion{2019.10.08 19:15}
%D This file is loaded at runtime, thereby providing an excellent place for
%D hacks, patches, extensions and new features.
diff --git a/tex/context/base/mkiv/context.mkiv b/tex/context/base/mkiv/context.mkiv
index ae52ed885..035353db2 100644
--- a/tex/context/base/mkiv/context.mkiv
+++ b/tex/context/base/mkiv/context.mkiv
@@ -45,7 +45,7 @@
%D {YYYY.MM.DD HH:MM} format.
\edef\contextformat {\jobname}
-\edef\contextversion{2019.10.05 14:45}
+\edef\contextversion{2019.10.08 19:15}
\edef\contextkind {beta}
%D Kind of special:
diff --git a/tex/context/base/mkiv/context.mkxl b/tex/context/base/mkiv/context.mkxl
index 538735850..1867e3df4 100644
--- a/tex/context/base/mkiv/context.mkxl
+++ b/tex/context/base/mkiv/context.mkxl
@@ -29,7 +29,7 @@
%D {YYYY.MM.DD HH:MM} format.
\edef\contextformat {\jobname}
-\edef\contextversion{2019.10.05 14:45}
+\edef\contextversion{2019.10.08 19:15}
\edef\contextkind {beta}
%D Kind of special:
diff --git a/tex/context/base/mkiv/file-lib.lua b/tex/context/base/mkiv/file-lib.lua
index 62cf938ba..8ef1a48d3 100644
--- a/tex/context/base/mkiv/file-lib.lua
+++ b/tex/context/base/mkiv/file-lib.lua
@@ -61,13 +61,18 @@ function resolvers.uselibrary(specification) -- todo: reporter
if not foundname then
-- pattern based search
for i=1,#patterns do
- local wanted = format(patterns[i],barename)
- foundname = found(wanted)
- if trace_libraries then
- report_library("checking %a as %a: %s",filename,wanted,foundname or "not found")
- end
- if foundname then
- break
+ local pattern = patterns[i]
+ if pattern and pattern ~= "" then
+ local wanted = format(pattern,barename)
+ foundname = found(wanted)
+ if trace_libraries then
+ report_library("checking %a as %a: %s",filename,wanted,foundname or "not found")
+ end
+ if foundname then
+ break
+ end
+ else
+ -- can be a bogus path (coming from a test)
end
end
end
diff --git a/tex/context/base/mkiv/font-ogr.lua b/tex/context/base/mkiv/font-ogr.lua
index 5d45c3c5b..5fc946f42 100644
--- a/tex/context/base/mkiv/font-ogr.lua
+++ b/tex/context/base/mkiv/font-ogr.lua
@@ -17,6 +17,7 @@ end
local tostring, tonumber, next, type = tostring, tonumber, next, type
local round, max, mod, div = math.round, math.max, math.mod, math.div
+local find = string.find
local concat, setmetatableindex, sortedhash = table.concat, table.setmetatableindex, table.sortedhash
local utfbyte = utf.byte
local formatters = string.formatters
@@ -96,13 +97,7 @@ do
if shape then
if idx >= 255 then
idx = 1
- colrshapes = { -- or use metatable
- filename = shapes.filename,
- fixdepth = shapes.fixdepth,
- units = shapes.units,
- usecolor = shapes.usecolor,
- -- instance = shapes.instance,
- }
+ colrshapes = setmetatableindex({ },shapes)
slot, droppedin, tfmdrop = dropins.provide(method,tfmdata,colrshapes)
dropchars = tfmdrop.characters
dropdescs = tfmdrop.descriptions
@@ -143,13 +138,7 @@ do
if shape then
if idx >= 255 then
idx = 1
- colrshapes = { -- or use metatable
- filename = shapes.filename,
- fixdepth = shapes.fixdepth,
- units = shapes.units,
- usecolor = shapes.usecolor,
- -- instance = shapes.instance,
- }
+ colrshapes = setmetatableindex({ },shapes)
slot, droppedin, tfmdrop = dropins.provide(method,tfmdata,colrshapes)
dropchars = tfmdrop.characters
dropdescs = tfmdrop.descriptions
@@ -225,20 +214,46 @@ do
shapes[category].glyphs[unicode] = parameters
end
+ -- local function hascolorspec(t)
+ -- if (t.color or "") ~= "" then
+ -- return true
+ -- elseif (t.fillcolor or "") ~= "" then
+ -- return true
+ -- elseif (t.drawcolor or "") ~= "" then
+ -- return true
+ -- elseif (t.linecolor or "") ~= "" then
+ -- return true
+ -- else
+ -- return false
+ -- end
+ -- end
+
+ local function hascolorspec(t)
+ for k, v in next, t do
+ if find(k,"color") then
+ return true
+ end
+ end
+ return false
+ end
+
local function initializemps(tfmdata,kind,value)
if value then
- local spec = settings_to_hash_strict(value)
- if not spec or not next(spec) then
- spec = { category = value }
+ local specification = settings_to_hash_strict(value)
+ if not specification or not next(specification) then
+ specification = { category = value }
end
-- todo: multiple categories but then mayb also different
- -- clones because of the units .. fot now we assume the same
+ -- clones because of the units .. for now we assume the same
-- units
- local category = spec.category
+ local category = specification.category
if category and category ~= "" then
local categories = settings_to_array(category)
local usedshapes = nil
local index = 0
+ local spread = tonumber(specification.spread or 0)
+ local hascolor = hascolorspec(specification)
+ specification.spread = spread -- now a number
for i=1,#categories do
local category = categories[i]
local mpsshapes = shapes[category]
@@ -252,23 +267,37 @@ do
local defaultwidth = mpsparameters.width or 0
local defaultheight = mpsparameters.height or 0
local defaultdepth = mpsparameters.depth or 0
- local defaultcode = mpsparameters.code or ""
+ local usecolor = mpsparameters.usecolor
+ local spread = spread * units
+ local defaultcode = mpsparameters.code or ""
local scale = parameters.size / units
+ if hascolor then
+ -- the graphic has color
+ usecolor = false
+ else
+ -- do whatever is specified
+ end
usedshapes = usedshapes or {
- instance = "simplefun",
- units = units,
- usecolor = mpsparameters.usecolor,
+ instance = "simplefun",
+ units = units,
+ usecolor = usecolor,
+ specification = specification,
+ shapes = mpsshapes,
}
-- todo: deal with extensibles and more properties
for unicode, shape in sortedhash(mpsshapes.glyphs) do
-- local oldc = characters[unicode]
-- if oldc then
- index = index + 1
+ index = index + 1 -- todo: somehow we end up with 2 as first entry after 0
+ local wd = shape.width or defaultwidth
+ local ht = shape.height or defaultheight
+ local dp = shape.depth or defaultdepth
local newc = {
- index = index, -- into usedshapes
- width = scale * (shape.width or defaultwidth),
- height = scale * (shape.height or defaultheight),
- depth = scale * (shape.depth or defaultdepth),
+ index = index, -- into usedshapes
+ width = scale * (wd + spread),
+ height = scale * ht,
+ depth = scale * dp,
+ unicode = unicode,
}
--
characters [unicode] = newc
diff --git a/tex/context/base/mkiv/lpdf-emb.lua b/tex/context/base/mkiv/lpdf-emb.lua
index 28ff6ceaf..bb6a421f2 100644
--- a/tex/context/base/mkiv/lpdf-emb.lua
+++ b/tex/context/base/mkiv/lpdf-emb.lua
@@ -105,7 +105,8 @@ do
-- backend). In fact, we can now no longer pass the tounicodes to the frontend but
-- pick them up from the descriptions.
- local f_mapping = formatters["<%04X> <%s>"]
+ local f_mapping_2 = formatters["<%02X> <%s>"]
+ local f_mapping_4 = formatters["<%04X> <%s>"]
local tounicode = fonts.mappings.tounicode
@@ -130,7 +131,7 @@ local tounicode_template = [[
2
def
1 begincodespacerange
- <0000> <FFFF>
+ <%s> <%s>
endcodespacerange
%i beginbfchar
%s
@@ -142,10 +143,11 @@ end
%%%%EndResource
%%%%EOF]]
- tounicodedictionary = function(details,indices,maxindex,name)
+ tounicodedictionary = function(details,indices,maxindex,name,wide)
local mapping = { }
local length = 0
if maxindex > 0 then
+ local f_mapping = wide and f_mapping_4 or f_mapping_2
for index=1,maxindex do
local data = indices[index]
if data then
@@ -160,8 +162,10 @@ end
end
end
end
- local name = gsub(name,"%+","-") -- like luatex does
- local blob = format(tounicode_template,name,name,name,name,name,length,concat(mapping,"\n"))
+ local name = gsub(name,"%+","-") -- like luatex does
+ local first = wide and "0000" or "00"
+ local last = wide and "FFFF" or "FF"
+ local blob = format(tounicode_template,name,name,name,name,name,first,last,length,concat(mapping,"\n"))
return blob
end
@@ -834,7 +838,7 @@ do
local basefont = pdfconstant(basefontname)
local widths = widtharray(details,indices,maxindex,units)
local object = details.objectnumber
- local tounicode = tounicodedictionary(details,indices,maxindex,basefontname)
+ local tounicode = tounicodedictionary(details,indices,maxindex,basefontname,true)
local tocidset = tocidsetdictionary(indices,minindex,maxindex)
local metabbox = metadata.boundingbox or { 0, 0, 0, 0 }
local fontbbox = pdfarray { unpack(metabbox) }
@@ -1417,7 +1421,7 @@ do
local basefont = pdfconstant(basefontname)
local widths = widtharray(details,indices,maxindex,units * correction)
local object = details.objectnumber
- local tounicode = tounicodedictionary(details,indices,maxindex,basefontname)
+ local tounicode = tounicodedictionary(details,indices,maxindex,basefontname,true)
local tocidset = tocidsetdictionary(indices,minindex,maxindex)
local fontbbox = pdfarray { unpack(metabbox) }
local ascender = metadata.ascender or 0
@@ -1536,7 +1540,9 @@ do
local f_stream_d = formatters["%.6N 0 d0 1 0 0 1 0 %.3N cm %s"]
-- A type 3 font has at most 256 characters and Acrobat also wants a zero slot
- -- to be filled. We can share a mandate zero slot character.
+ -- to be filled. We can share a mandate zero slot character. We also need to
+ -- make sure that we use bytes as index in the page stream as well as in the
+ -- tounicode vector.
local c_notdef = nil
local r_notdef = nil
@@ -1611,24 +1617,39 @@ do
-- mps inclusion
- local decompress = gzip.decompress
+ local decompress = gzip.decompress
+ local metapost = metapost
+ local simplemprun = metapost.simple
+ local setparameterset = metapost.setparameterset
function methods.mps(filename,details)
local properties = details.properties
- local mpshapes = properties.indexdata[1]
+ local mpshapes = properties.indexdata[1] -- indexdata will change
if mpshapes then
- local scale = 10 * details.parameters.size/details.parameters.designsize
- local units = mpshapes.units or details.parameters.units
- local factor = units * bpfactor / scale
- local fixdepth = mpshapes.fixdepth
- local usecolor = mpshapes.usecolor
- -- todo: each mp a table with properties (like using d0 / d1)
+ local scale = 10 * details.parameters.size/details.parameters.designsize
+ local units = mpshapes.units or details.parameters.units
+ local factor = units * bpfactor / scale
+ local fixdepth = mpshapes.fixdepth
+ local usecolor = mpshapes.usecolor
+ local specification = mpshapes.specification
+ local shapedefinitions = mpshapes.shapes
+ local instance = mpshapes.instance
+ --
+ simplemprun(instance,"begingroup;",true,true)
+ setparameterset("mpsfont",specification)
+ if shapedefinitions then
+ local preamble = shapedefinitions.parameters.preamble
+ if preamble then
+ simplemprun(instance,preamble,true,true)
+ end
+ end
+ --
local function mpstopdf(mp,data)
local width = data.width
if decompress then
mp = decompress(mp)
end
- local pdf = metapost.simple(mpshapes.instance,mp,true) -- can be sped up, minifun
+ local pdf = simplemprun(instance,mp,true) -- can be sped up, minifun
local width = width * factor
if usecolor then
return f_stream_c(width,pdf), width
@@ -1641,12 +1662,19 @@ do
end
return f_stream(width,pdf), width
end
+ --
+ local function resetmps()
+ setparameterset("mpsfont")
+ simplemprun(instance,"endgroup;",true,true)
+ end
+ --
local function getresources()
return lpdf.collectedresources {
serialize = false,
}
end
- return mpshapes, 1/units, mpstopdf, false, getresources
+ --
+ return mpshapes, 1/units, mpstopdf, resetmps, getresources
end
end
@@ -1805,7 +1833,7 @@ do
Type = pdfconstant("Encoding"),
Differences = differences,
}
- local tounicode = tounicodedictionary(details,indices,maxindex,basefontname)
+ local tounicode = tounicodedictionary(details,indices,maxindex,basefontname,false)
local resources = getresources and getresources()
if not resources or not next(resources) then
-- resources = lpdf.procset(true)
diff --git a/tex/context/base/mkiv/lpdf-lmt.lua b/tex/context/base/mkiv/lpdf-lmt.lua
index 8b40ee15c..b46274b34 100644
--- a/tex/context/base/mkiv/lpdf-lmt.lua
+++ b/tex/context/base/mkiv/lpdf-lmt.lua
@@ -499,21 +499,27 @@ local flushcharacter do
cur_tmrx = tmrx
end
- local f_hex = formatters["%04X"]
+ local f_hex_4 = formatters["%04X"]
+ local f_hex_2 = formatters["%02X"]
- local h_hex = setmetatableindex(function(t,k) -- we already have this somewhere
+ local h_hex_4 = setmetatableindex(function(t,k) -- we already have this somewhere
if k < 256 then -- maybe 512
-- not sparse in this range
for i=0,255 do
- t[i] = f_hex(i)
+ t[i] = f_hex_4(i)
end
return t[k]
else
- local v = f_hex(k)
+ local v = f_hex_4(k)
t[k] = v
return v
end
end)
+ local h_hex_2 = setmetatableindex(function(t,k) -- we already have this somewhere
+ local v = k < 256 and f_hex_2(k) or "00"
+ t[k] = v
+ return v
+ end)
flushcharacter = function(current,pos_h,pos_v,pos_r,font,char,data,naturalwidth,factor,width,f,e)
if need_tf or font ~= f_cur or f_pdf ~= f_pdf_cur or fs ~= fs_cur or mode == "page" then
@@ -566,8 +572,9 @@ local flushcharacter do
cw = cw - tj_delta
end
end
+
if mode == "chararray" then
- begin_charmode(font)
+ begin_charmode()
end
-- cw = cw + naturalwidth
@@ -575,7 +582,7 @@ local flushcharacter do
local index = data.index or char
- b = b + 1 ; buffer[b] = h_hex[index]
+ b = b + 1 ; buffer[b] = font > 0 and h_hex_4[index] or h_hex_2[index]
if not pdfcharacters[index] then
pdfcharacters[index] = true
diff --git a/tex/context/base/mkiv/mlib-ctx.lua b/tex/context/base/mkiv/mlib-ctx.lua
index 88ef98f58..7641cc6e8 100644
--- a/tex/context/base/mkiv/mlib-ctx.lua
+++ b/tex/context/base/mkiv/mlib-ctx.lua
@@ -80,6 +80,7 @@ implement {
}
local patterns = {
+ CONTEXTLMTXMODE > 0 and "meta-imp-%s.mkxl" or "",
"meta-imp-%s.mkiv",
"meta-imp-%s.tex",
-- obsolete:
diff --git a/tex/context/base/mkiv/mlib-run.lua b/tex/context/base/mkiv/mlib-run.lua
index e9d460472..cc4a77660 100644
--- a/tex/context/base/mkiv/mlib-run.lua
+++ b/tex/context/base/mkiv/mlib-run.lua
@@ -852,7 +852,7 @@ do
end,
}
- function metapost.simple(instance,code,useextensions)
+ function metapost.simple(instance,code,useextensions,dontwrap)
-- can we pickup the instance ?
local mpx = metapost.pushformat {
instance = instance or "simplefun",
@@ -864,7 +864,7 @@ do
flusher = flusher,
askedfig = 1,
useplugins = useextensions,
- data = { "beginfig(1);", code, "endfig;" },
+ data = dontwrap and { code } or { "beginfig(1);", code, "endfig;" },
incontext = false,
}
metapost.popformat()
diff --git a/tex/context/base/mkiv/mlib-scn.lua b/tex/context/base/mkiv/mlib-scn.lua
index 8867455b6..1ebe68bdc 100644
--- a/tex/context/base/mkiv/mlib-scn.lua
+++ b/tex/context/base/mkiv/mlib-scn.lua
@@ -702,6 +702,10 @@ function metapost.getparameterset(namespace)
return namespace and namespaces[namespace] or namespaces
end
+function metapost.setparameterset(namespace,t)
+ namespaces[namespace] = t
+end
+
-- goodies
metapost.registerscript("definecolor", function()
diff --git a/tex/context/base/mkiv/mult-aux.mkiv b/tex/context/base/mkiv/mult-aux.mkiv
index 929943d7f..99d252c6b 100644
--- a/tex/context/base/mkiv/mult-aux.mkiv
+++ b/tex/context/base/mkiv/mult-aux.mkiv
@@ -180,22 +180,34 @@
% End of experimental code.
-\unexpanded\def\mult_interfaces_let #1#2{\expandafter\let \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
-\unexpanded\def\mult_interfaces_lete#1#2{\expandafter\let \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname\empty}
-\unexpanded\def\mult_interfaces_def #1#2{\expandafter\def \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
-\unexpanded\def\mult_interfaces_edef#1#2{\expandafter\edef\csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
-\unexpanded\def\mult_interfaces_gdef#1#2{\expandafter\gdef\csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
-\unexpanded\def\mult_interfaces_xdef#1#2{\expandafter\xdef\csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
-
-\startinterface english
-
+%D This can give wrong results when we pass e.g. \type{\c!format}, so either we need
+%D to use the \type {\k!} ones, but these are not defined in the english interface
+%D so from now on we assume that the low level ones are used with the symbolic names
+%D and that only the high level setup commands are used with language specific
+%D interfaces.
+
+% \unexpanded\def\mult_interfaces_let #1#2{\expandafter\let \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+% \unexpanded\def\mult_interfaces_lete#1#2{\expandafter\let \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname\empty}
+% \unexpanded\def\mult_interfaces_def #1#2{\expandafter\def \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+% \unexpanded\def\mult_interfaces_edef#1#2{\expandafter\edef\csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+% \unexpanded\def\mult_interfaces_gdef#1#2{\expandafter\gdef\csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+% \unexpanded\def\mult_interfaces_xdef#1#2{\expandafter\xdef\csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+
+% \startinterface english
\unexpanded\def\mult_interfaces_let #1#2{\expandafter \let\csname#1#2\endcsname}
\unexpanded\def\mult_interfaces_lete#1#2{\expandafter \let\csname#1#2\endcsname\empty}
\unexpanded\def\mult_interfaces_def #1#2{\expandafter \def\csname#1#2\endcsname}
\unexpanded\def\mult_interfaces_edef#1#2{\expandafter\edef\csname#1#2\endcsname}
\unexpanded\def\mult_interfaces_gdef#1#2{\expandafter\gdef\csname#1#2\endcsname}
\unexpanded\def\mult_interfaces_xdef#1#2{\expandafter\xdef\csname#1#2\endcsname}
+% \stopinterface
+
+%D Do, we only interface the assignment definition:
+
+\unexpanded\def\mult_interfaces_adef#1#2{\expandafter\def \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+\startinterface english
+ \unexpanded\def\mult_interfaces_adef#1#2{\expandafter \def\csname#1#2\endcsname}
\stopinterface
% the commented detokenized variant that backtracks ... needs testing usage first
@@ -279,23 +291,21 @@
% todo: inline the def/let
-\unexpanded\def\mult_interfaces_install_parameter_set_handler#1#2#3#4#5#6%
- {\ifx#2\relax\let#2\empty\fi
- \unexpanded\def#3{\mult_interfaces_def {#1#2:}}% ##1 {##2} (braces are mandate)
- \unexpanded\def#4{\mult_interfaces_edef{#1#2:}}% ##1 {##2} (braces are mandate)
- \unexpanded\def#5{\mult_interfaces_let {#1#2:}}% ##1 ##2
- \unexpanded\def#6{\mult_interfaces_lete{#1#2:}}}% ##1
-
-\startinterface english
-
+% \unexpanded\def\mult_interfaces_install_parameter_set_handler#1#2#3#4#5#6%
+% {\ifx#2\relax\let#2\empty\fi
+% \unexpanded\def#3{\mult_interfaces_def {#1#2:}}% ##1 {##2} (braces are mandate)
+% \unexpanded\def#4{\mult_interfaces_edef{#1#2:}}% ##1 {##2} (braces are mandate)
+% \unexpanded\def#5{\mult_interfaces_let {#1#2:}}% ##1 ##2
+% \unexpanded\def#6{\mult_interfaces_lete{#1#2:}}}% ##1
+%
+% \startinterface english
\unexpanded\def\mult_interfaces_install_parameter_set_handler#1#2#3#4#5#6%
{\ifx#2\relax\let#2\empty\fi
\unexpanded\def#3##1{\expandafter \def\csname#1#2:##1\endcsname}% ##1 {##2} (braces are mandate)
\unexpanded\def#4##1{\expandafter\edef\csname#1#2:##1\endcsname}% ##1 {##2} (braces are mandate)
\unexpanded\def#5##1{\expandafter \let\csname#1#2:##1\endcsname}% ##1 ##2
\unexpanded\def#6##1{\expandafter \let\csname#1#2:##1\endcsname\empty}}% ##1
-
-\stopinterface
+% \stopinterface
\unexpanded\def\installparametersethandler#1#2%
{\normalexpanded
@@ -720,21 +730,19 @@
\expandafter\noexpand\csname setupcurrent#2\endcsname % no \every (we use 'current' for consistency)
\expandafter\noexpand\csname everysetup#2\endcsname}}
-\unexpanded\def\mult_interfaces_install_direct_parameter_set_handler#1#2#3#4#5%
- {\unexpanded\def#2{\mult_interfaces_def #1}%
- \unexpanded\def#3{\mult_interfaces_edef#1}%
- \unexpanded\def#4{\mult_interfaces_let #1}%
- \unexpanded\def#5{\mult_interfaces_let #1\empty}}%
-
-\startinterface english
+% \unexpanded\def\mult_interfaces_install_direct_parameter_set_handler#1#2#3#4#5%
+% {\unexpanded\def#2{\mult_interfaces_def #1}%
+% \unexpanded\def#3{\mult_interfaces_edef#1}%
+% \unexpanded\def#4{\mult_interfaces_let #1}%
+% \unexpanded\def#5{\mult_interfaces_let #1\empty}}%
+% \startinterface english
\unexpanded\def\mult_interfaces_install_direct_parameter_set_handler#1#2#3#4#5%
{\unexpanded\def#2##1{\expandafter \def\csname#1##1\endcsname}%
\unexpanded\def#3##1{\expandafter\edef\csname#1##1\endcsname}%
\unexpanded\def#4##1{\expandafter \let\csname#1##1\endcsname}%
\unexpanded\def#5##1{\expandafter \let\csname#1##1\endcsname\empty}}%
-
-\stopinterface
+% \stopinterface
\unexpanded\def\installdirectparametersethandler#1#2%
{\normalexpanded
diff --git a/tex/context/base/mkiv/mult-aux.mkxl b/tex/context/base/mkiv/mult-aux.mkxl
index efa44d4dc..3fed8c26e 100644
--- a/tex/context/base/mkiv/mult-aux.mkxl
+++ b/tex/context/base/mkiv/mult-aux.mkxl
@@ -118,7 +118,7 @@
\orelse\ifx#3\empty
\expandafter\mult_interfaces_get_parameters_error
\else
- \expandafter\mult_interfaces_def
+ \expandafter\mult_interfaces_adef % assignment def
\fi
\m_mult_interfaces_namespace{#1}{#2}%
\doubleexpandafter\mult_interfaces_get_parameters_item}
@@ -160,22 +160,34 @@
% End of experimental code.
-\unexpanded\def\mult_interfaces_let #1#2{\expandafter\let \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
-\unexpanded\def\mult_interfaces_lete#1#2{\expandafter\let \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname\empty}
-\unexpanded\def\mult_interfaces_def #1#2{\expandafter\def \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
-\unexpanded\def\mult_interfaces_edef#1#2{\expandafter\edef\csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
-\unexpanded\def\mult_interfaces_gdef#1#2{\expandafter\gdef\csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
-\unexpanded\def\mult_interfaces_xdef#1#2{\expandafter\xdef\csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+%D This can give wrong results when we pass e.g. \type{\c!format}, so either we need
+%D to use the \type {\k!} ones, but these are not defined in the english interface
+%D so from now on we assume that the low level ones are used with the symbolic names
+%D and that only the high level setup commands are used with language specific
+%D interfaces.
-\startinterface english
+% \unexpanded\def\mult_interfaces_let #1#2{\expandafter\let \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+% \unexpanded\def\mult_interfaces_lete#1#2{\expandafter\let \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname\empty}
+% \unexpanded\def\mult_interfaces_def #1#2{\expandafter\def \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+% \unexpanded\def\mult_interfaces_edef#1#2{\expandafter\edef\csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+% \unexpanded\def\mult_interfaces_gdef#1#2{\expandafter\gdef\csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+% \unexpanded\def\mult_interfaces_xdef#1#2{\expandafter\xdef\csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+% \startinterface english
\unexpanded\def\mult_interfaces_let #1#2{\expandafter \let\csname#1#2\endcsname}
\unexpanded\def\mult_interfaces_lete#1#2{\expandafter \let\csname#1#2\endcsname\empty}
\unexpanded\def\mult_interfaces_def #1#2{\expandafter \def\csname#1#2\endcsname}
\unexpanded\def\mult_interfaces_edef#1#2{\expandafter\edef\csname#1#2\endcsname}
\unexpanded\def\mult_interfaces_gdef#1#2{\expandafter\gdef\csname#1#2\endcsname}
\unexpanded\def\mult_interfaces_xdef#1#2{\expandafter\xdef\csname#1#2\endcsname}
+% \stopinterface
+
+%D Do, we only interface the assignment definition:
+\unexpanded\def\mult_interfaces_adef#1#2{\expandafter\def \csname#1\ifcsname\k!prefix!#2\endcsname\csname\k!prefix!#2\endcsname\else#2\fi\endcsname}
+
+\startinterface english
+ \unexpanded\def\mult_interfaces_adef#1#2{\expandafter \def\csname#1#2\endcsname}
\stopinterface
% the commented detokenized variant that backtracks ... needs testing usage first
@@ -238,7 +250,6 @@
\def#5##1##2{\ifx##1\relax\else#4##1{##2}\fi}%
\def#6{#1#2:}%
\def#7##1{#1##1:}%
-% \def#8{\ifx#2\empty\else\ifcsname#1#2:\s!parent\endcsname\else\expandafter\let\csname#1#2:\s!parent\endcsname#1\fi\fi}%
\def#8{\ifx#2\empty\orelse\ifcsname#1#2:\s!parent\endcsname\else\expandafter\let\csname#1#2:\s!parent\endcsname#1\fi}%
\unexpanded\def#9##1{\expandafter\edef\csname#1##1:\s!parent\endcsname{#1#2}}}
@@ -260,23 +271,21 @@
% todo: inline the def/let
-\unexpanded\def\mult_interfaces_install_parameter_set_handler#1#2#3#4#5#6%
- {\ifx#2\relax\let#2\empty\fi
- \unexpanded\def#3{\mult_interfaces_def {#1#2:}}% ##1 {##2} (braces are mandate)
- \unexpanded\def#4{\mult_interfaces_edef{#1#2:}}% ##1 {##2} (braces are mandate)
- \unexpanded\def#5{\mult_interfaces_let {#1#2:}}% ##1 ##2
- \unexpanded\def#6{\mult_interfaces_lete{#1#2:}}}% ##1
-
-\startinterface english
-
+% \unexpanded\def\mult_interfaces_install_parameter_set_handler#1#2#3#4#5#6%
+% {\ifx#2\relax\let#2\empty\fi
+% \unexpanded\def#3{\mult_interfaces_def {#1#2:}}% ##1 {##2} (braces are mandate)
+% \unexpanded\def#4{\mult_interfaces_edef{#1#2:}}% ##1 {##2} (braces are mandate)
+% \unexpanded\def#5{\mult_interfaces_let {#1#2:}}% ##1 ##2
+% \unexpanded\def#6{\mult_interfaces_lete{#1#2:}}}% ##1
+%
+% \startinterface english
\unexpanded\def\mult_interfaces_install_parameter_set_handler#1#2#3#4#5#6%
{\ifx#2\relax\let#2\empty\fi
\unexpanded\def#3##1{\expandafter \def\csname#1#2:##1\endcsname}% ##1 {##2} (braces are mandate)
\unexpanded\def#4##1{\expandafter\edef\csname#1#2:##1\endcsname}% ##1 {##2} (braces are mandate)
\unexpanded\def#5##1{\expandafter \let\csname#1#2:##1\endcsname}% ##1 ##2
\unexpanded\def#6##1{\expandafter \let\csname#1#2:##1\endcsname\empty}}% ##1
-
-\stopinterface
+% \stopinterface
\unexpanded\def\installparametersethandler#1#2%
{\normalexpanded
@@ -620,21 +629,19 @@
\expandafter\noexpand\csname setupcurrent#2\endcsname % no \every (we use 'current' for consistency)
\expandafter\noexpand\csname everysetup#2\endcsname}}
-\unexpanded\def\mult_interfaces_install_direct_parameter_set_handler#1#2#3#4#5%
- {\unexpanded\def#2{\mult_interfaces_def #1}%
- \unexpanded\def#3{\mult_interfaces_edef#1}%
- \unexpanded\def#4{\mult_interfaces_let #1}%
- \unexpanded\def#5{\mult_interfaces_let #1\empty}}%
-
-\startinterface english
+% \unexpanded\def\mult_interfaces_install_direct_parameter_set_handler#1#2#3#4#5%
+% {\unexpanded\def#2{\mult_interfaces_def #1}%
+% \unexpanded\def#3{\mult_interfaces_edef#1}%
+% \unexpanded\def#4{\mult_interfaces_let #1}%
+% \unexpanded\def#5{\mult_interfaces_let #1\empty}}%
+% \startinterface english
\unexpanded\def\mult_interfaces_install_direct_parameter_set_handler#1#2#3#4#5%
{\unexpanded\def#2##1{\expandafter \def\csname#1##1\endcsname}%
\unexpanded\def#3##1{\expandafter\edef\csname#1##1\endcsname}%
\unexpanded\def#4##1{\expandafter \let\csname#1##1\endcsname}%
\unexpanded\def#5##1{\expandafter \let\csname#1##1\endcsname\empty}}%
-
-\stopinterface
+% \stopinterface
\unexpanded\def\installdirectparametersethandler#1#2%
{\normalexpanded
diff --git a/tex/context/base/mkiv/status-files.pdf b/tex/context/base/mkiv/status-files.pdf
index 0ee0bd0ce..ef92c2d37 100644
--- a/tex/context/base/mkiv/status-files.pdf
+++ b/tex/context/base/mkiv/status-files.pdf
Binary files differ
diff --git a/tex/context/base/mkiv/status-lua.pdf b/tex/context/base/mkiv/status-lua.pdf
index 215b37f01..236879972 100644
--- a/tex/context/base/mkiv/status-lua.pdf
+++ b/tex/context/base/mkiv/status-lua.pdf
Binary files differ
diff --git a/tex/context/base/mkiv/supp-box.mkiv b/tex/context/base/mkiv/supp-box.mkiv
index 6b6d3f790..d43459c63 100644
--- a/tex/context/base/mkiv/supp-box.mkiv
+++ b/tex/context/base/mkiv/supp-box.mkiv
@@ -569,7 +569,7 @@
\unexpanded\def\doifelsetext#1%
{\begingroup
- \setbox\scratchbox\hpack
+ \setbox\scratchbox\hbox % no \hpack because we can have fallbacks
{\settrialtypesetting
\ignorespaces#1\removeunwantedspaces}%
\ifzeropt\wd\scratchbox
@@ -582,7 +582,7 @@
\unexpanded\def\doiftext#1%
{\begingroup
- \setbox\scratchbox\hpack
+ \setbox\scratchbox\hbox % no \hpack because we can have fallbacks
{\settrialtypesetting
\ignorespaces#1\removeunwantedspaces}%
\ifzeropt\wd\scratchbox
diff --git a/tex/context/base/mkiv/supp-box.mkxl b/tex/context/base/mkiv/supp-box.mkxl
index ed0c5f3a3..e6ab96e89 100644
--- a/tex/context/base/mkiv/supp-box.mkxl
+++ b/tex/context/base/mkiv/supp-box.mkxl
@@ -531,7 +531,7 @@
\unexpanded\def\doifelsetext#1%
{\begingroup
- \setbox\scratchbox\hpack
+ \setbox\scratchbox\hbox % no \hpack because we can have fallbacks
{\settrialtypesetting
\ignorespaces#1\removeunwantedspaces}%
\ifzeropt\wd\scratchbox
@@ -542,7 +542,7 @@
\unexpanded\def\doiftext#1%
{\begingroup
- \setbox\scratchbox\hpack
+ \setbox\scratchbox\hbox % no \hpack because we can have fallbacks
{\settrialtypesetting
\ignorespaces#1\removeunwantedspaces}%
\ifzeropt\wd\scratchbox
diff --git a/tex/context/interface/mkiv/i-context.pdf b/tex/context/interface/mkiv/i-context.pdf
index d28f6d585..344bcbcc1 100644
--- a/tex/context/interface/mkiv/i-context.pdf
+++ b/tex/context/interface/mkiv/i-context.pdf
Binary files differ
diff --git a/tex/context/interface/mkiv/i-readme.pdf b/tex/context/interface/mkiv/i-readme.pdf
index cb957009b..a5cd19671 100644
--- a/tex/context/interface/mkiv/i-readme.pdf
+++ b/tex/context/interface/mkiv/i-readme.pdf
Binary files differ
diff --git a/tex/context/modules/mkiv/m-catchword.mkiv b/tex/context/modules/mkiv/m-catchword.mkiv
new file mode 100644
index 000000000..70d713e44
--- /dev/null
+++ b/tex/context/modules/mkiv/m-catchword.mkiv
@@ -0,0 +1,136 @@
+%D \module
+%D [ file=m-catchword,
+%D version=2019.08.09,
+%D title=\CONTEXT\ Extra Modules,
+%D subtitle=Catchwords,
+%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.
+
+\startluacode
+
+-- If someone realy need it there probably is no need for speed, so we do
+-- it quick and dirty.
+
+local nodecodes = nodes.nodecodes
+local kerncodes = nodes.kerncodes
+
+local glyph_code = nodecodes.glyph
+local disc_code = nodecodes.disc
+local kern_code = nodecodes.kern
+local hlist_code = nodecodes.hlist
+
+local fontkern_code = kerncodes.fontkern
+
+local function set_catchword(t)
+ local nextpage = tex.lists.contrib_head
+ if not nextpage then
+ return
+ end
+ local firstline = nil
+ for n in nodes.traverse_id(hlist_code,nextpage) do
+ firstline = n
+ break
+ end
+ if not firstline then
+ return
+ end
+ local list = firstline.list
+ if not list then
+ return
+ end
+ local first = nil
+ local last = nil
+ for n, id, subtype in nodes.traverse(list) do
+ if id == glyph_code or id == disc_code or (id == kern_code and subtype == fontkern_code) then
+ if not first then
+ first = n
+ end
+ last = n
+ elseif first then
+ break
+ end
+ end
+ if not first then
+ return
+ end
+ local page = tex.getbox(t.box)
+ local head = nodes.copy_list(first,last.next)
+ head = nodes.insert_before(head,head,nodes.pool.glue(1,1,1))
+ local line = nodes.hpack(head,page.width,"exactly")
+ if CONTEXTLMTXMODE > 0 then
+ line.yoffset = -t.voffset
+ line.xoffset = t.hoffset
+ else
+ line.shift = t.hoffset
+ line = nodes.insert_before(line,line,nodes.pool.kern(t.voffset-line.height))
+ line = nodes.vpack(line)
+ end
+ line.height = 0
+ line.depth = 0
+ node.insert_after(page.list,nodes.tail(page.list),line)
+ logs.report("catchword","appending %a on page %i",nodes.toutf(head),tex.getcount("realpageno"))
+end
+
+interfaces.implement {
+ name = "set_catchword",
+ actions = set_catchword,
+ arguments = {
+ {
+ { "box", "integer" },
+ { "hoffset", "dimension" },
+ { "voffset", "dimension" },
+ },
+ },
+}
+
+\stopluacode
+
+\unprotect
+
+\installcorenamespace {catchword}
+
+\installsimplecommandhandler \??catchword {catchword}
+
+\setupcatchword
+ [\c!state=\v!stop,
+ \c!hoffset=\zeropoint,
+ \c!voffset=\lineheight]
+
+\def\page_check_catchword_yes#1%
+ {\clf_set_catchword
+ box #1
+ hoffset \catchwordparameter\c!hoffset
+ voffset \catchwordparameter\c!voffset
+ \relax}
+
+\let\page_check_catchword_nop\gobbleoneargument
+
+\appendtoks
+ \doifelse{\catchwordparameter\c!state}\v!start
+ {\let\page_check_catchword\page_check_catchword_yes}%
+ {\let\page_check_catchword\page_check_catchword_nop}%
+\to \everysetupcatchword
+
+\appendtoks
+ \page_check_catchword\b_page_postprocessor
+\to \t_page_postprocessors_page
+
+\protect
+
+\continueifinputfile{m-catchword.mkiv}
+
+\setupcatchword
+ [state=start,
+ hoffset=.75em,
+ voffset=1cm]
+
+\starttext
+
+ \dorecurse{100}{\input ward }
+
+\stoptext
diff --git a/tex/context/modules/mkiv/x-setups-overview.mkiv b/tex/context/modules/mkiv/x-setups-overview.mkiv
index f293c13b7..24ee63fe0 100644
--- a/tex/context/modules/mkiv/x-setups-overview.mkiv
+++ b/tex/context/modules/mkiv/x-setups-overview.mkiv
@@ -53,12 +53,12 @@
}
-\startinterface dutch \definecolor[LocalColor][r=.75,g=.25,b=.25] \stopinterface
\startinterface english \definecolor[LocalColor][r=.25,g=.75,b=.25] \stopinterface
+\startinterface dutch \definecolor[LocalColor][r=.75,g=.25,b=.25] \stopinterface
\startinterface german \definecolor[LocalColor][r=.25,g=.25,b=.75] \stopinterface
\startinterface french \definecolor[LocalColor][r=.75,g=.75,b=.25] \stopinterface
-\startinterface czech \definecolor[LocalColor][r=.75,g=.25,b=.75] \stopinterface
\startinterface italian \definecolor[LocalColor][r=.25,g=.75,b=.75] \stopinterface
+\startinterface czech \definecolor[LocalColor][r=.75,g=.25,b=.75] \stopinterface
\startinterface romanian \definecolor[LocalColor][r=.5,g=.4,b=.3] \stopinterface
% \definecolor[LocalColor][r=.5,g=.3,b=.4]
% \definecolor[LocalColor][r=.4,g=.3,b=.5]
@@ -258,7 +258,7 @@
\stopcolor
\vfill
\start
- \switchtobodyfont[big,15pt]
+ \switchtobodyfont[15pt]
\setuptabulate[before=,after=]
\dontleavehmode \hfill \hbox \bgroup
\starttabulate[|l|l|]
diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua
index e9b99be70..c388eaca1 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 : c:/data/develop/context/sources/luatex-fonts-merged.lua
-- parent file : c:/data/develop/context/sources/luatex-fonts.lua
--- merge date : 10/05/19 14:45:26
+-- merge date : 10/08/19 19:15:39
do -- begin closure to overcome local limits and interference