diff options
26 files changed, 108 insertions, 136 deletions
| diff --git a/scripts/context/lua/mtx-fonts.lua b/scripts/context/lua/mtx-fonts.lua index 73985bf9b..8abfee0cb 100644 --- a/scripts/context/lua/mtx-fonts.lua +++ b/scripts/context/lua/mtx-fonts.lua @@ -16,7 +16,7 @@ local lower = string.lower  local concat = table.concat  local write_nl = (logs and logs.writer) or (texio and texio.write_nl) or print -local otlversion  = 3.115 +local otlversion  = 3.116  local helpinfo = [[  <?xml version="1.0"?> diff --git a/tex/context/base/mkii/cont-new.mkii b/tex/context/base/mkii/cont-new.mkii index 1df1ff3e9..8f9793d5b 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{2021.05.20 11:01} +\newcontextversion{2021.05.20 15:57}  %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 67ee22705..45e9cc413 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{2021.05.20 11:01} +\edef\contextversion{2021.05.20 15:57}  %D For those who want to use this: diff --git a/tex/context/base/mkiv/char-fio.lua b/tex/context/base/mkiv/char-fio.lua index b1f652eed..2b0fe42ce 100644 --- a/tex/context/base/mkiv/char-fio.lua +++ b/tex/context/base/mkiv/char-fio.lua @@ -38,8 +38,8 @@ disableaction(textfileactions,         "characters.filters.utf.decompose")  local report    = logs.reporter("unicode filter")  local reporting = "no" --- this is messy as for performance reasons i don't want this to happen --- per line by default +-- This is messy as for performance reasons i don't want this to happen per line by +-- default.  local enforced = {      ["characters.filters.utf.collapse"]  = true, diff --git a/tex/context/base/mkiv/cont-new.mkiv b/tex/context/base/mkiv/cont-new.mkiv index 9f8f0bebc..f8e6a0c29 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{2021.05.20 11:01} +\newcontextversion{2021.05.20 15:57}  %D This file is loaded at runtime, thereby providing an excellent place for hacks,  %D patches, extensions and new features. There can be local overloads in cont-loc diff --git a/tex/context/base/mkiv/context.mkiv b/tex/context/base/mkiv/context.mkiv index 7a64a1e20..bdf95eb9d 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{2021.05.20 11:01} +\edef\contextversion{2021.05.20 15:57}  %D Kind of special: diff --git a/tex/context/base/mkiv/core-con.lua b/tex/context/base/mkiv/core-con.lua index f1aa37a7c..244ede469 100644 --- a/tex/context/base/mkiv/core-con.lua +++ b/tex/context/base/mkiv/core-con.lua @@ -2148,3 +2148,9 @@ local function field(n) return context(osdate("*t")[n]) end  implement { name = "actualday",   public = true, actions = function() field("day")   end }  implement { name = "actualmonth", public = true, actions = function() field("month") end }  implement { name = "actualyear",  public = true, actions = function() field("year")  end } + +implement { +    name    = "uuid", +    public  = true, +    actions = { os.uuid, context }, +} diff --git a/tex/context/base/mkiv/font-mis.lua b/tex/context/base/mkiv/font-mis.lua index 29d4d91c8..6620dd9f4 100644 --- a/tex/context/base/mkiv/font-mis.lua +++ b/tex/context/base/mkiv/font-mis.lua @@ -21,7 +21,7 @@ local readers  = otf.readers  if readers then -    otf.version = otf.version or 3.115 +    otf.version = otf.version or 3.116      otf.cache   = otf.cache   or containers.define("fonts", "otl", otf.version, true)      function fonts.helpers.getfeatures(name,save) diff --git a/tex/context/base/mkiv/font-otj.lua b/tex/context/base/mkiv/font-otj.lua index c21790100..c4ec9972c 100644 --- a/tex/context/base/mkiv/font-otj.lua +++ b/tex/context/base/mkiv/font-otj.lua @@ -90,6 +90,8 @@ local getoffsets         = nuts.getoffsets  local getboth            = nuts.getboth  local getdisc            = nuts.getdisc  local setdisc            = nuts.setdisc +local getreplace         = nuts.getreplace +local setreplace         = nuts.setreplace  local setoffsets         = nuts.setoffsets  local ischar             = nuts.ischar  local getkern            = nuts.getkern @@ -847,20 +849,17 @@ local function inject_positions_only(head,where)                              insertnodeafter(head,current,fontkern(rightkern))                          end                      end -                else +                elseif next then                      local i = p.emptyinjections                      if i then                          -- glyph|disc|glyph (special case)                          local rightkern = i.rightkern -                        if rightkern and rightkern ~= 0 then -                            if next and getid(next) == disc_code then -                                if replace then -                                    -- error, we expect an empty one -                                else -                              -- KE setfield(next,"replace",fontkern(rightkern)) -- maybe also leftkern -                                    replace = fontkern(rightkern) -- maybe also leftkern -                                    done = true	--KE -                                end +                        if rightkern and rightkern ~= 0 and getid(next) == disc_code then +                            local replace = getreplace(next) +                            if replace then +                                -- can't happen +                            else +                                setreplace(next,fontkern(rightkern))                              end                          end                      end @@ -1313,19 +1312,17 @@ local function inject_everything(head,where)                              end                          end                      end -                else +                elseif next then                      local i = p.emptyinjections                      if i then                          -- glyph|disc|glyph (special case)                          local rightkern = i.rightkern -                        if rightkern and rightkern ~= 0 then -                            if next and getid(next) == disc_code then -                                if replace then -                                    -- error, we expect an empty one -                                else -                                    replace = fontkern(rightkern) -                                    done    = true -                                end +                        if rightkern and rightkern ~= 0 and getid(next) == disc_code then +                            local replace = getreplace(next) +                            if replace then +                                -- can't happen +                            else +                                setreplace(next,fontkern(rightkern))                              end                          end                      end diff --git a/tex/context/base/mkiv/font-otl.lua b/tex/context/base/mkiv/font-otl.lua index c13011f95..4619e13dc 100644 --- a/tex/context/base/mkiv/font-otl.lua +++ b/tex/context/base/mkiv/font-otl.lua @@ -52,7 +52,7 @@ local report_otf          = logs.reporter("fonts","otf loading")  local fonts               = fonts  local otf                 = fonts.handlers.otf -otf.version               = 3.115 -- beware: also sync font-mis.lua and in mtx-fonts +otf.version               = 3.116 -- beware: also sync font-mis.lua and in mtx-fonts  otf.cache                 = containers.define("fonts", "otl", otf.version, true)  otf.svgcache              = containers.define("fonts", "svg", otf.version, true)  otf.pngcache              = containers.define("fonts", "png", otf.version, true) diff --git a/tex/context/base/mkiv/font-oup.lua b/tex/context/base/mkiv/font-oup.lua index 93a1d526e..c93ad4743 100644 --- a/tex/context/base/mkiv/font-oup.lua +++ b/tex/context/base/mkiv/font-oup.lua @@ -2608,8 +2608,8 @@ local function checkpairs(lookup)                      local v = d2[1]                      if v == true then                          -- all zero -                 -- elseif v and (v[1] ~= 0 or v[2] ~= 0 or v[4] ~= 0) then -                    elseif v and (v[1] ~= 0 or v[2] ~= 0 or v[3] ~= 0 or v[4] ~= 0) then -- vkrn has v[3] ~= 0 +                    elseif v and (v[1] ~= 0 or v[2] ~= 0 or v[4] ~= 0) then +                        -- complex kerns                          return false                      end                  end diff --git a/tex/context/base/mkiv/node-nut.lua b/tex/context/base/mkiv/node-nut.lua index 2f69a0f15..dcd08f317 100644 --- a/tex/context/base/mkiv/node-nut.lua +++ b/tex/context/base/mkiv/node-nut.lua @@ -442,9 +442,9 @@ if not nuts.getpre then      function nuts.getpost   (n) local _, h, _, _, t, _ = d_getdisc(n,true) return h, t end      function nuts.getreplace(n) local _, _, h, _, _, t = d_getdisc(n,true) return h, t end -    function nuts.setpre    (n,h) d_setfield(d,"pre",    h) end -    function nuts.setpost   (n,h) d_setfield(d,"post",   h) end -    function nuts.setreplace(n,h) d_setfield(d,"replace",h) end +    function nuts.setpre    (n,h) d_setfield(n,"pre",    h) end +    function nuts.setpost   (n,h) d_setfield(n,"post",   h) end +    function nuts.setreplace(n,h) d_setfield(n,"replace",h) end  end diff --git a/tex/context/base/mkiv/node-res.lua b/tex/context/base/mkiv/node-res.lua index 684a8cc77..408f8ea47 100644 --- a/tex/context/base/mkiv/node-res.lua +++ b/tex/context/base/mkiv/node-res.lua @@ -173,19 +173,10 @@ local savepos           = register_nut(new_nut(whatsit_code,whatsitcodes.savepos  local user_node         = new_nut(whatsit_code,whatsitcodes.userdefined) -if CONTEXTLMTXMODE == 0 then -    setfield(user_node,"type",usercodes.number) -end - -local left_margin_kern, right_margin_kern +setfield(user_node,"type",usercodes.number) -if CONTEXTLMTXMODE > 0 then -    left_margin_kern  = register_nut(new_nut(kern_code,kerncodes.leftmargincode)) -    right_margin_kern = register_nut(new_nut(kern_code,kerncodes.rightmargincode)) -else -    left_margin_kern  = register_nut(new_nut(nodecodes.marginkern,0)) -    right_margin_kern = register_nut(new_nut(nodecodes.marginkern,1)) -end +local left_margin_kern  = register_nut(new_nut(nodecodes.marginkern,0)) +local right_margin_kern = register_nut(new_nut(nodecodes.marginkern,1))  local lineskip          = register_nut(new_nut(glue_code,gluecodes.lineskip))  local baselineskip      = register_nut(new_nut(glue_code,gluecodes.baselineskip)) @@ -429,27 +420,15 @@ function nutpool.savepos()      return copy_nut(savepos)  end -if CONTEXTLMTXMODE == 0 then - -    function nutpool.latelua(code) -        local n = copy_nut(latelua) -        if type(code) == "table" then -            local action        = code.action -            local specification = code.specification or code -            code = function() action(specification) end -        end -        setdata(n,code) -        return n -    end - -else - -    function nutpool.latelua(code) -        local n = copy_nut(latelua) -        nodeproperties[n] = { data = code } -        return n +function nutpool.latelua(code) +    local n = copy_nut(latelua) +    if type(code) == "table" then +        local action        = code.action +        local specification = code.specification or code +        code = function() action(specification) end      end - +    setdata(n,code) +    return n  end  function nutpool.leftmarginkern(glyph,width) @@ -575,7 +554,7 @@ local function cleanup(nofboxes) -- todo      return nr, nl, nofboxes -- can be nil  end -local usage = CONTEXTLMTXMODE > 0 and node.inuse or function() +local function usage()      local t = { }      for n, tag in gmatch(status.node_mem_usage,"(%d+) ([a-z_]+)") do          t[tag] = tonumber(n) or 0 @@ -583,7 +562,7 @@ local usage = CONTEXTLMTXMODE > 0 and node.inuse or function()      return t  end -local stock = CONTEXTLMTXMODE > 0 and node.instock or { } +local stock = { }  nutpool .cleanup = cleanup  nodepool.cleanup = cleanup diff --git a/tex/context/base/mkiv/node-typ.lua b/tex/context/base/mkiv/node-typ.lua index f1eceb8f3..d1e788d62 100644 --- a/tex/context/base/mkiv/node-typ.lua +++ b/tex/context/base/mkiv/node-typ.lua @@ -20,7 +20,6 @@ local setchar           = nuts.setchar  local setattrlist       = nuts.setattrlist  local getfont           = nuts.getfont -local getattrlist       = nuts.getattrlist  local hpack_node_list   = nuts.hpack  local vpack_node_list   = nuts.vpack @@ -41,11 +40,7 @@ local fontparameters    = fonts.hashes.parameters  local function tonodes(str,fontid,spacing,templateglyph,attrid) -- quick and dirty      local head, prev = nil, nil      if not fontid then -        if templateglyph then -            fontid = getfont(templateglyph) -        else -            fontid = currentfont() -        end +        fontid = templateglyph and getfont(templateglyph) or currentfont()      end      if attrid == true then          if templateglyph then diff --git a/tex/context/base/mkiv/scrp-cjk.lua b/tex/context/base/mkiv/scrp-cjk.lua index d28b7f922..eaffb5c5b 100644 --- a/tex/context/base/mkiv/scrp-cjk.lua +++ b/tex/context/base/mkiv/scrp-cjk.lua @@ -71,7 +71,6 @@ local report_details   = logs.reporter("scripts","detail")  local insertnodeafter  = scripts.helpers.insertnodeafter  local insertnodebefore = scripts.helpers.insertnodebefore -  local inter_char_shrink          = 0  local inter_char_stretch         = 0  local inter_char_half_shrink     = 0 diff --git a/tex/context/base/mkiv/scrp-ini.lua b/tex/context/base/mkiv/scrp-ini.lua index e19ca5b40..1ae1e6cbd 100644 --- a/tex/context/base/mkiv/scrp-ini.lua +++ b/tex/context/base/mkiv/scrp-ini.lua @@ -122,13 +122,13 @@ local insertnodebefore, insertnodeafter  do      local insertbefore     = nuts.insertbefore      local setattributelist = nuts.setattributelist -    local function insertnodebefore(head,current,what) -- todo : lmtx +    insertnodebefore = function (head,current,what)          head, current = insertbefore(head,current,what)          setattributelist(what,current)          return head, current      end -    local function insertnodeafter(head,current,what) -- todo : lmtx +    insertnodeafter = function(head,current,what)          head, current = insertafter(head,current,what)          setattributelist(what,current)          return head, current diff --git a/tex/context/base/mkiv/status-files.pdf b/tex/context/base/mkiv/status-files.pdfBinary files differ index bb2027071..9338f9832 100644 --- a/tex/context/base/mkiv/status-files.pdf +++ b/tex/context/base/mkiv/status-files.pdf diff --git a/tex/context/base/mkiv/status-lua.pdf b/tex/context/base/mkiv/status-lua.pdfBinary files differ index 30eef15fe..0cddd6377 100644 --- a/tex/context/base/mkiv/status-lua.pdf +++ b/tex/context/base/mkiv/status-lua.pdf diff --git a/tex/context/base/mkiv/syst-lua.mkiv b/tex/context/base/mkiv/syst-lua.mkiv index f0902eaf5..327d1d407 100644 --- a/tex/context/base/mkiv/syst-lua.mkiv +++ b/tex/context/base/mkiv/syst-lua.mkiv @@ -73,8 +73,8 @@  %D We can omit the tex.ctxcatcodes here as nowadays we seldom change the regime at  %D the \TEX\ end: -%def\luaexpr#1{\ctxlua{context  (tostring(#1))}}   % more efficient: -\def\luaexpr#1{\ctxlua{tex.print(tostring(#1))}} % no use is shortcutting has to be compiled +%def\luaexpr#1{\ctxlua{context  (tostring(#1))}} % more efficient: +\def\luaexpr#1{\ctxlua{tex.print(tostring(#1))}} % no use in shortcutting has to be compiled  %D But as we only use write 16 we could as well do all in \LUA\ and ignore the rest.  %D Okay, we still can do writes here but only when not blocked. diff --git a/tex/context/base/mkiv/trac-ctx.lua b/tex/context/base/mkiv/trac-ctx.lua index a808778b3..f3243d398 100644 --- a/tex/context/base/mkiv/trac-ctx.lua +++ b/tex/context/base/mkiv/trac-ctx.lua @@ -66,9 +66,9 @@ implement {  }  implement { -    name    = "installtextracker", +    name      = "installtextracker",      arguments = "3 strings", -    actions = function(tag,enable,disable) +    actions   = function(tag,enable,disable)          install(textrackers,trackers.register,tag,enable,disable)      end,  } diff --git a/tex/context/base/mkxl/cont-new.mkxl b/tex/context/base/mkxl/cont-new.mkxl index a51da5498..495d9ba38 100644 --- a/tex/context/base/mkxl/cont-new.mkxl +++ b/tex/context/base/mkxl/cont-new.mkxl @@ -13,7 +13,7 @@  % \normalend % uncomment this to get the real base runtime -\newcontextversion{2021.05.20 11:01} +\newcontextversion{2021.05.20 15:57}  %D This file is loaded at runtime, thereby providing an excellent place for hacks,  %D patches, extensions and new features. There can be local overloads in cont-loc diff --git a/tex/context/base/mkxl/context.mkxl b/tex/context/base/mkxl/context.mkxl index 98a239c8f..0674d93a4 100644 --- a/tex/context/base/mkxl/context.mkxl +++ b/tex/context/base/mkxl/context.mkxl @@ -29,7 +29,7 @@  %D {YYYY.MM.DD HH:MM} format.  \immutable\edef\contextformat {\jobname} -\immutable\edef\contextversion{2021.05.20 11:01} +\immutable\edef\contextversion{2021.05.20 15:57}  %overloadmode 1 % check frozen / warning  %overloadmode 2 % check frozen / error diff --git a/tex/context/base/mkxl/font-otj.lmt b/tex/context/base/mkxl/font-otj.lmt index 800628934..5ef3fd5c3 100644 --- a/tex/context/base/mkxl/font-otj.lmt +++ b/tex/context/base/mkxl/font-otj.lmt @@ -99,6 +99,8 @@ local yscaled            = nuts.yscaled  local getboth            = nuts.getboth  local getdisc            = nuts.getdisc  local setdisc            = nuts.setdisc +local getreplace         = nuts.getreplace +local setreplace         = nuts.setreplace  local setoffsets         = nuts.setoffsets  local addxoffset         = nuts.addxoffset  local addyoffset         = nuts.addyoffset @@ -1473,19 +1475,17 @@ local function inject_positions_only_kerns(head,where)                              insertnodeafter(head,current,somekern(fontkern,rightkern,current))                          end                      end -                else +                elseif next then                      local i = p.emptyinjections                      if i then                          -- glyph|disc|glyph (special case)                          local rightkern = i.rightkern -                        if rightkern and rightkern ~= 0 then -                            if next and getid(next) == disc_code then -                                if replace then -                                    -- error, we expect an empty one -                                else -                                    replace = somekern(fontkern,xscaled(current,rightkern),current) -- maybe also leftkern -                                    done    = true	--KE -                                end +                        if rightkern and rightkern ~= 0 and getid(next) == disc_code then +                            local replace = getreplace(next) +                            if replace then +                                -- can't happen +                            else +                                setreplace(next,somekern(fontkern,xscaled(current,rightkern),current))                              end                          end                      end @@ -1694,20 +1694,17 @@ local function inject_positions_only_margins(head,where)                      if leftkern ~= 0 or rightkern ~= 0 or yoffset ~= 0 then                          addxymargins(n,-leftkern,-rightkern,yoffset) -- also scales                      end -                else +                elseif next then                      local i = p.emptyinjections                      if i then                          -- glyph|disc|glyph (special case)                          local rightkern = i.rightkern -                        if rightkern and rightkern ~= 0 then -                            if next and getid(next) == disc_code then -                                if replace then -                                    -- error, we expect an empty one -                                else -                                    -- next disc | current -                                    addxymargins(current,-rightkern) -- NEEDS CHECKING -                                    done = true	--KE -                                end +                        if rightkern and rightkern ~= 0 and getid(next) == disc_code then +                            local replace = getreplace(next) +                            if replace then +                                -- can't happen +                            else +                                setreplace(next,somekern(fontkern,xscaled(current,rightkern),current))                              end                          end                      end @@ -2067,19 +2064,17 @@ local function inject_everything(head,where)                              end                          end                      end -                else +                elseif next then                      local i = p.emptyinjections                      if i then                          -- glyph|disc|glyph (special case)                          local rightkern = i.rightkern -                        if rightkern and rightkern ~= 0 then -                            if next and getid(next) == disc_code then -                                if replace then -                                    -- error, we expect an empty one -                                else -                                    replace = somekern(fontkern,xscaled(current,rightkern),current) -                                    done    = true -                                end +                        if rightkern and rightkern ~= 0 and getid(next) == disc_code then +                            local replace = getreplace(next) +                            if replace then +                                -- can't happen +                            else +                                setreplace(next,somekern(fontkern,xscaled(current,rightkern),current))                              end                          end                      end diff --git a/tex/context/base/mkxl/scrp-ini.lmt b/tex/context/base/mkxl/scrp-ini.lmt index 38687fe97..c0a42720a 100644 --- a/tex/context/base/mkxl/scrp-ini.lmt +++ b/tex/context/base/mkxl/scrp-ini.lmt @@ -94,13 +94,13 @@ local insertnodebefore, insertnodeafter  do      local insertbefore     = nuts.insertbefore      local setattributelist = nuts.setattributelist -    local function insertnodebefore(head,current,what) -- todo : lmtx +    insertnodebefore = function (head,current,what) -- todo : lmtx          head, current = insertbefore(head,current,what)          setattributelist(what,current)          return head, current      end -    local function insertnodeafter(head,current,what) -- todo : lmtx +    insertnodeafter = function(head,current,what) -- todo : lmtx          head, current = insertafter(head,current,what)          setattributelist(what,current)          return head, current diff --git a/tex/context/base/mkxl/syst-lua.mkxl b/tex/context/base/mkxl/syst-lua.mkxl index 158682399..4b60ee59f 100644 --- a/tex/context/base/mkxl/syst-lua.mkxl +++ b/tex/context/base/mkxl/syst-lua.mkxl @@ -52,18 +52,21 @@  \popoverloadmode  %D We can omit the tex.ctxcatcodes here as nowadays we seldom change the regime at -%D the \TEX\ end: +%D the \TEX\ end. Beware: the expression is compiled each time so it is not that +%D efficient. -%def\luaexpr#1{\ctxlua{context  (tostring(#1))}} % more efficient: -\permanent\def\luaexpr#1{\ctxlua{tex.print(tostring(#1))}} % no use is shortcutting has to be compiled +%                   \def\luaexpr      #1{\ctxlua    {context  (tostring(#1))}} % more efficient: +%         \permanent\def\luaexpr      #1{\ctxlua    {tex.print(tostring(#1))}} % no use is shortcutting has to be compiled +\tolerant\permanent\edef\luaexpr[#1]#:#2{\noexpand\cldcontext{\noexpand\iftok{#1}\noexpand\emptytoks\noexpand\else"\letterpercent #1",\noexpand\fi#2}}  %D But as we only use write 16 we could as well do all in \LUA\ and ignore the rest.  %D Okay, we still can do writes here but only when not blocked.  \aliased\let\syst_write_execute\clf_execute % always {...} -%D There is a probably rather useless \type {\expression} command that can mix \LUA\ numeric -%D expressions with \TEX\ commands (for as far that makes sense) that works like this: +%D There is a probably rather useless \type {\expression} command that can mix \LUA\ +%D numeric expressions with \TEX\ commands (for as far that makes sense) that works +%D like this:  %D  %D \starttyping  %D \mathchardef\foooo   1234 diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua index 3afd1a804..59cbd9ef8 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  : 2021-05-20 11:01 +-- merge date  : 2021-05-20 15:57  do -- begin closure to overcome local limits and interference @@ -20858,7 +20858,7 @@ local trace_defining=false  registertracker("fonts.defining",function(v) trace_d  local report_otf=logs.reporter("fonts","otf loading")  local fonts=fonts  local otf=fonts.handlers.otf -otf.version=3.115  +otf.version=3.116   otf.cache=containers.define("fonts","otl",otf.version,true)  otf.svgcache=containers.define("fonts","svg",otf.version,true)  otf.pngcache=containers.define("fonts","png",otf.version,true) @@ -22049,6 +22049,8 @@ local getoffsets=nuts.getoffsets  local getboth=nuts.getboth  local getdisc=nuts.getdisc  local setdisc=nuts.setdisc +local getreplace=nuts.getreplace +local setreplace=nuts.setreplace  local setoffsets=nuts.setoffsets  local ischar=nuts.ischar  local getkern=nuts.getkern @@ -22714,17 +22716,15 @@ local function inject_positions_only(head,where)         insertnodeafter(head,current,fontkern(rightkern))        end       end -    else +    elseif next then       local i=p.emptyinjections       if i then        local rightkern=i.rightkern -      if rightkern and rightkern~=0 then -       if next and getid(next)==disc_code then -        if replace then -        else -         replace=fontkern(rightkern)  -         done=true	 -        end +      if rightkern and rightkern~=0 and getid(next)==disc_code then +       local replace=getreplace(next) +       if replace then +       else +        setreplace(next,fontkern(rightkern))         end        end       end @@ -23082,17 +23082,15 @@ local function inject_everything(head,where)         end        end       end -    else +    elseif next then       local i=p.emptyinjections       if i then        local rightkern=i.rightkern -      if rightkern and rightkern~=0 then -       if next and getid(next)==disc_code then -        if replace then -        else -         replace=fontkern(rightkern) -         done=true -        end +      if rightkern and rightkern~=0 and getid(next)==disc_code then +       local replace=getreplace(next) +       if replace then +       else +        setreplace(next,fontkern(rightkern))         end        end       end @@ -25768,7 +25766,7 @@ local function checkpairs(lookup)      else       local v=d2[1]       if v==true then -     elseif v and (v[1]~=0 or v[2]~=0 or v[3]~=0 or v[4]~=0) then  +     elseif v and (v[1]~=0 or v[2]~=0 or v[4]~=0) then        return false       end      end | 
