diff options
Diffstat (limited to 'tex/context/base/mkiv')
45 files changed, 1113 insertions, 300 deletions
diff --git a/tex/context/base/mkiv/back-exp.lua b/tex/context/base/mkiv/back-exp.lua index f72cd68b8..3b9a8f3ac 100644 --- a/tex/context/base/mkiv/back-exp.lua +++ b/tex/context/base/mkiv/back-exp.lua @@ -144,6 +144,7 @@ local treeroot = tree local treehash = { } local extras = { } local checks = { } +local fixes = { } local finalizers = { } local nofbreaks = 0 local used = { } @@ -707,6 +708,35 @@ end do + function fixes.linenumber(di,data,i) + local ni = data[i+1] + if ni and ni.data then + while true do + local d = ni.data[1] + if d then + local e = d.element + if e then + if e == "line" or e == "verbatimline" then + table.insert(d.data,1,di) + data[i] = false + return + else + ni = d + end + else + return + end + else + return + end + end + end + end + +end + +do + local synonyms = { } local sortings = { } @@ -2305,8 +2335,10 @@ do if not p then -- skip elseif exportproperties == v_yes then + n = n + 1 r[n] = attributes(p) else + n = n + 1 r[n] = properties(p) end end @@ -2574,9 +2606,12 @@ do -- also tabulaterow reconstruction .. maybe better as a checker -- i.e cell attribute - local function collapsetree() - for tag, trees in next, treehash do + local function collapsetree(tree) + for tag, trees in sortedhash(treehash) do +-- for tag, trees in next, treehash do local d = trees[1].data +-- print("!!!!!!!!",tag) +-- inspect(trees) if d then local nd = #d if nd > 0 then @@ -2630,10 +2665,22 @@ do end end + -- local function showtree(data,when,where) + -- if data then + -- for i=1,#data do + -- local d = data[i] + -- if type(d) == "table" and d.element then + -- print(when,where,i,d.element,d.parnumber or 0) + -- end + -- end + -- end + -- end + local function indextree(tree) local data = tree.data if data then local n, new = 0, { } + -- showtree(data,"before","index") for i=1,#data do local d = data[i] if not d then @@ -2650,22 +2697,43 @@ do end end tree.data = new + -- showtree(new,"after","index") end end local function checktree(tree) local data = tree.data if data then + -- showtree(data,"before","check") for i=1,#data do local d = data[i] if type(d) == "table" then local check = checks[d.tg] if check then - check(d) + check(d,data,i) end checktree(d) -- so parts can pass twice end end + -- showtree(data,"after","check") + end + end + + local function fixtree(tree) + local data = tree.data + if data then + -- showtree(data,"before","fix") + for i=1,#data do + local d = data[i] + if type(d) == "table" then + local fix = fixes[d.tg] + if fix then + fix(d,data,i) + end + fixtree(d) -- so parts can pass twice + end + end + -- showtree(data,"after","fix") end end @@ -2675,6 +2743,7 @@ do wrapups.finalizetree = finalizetree wrapups.indextree = indextree wrapups.checktree = checktree + wrapups.fixtree = fixtree end @@ -3828,6 +3897,7 @@ local htmltemplate = [[ end report_export("") -- + wrapups.fixtree(tree) wrapups.collapsetree(tree) wrapups.indextree(tree) wrapups.checktree(tree) diff --git a/tex/context/base/mkiv/buff-ini.lua b/tex/context/base/mkiv/buff-ini.lua index 5b5c47867..e4f01c03f 100644 --- a/tex/context/base/mkiv/buff-ini.lua +++ b/tex/context/base/mkiv/buff-ini.lua @@ -42,6 +42,10 @@ local scantokencode = scanners.tokencode local getters = tokens.getters local gettoken = getters.token +local getcommand = token.get_command +local getcsname = token.get_csname +local getnextchar = token.get_next_char + local scanners = interfaces.scanners local variables = interfaces.variables @@ -375,7 +379,7 @@ local tochar = { local experiment = false local experiment = scantokencode and true -function tokens.pickup(start,stop) +local function pickup(start,stop) local stoplist = split[stop] -- totable(stop) local stoplength = #stoplist local stoplast = stoplist[stoplength] @@ -439,11 +443,11 @@ function tokens.pickup(start,stop) -- we're skipping leading stuff, like obeyedlines and relaxes if experiment and size > 0 then -- we're probably in a macro - local char = tochar[token.get_command(t)] -- could also be char(token.get_mode(t)) + local char = tochar[getcommand(t)] if char then size = size + 1 ; list[size] = char else - local csname = token.get_csname(t) + local csname = getcsname(t) if csname == stop then stoplength = 0 break @@ -494,6 +498,118 @@ function tokens.pickup(start,stop) end end +-- -- lmtx: +-- +-- local function pickup(start,stop) +-- local stoplist = split[stop] -- totable(stop) +-- local stoplength = #stoplist +-- local stoplast = stoplist[stoplength] +-- local startlist = split[start] -- totable(start) +-- local startlength = #startlist +-- local startlast = startlist[startlength] +-- local list = { } +-- local size = 0 +-- local depth = 0 +-- getnextchar() -- we start with a \relax +-- while true do -- or use depth +-- local char = getnextchar() +-- if char then +-- size = size + 1 +-- list[size] = char +-- if char == stoplast and size >= stoplength then +-- local done = true +-- local last = size +-- for i=stoplength,1,-1 do +-- if stoplist[i] ~= list[last] then +-- done = false +-- break +-- end +-- last = last - 1 +-- end +-- if done then +-- if depth > 0 then +-- depth = depth - 1 +-- else +-- break +-- end +-- char = false -- trick: let's skip the next (start) test +-- end +-- end +-- if char == startlast and size >= startlength then +-- local done = true +-- local last = size +-- for i=startlength,1,-1 do +-- if startlist[i] ~= list[last] then +-- done = false +-- break +-- end +-- last = last - 1 +-- end +-- if done then +-- depth = depth + 1 +-- end +-- end +-- else +-- local t = gettoken() +-- if t then +-- -- we're skipping leading stuff, like obeyedlines and relaxes +-- if experiment and size > 0 then +-- -- we're probably in a macro +-- local char = tochar[getcommand(t)] +-- if char then +-- size = size + 1 ; list[size] = char +-- else +-- local csname = getcsname(t) +-- if csname == stop then +-- stoplength = 0 +-- break +-- else +-- size = size + 1 ; list[size] = "\\" +-- size = size + 1 ; list[size] = csname +-- size = size + 1 ; list[size] = " " +-- end +-- end +-- else +-- -- ignore and hope for the best +-- end +-- else +-- break +-- end +-- end +-- end +-- local start = 1 +-- local stop = size - stoplength - 1 +-- -- not good enough: only empty lines, but even then we miss the leading +-- -- for verbatim +-- -- +-- -- the next is not yet adapted to the new scanner ... we don't need lpeg here +-- -- +-- for i=start,stop do +-- local li = list[i] +-- if lpegmatch(blackspace,li) then +-- -- keep going +-- elseif lpegmatch(eol,li) then +-- -- okay +-- start = i + 1 +-- else +-- break +-- end +-- end +-- for i=stop,start,-1 do +-- if lpegmatch(whitespace,list[i]) then +-- stop = i - 1 +-- else +-- break +-- end +-- end +-- -- +-- if start <= stop then +-- return concat(list,"",start,stop) +-- else +-- return "" +-- end +-- end + -- function buffers.pickup(name,start,stop,finish,catcodes,doundent) -- local data = tokens.pickup(start,stop) -- if doundent or (autoundent and doundent == nil) then @@ -505,6 +621,8 @@ end -- commands.pickupbuffer = buffers.pickup +tokens.pickup = pickup + scanners.pickupbuffer = function() local name = scanstring() local start = scanstring() @@ -512,7 +630,7 @@ scanners.pickupbuffer = function() local finish = scanstring() local catcodes = scaninteger() local doundent = scanboolean() - local data = tokens.pickup(start,stop) + local data = pickup(start,stop) if doundent or (autoundent and doundent == nil) then data = undent(data) end diff --git a/tex/context/base/mkiv/buff-ini.mkiv b/tex/context/base/mkiv/buff-ini.mkiv index 8e71c9865..a8a120d90 100644 --- a/tex/context/base/mkiv/buff-ini.mkiv +++ b/tex/context/base/mkiv/buff-ini.mkiv @@ -116,7 +116,7 @@ {\endgroup % (1) \endgroup % (2) #5}% - % todo: we need to skip the first lineending which is na active character + % todo: we need to skip the first lineending which is an active character % but sometimes we have something different ... this is a side effect of % checking for optional arguments i.e. the next token is already tokenized % and for that reason we have the \relax as well as the \string diff --git a/tex/context/base/mkiv/cldf-ini.mkiv b/tex/context/base/mkiv/cldf-ini.mkiv index 29fb15d68..0a1ee639f 100644 --- a/tex/context/base/mkiv/cldf-ini.mkiv +++ b/tex/context/base/mkiv/cldf-ini.mkiv @@ -17,8 +17,7 @@ \registerctxluafile{cldf-ini}{} -%D With each new update of \MKIV\ we can join Within Temptation in -%D singing: +%D With each new update of \MKIV\ we can join Within Temptation in singing: %D %D \startbuffer %D \startluacode diff --git a/tex/context/base/mkiv/cldf-int.mkxl b/tex/context/base/mkiv/cldf-int.mkxl new file mode 100644 index 000000000..aae7d0416 --- /dev/null +++ b/tex/context/base/mkiv/cldf-int.mkxl @@ -0,0 +1,31 @@ +%D \module +%D [ file=mult-ini, +%D version=2008.10.22, % 1996.06.01, +%D title=\CONTEXT\ Multilingual Macros, +%D subtitle=Initialization, +%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 Multilingual Macros / Lua} + +\registerctxluafile{cldf-int}{} + +\unprotect + +\unexpanded\def\newluatable#1{\clf_newluatable#1\atendofgrouped{\disposeluatable#1}} +\unexpanded\def\useluatable#1{\clf_useluatable#1\atendofgrouped{\disposeluatable#1}} + +\installcorenamespace{datavalue} + +\unexpanded\def\setdatavalue#1#2% #2 is a number (expression) + {\expandafter\letdatacode\csname\??datavalue#1\endcsname\numexpr#2\relax} + +\def\getdatavalue#1{\begincsname\??datavalue#1\endcsname} +\def\thedatavalue#1{\the\begincsname\??datavalue#1\endcsname} + +\protect \endinput diff --git a/tex/context/base/mkiv/cldf-lmt.lua b/tex/context/base/mkiv/cldf-lmt.lua index 74ba5c224..ab25f962e 100644 --- a/tex/context/base/mkiv/cldf-lmt.lua +++ b/tex/context/base/mkiv/cldf-lmt.lua @@ -6,45 +6,52 @@ if not modules then modules = { } end modules ['cldf-lmt'] = { license = "see context related readme files" } -local random = math.random -local randomseed = math.randomseed -local round = math.round -local abs = math.abs - -local scanners = tokens.scanners -local scanword = scanners.word -local scanstring = scanners.string -local scanboolean = scanners.boolean -local scandimen = scanners.dimen -local scanfloat = scanners.float -local scancount = scanners.integer -local scaninteger = scanners.luainteger -local scancardinal = scanners.luacardinal -local scannumber = scanners.luanumber -local scanargument = scanners.argument -local scantoken = scanners.token -local getindex = token.get_index -local texsetdimen = tex.setdimen - -local values = tokens.values -local none_code = values.none -local integer_code = values.integer -local cardinal_code = values.cardinal -local dimension_code = values.dimension -local skip_code = values.skip -local boolean_code = values.boolean -local float_code = values.float - -local context = context +local next, load = next, load + +local setmetatableindex = table.setmetatableindex +local serialize = table.serialize + +local random = math.random +local randomseed = math.randomseed +local round = math.round +local abs = math.abs + +local implement = interfaces.implement + +local scanners = tokens.scanners +local scanword = scanners.word +local scanstring = scanners.string +local scanboolean = scanners.boolean +local scandimen = scanners.dimen +local scanfloat = scanners.float +local scancount = scanners.integer +local scaninteger = scanners.luainteger +local scancardinal = scanners.luacardinal +local scannumber = scanners.luanumber +local scanargument = scanners.argument +local scantoken = scanners.token +local getindex = token.get_index +local texsetdimen = tex.setdimen + +local values = tokens.values +local none_code = values.none +local integer_code = values.integer +local cardinal_code = values.cardinal +local dimension_code = values.dimension +local skip_code = values.skip +local boolean_code = values.boolean +local float_code = values.float + +local context = context + +-- variables -- local floats = { } local integers = { } local cardinals = { } local numbers = { } --- variables -- - -interfaces.implement { +implement { name = "luafloat", public = true, value = true, @@ -59,7 +66,7 @@ interfaces.implement { end, } -interfaces.implement { +implement { name = "luainteger", public = true, value = true, @@ -73,7 +80,7 @@ interfaces.implement { end, } -interfaces.implement { +implement { name = "luacount", public = true, value = true, @@ -87,7 +94,7 @@ interfaces.implement { end, } -interfaces.implement { +implement { name = "luadimen", public = true, value = true, @@ -101,7 +108,7 @@ interfaces.implement { end, } -interfaces.implement { +implement { name = "luacardinal", public = true, value = true, @@ -115,7 +122,7 @@ interfaces.implement { end, } -interfaces.implement { +implement { name = "luanumber", public = true, value = true, @@ -130,7 +137,7 @@ interfaces.implement { end, } -interfaces.implement { +implement { name = "luarandom", public = true, value = true, @@ -159,7 +166,7 @@ interfaces.arrays = arrays local newindex = lua.newindex -interfaces.implement { +implement { name = "newarray", public = true, protected = true, @@ -220,7 +227,7 @@ interfaces.implement { end, } -interfaces.implement { +implement { name = "arrayvalue", public = true, value = true, @@ -252,7 +259,7 @@ interfaces.implement { } -interfaces.implement { +implement { name = "arrayequals", public = true, value = true, @@ -276,7 +283,7 @@ interfaces.implement { end, } -interfaces.implement { +implement { name = "arraycompare", public = true, value = true, @@ -308,7 +315,7 @@ interfaces.implement { end, } -interfaces.implement { +implement { name = "showarray", public = true, protected = true, @@ -334,7 +341,7 @@ end) table.makeweak(cache) -interfaces.implement { +implement { name = "luaexpression", public = true, actions = function() @@ -367,7 +374,7 @@ interfaces.implement { local dimenfactors = number.dimenfactors -interfaces.implement { +implement { name = "nodimen", public = true, value = true, @@ -397,3 +404,206 @@ interfaces.implement { end end, } + +-- experimental: + +local grouped = { } +local slots = { } +local nofslots = 0 +local nofgrouped = 0 + +local getdata = tokens.getdata +local setdata = tokens.setdata + +local report = logs.reporter("lua table") + +----- ctxsprint = context.sprint + +-- we could have an extra one that collects all end of grouped actions +-- so that we dispose more in one go but it doesn's pay off + +local function newluatable(name,mt,dispose) + local g = { } + local t = slots[nofslots] + slots[nofslots] = false + nofslots = nofslots - 1 + if not t then + nofgrouped = nofgrouped + 1 + t = nofgrouped + end + if mt then + mt = getdata(name) + if mt then + mt = grouped[mt] + if mt then + setmetatableindex(g,mt) + end + end + end + grouped[t] = g + setdata(name,t) + -- This is the slow part. Doing this at the TeX end saved 10% runtime. I'll + -- think of something that we can set it at the Lua end. + if dispose then + ctxsprint("\\atendofgrouped{\\disposeluatable\\" .. name .. "}") + end +end + +local function disposeluatable(name) + local t = getdata(name) + local g = grouped[t] + if g then + grouped[t] = false + nofslots = nofslots + 1 + slots[nofslots] = t + end +end + +local function setluatable(name,kv) + local t = getdata(name) + local g = grouped[t] + if g and kv then + for k, v in next, kv do + g[k] = v + end + end +end + +local function getfromluatable(name,k) + local t = getdata(name) + local g = grouped[t] + if g then + local v = g[k] + if v then + context(v) + else + local n = tonumber(k) + if n then + local v = g[n] + if v then + context(v) + end + end + end + end +end + +local function idxfromluatable(name,k) + local t = getdata(name) + local g = grouped[t] + if g then + local v = g[k] + if v then + context(v) + end + end +end + +local function getluatable(name,k) + local t = getdata(name) + local g = grouped[t] + if g then + return g + end +end + +local function inspectluatable(name) + local t = getdata(name) + local g = grouped[t] + if g then + report("%s", serialize(g,'[grouped slot ' .. t .. ']')) + end +end + +local function showluatables() + report("nofgrouped %i, nofslots %i",nofgrouped,nofslots) + for t=1,nofgrouped do + local g = grouped[t] + if g then + report("%s", serialize(g,'[grouped slot ' .. t .. ']')) + end + end +end + +implement { + name = "newluatable", + protected = true, + -- public = true, + arguments = { "csname" }, + actions = newluatable, +} + +implement { + name = "useluatable", + protected = true, + -- public = true, + arguments = { "csname", true }, + actions = newluatable, +} + +implement { + name = "disposeluatable", + protected = true, + public = true, + arguments = { "csname" }, + actions = disposeluatable, +} + +implement { + name = "inspectluatable", + protected = true, + public = true, + arguments = { "csname" }, + actions = inspectluatable, +} + +implement { + name = "showluatables", + protected = true, + public = true, + actions = showluatables, +} + +implement { + name = "setluatable", + protected = true, + public = true, + arguments = { "csname", "argument" }, + actions = function(name,data) + data = load("return {" .. data .. "}") + if data then + data = data() + if data then + setluatable(name,data) + end + end + end +} + +implement { + name = "getfromluatable", + protected = false, + public = true, + arguments = { "csname", "argument" }, + actions = getfromluatable, +} + +implement { + name = "idxfromluatable", + protected = false, + public = true, + arguments = { "csname", "integer" }, + actions = idxfromluatable, +} + +context.luatables = { + new = function(name) newluatable(name,false,true) end, + use = function(name) useluatable(name,true, true) end, + dispose = disposeluatable, + set = setluatable, + get = getluatable, + getfrom = getfromluatable, + idxfrom = idxfromluatable, + inspect = inspectluatable, + show = showluatables, +} diff --git a/tex/context/base/mkiv/colo-imp-rgb.mkiv b/tex/context/base/mkiv/colo-imp-rgb.mkiv index 85122cb44..ab11ae996 100644 --- a/tex/context/base/mkiv/colo-imp-rgb.mkiv +++ b/tex/context/base/mkiv/colo-imp-rgb.mkiv @@ -35,12 +35,19 @@ % adapted per 2011.10.28 -\definecolor [lightred] [r=1, g=0, b=0] -\definecolor [lightgreen] [r=0, g=1, b=0] -\definecolor [lightblue] [r=0, g=0, b=1] -\definecolor [lightcyan] [r=0, g=1, b=1] -\definecolor [lightmagenta] [r=1, g=0, b=1] -\definecolor [lightyellow] [r=1, g=1, b=0] +% \definecolor [lightred] [r=1, g=0, b=0] +% \definecolor [lightgreen] [r=0, g=1, b=0] +% \definecolor [lightblue] [r=0, g=0, b=1] +% \definecolor [lightcyan] [r=0, g=1, b=1] +% \definecolor [lightmagenta] [r=1, g=0, b=1] +% \definecolor [lightyellow] [r=1, g=1, b=0] + +\definecolor [lightred] [r=1, g=0.5, b=0.5] % [.5(red,white)] +\definecolor [lightgreen] [r=0.5, g=1, b=0.5] % [.5(green,white)] +\definecolor [lightblue] [r=0.5, g=0.5, b=1] % [.5(blue,white)] +\definecolor [lightcyan] [r=0.5, g=1, b=1] % [.5(cyan,white)] +\definecolor [lightmagenta] [r=1, g=0.5, b=1] % [.5(magenta,white)] +\definecolor [lightyellow] [r=1, g=1, b=0.5] % [.5(yellow,white)] \definecolor [middlered] [r=.8, g=0, b=0] \definecolor [middlegreen] [r=0, g=.8, b=0] diff --git a/tex/context/base/mkiv/cont-new.mkiv b/tex/context/base/mkiv/cont-new.mkiv index a0e290ba2..269c8d98f 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{2020.05.25 23:36} +\newcontextversion{2020.06.09 18:53} %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-performance.tex b/tex/context/base/mkiv/context-performance.tex index dd3768664..8b6ef11b2 100644 --- a/tex/context/base/mkiv/context-performance.tex +++ b/tex/context/base/mkiv/context-performance.tex @@ -1,5 +1,3 @@ -% language=uk - \usemodule[art-01,abr-01] \starttext diff --git a/tex/context/base/mkiv/context.mkiv b/tex/context/base/mkiv/context.mkiv index 7a8bc7827..a33d7b1ed 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{2020.05.25 23:36} +\edef\contextversion{2020.06.09 18:53} \edef\contextkind {beta} %D Kind of special: diff --git a/tex/context/base/mkiv/context.mkxl b/tex/context/base/mkiv/context.mkxl index 76352fe98..eefe2f97b 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{2020.05.25 23:36} +\edef\contextversion{2020.06.09 18:53} \edef\contextkind {beta} %D Kind of special: @@ -142,7 +142,7 @@ \loadmarkfile{mult-chk} \loadmkvifile{mult-dim} -\loadmarkfile{cldf-int} % interface +\loadmkxlfile{cldf-int} % interface \loadmarkfile{trac-ctx} % maybe move up diff --git a/tex/context/base/mkiv/core-env.lua b/tex/context/base/mkiv/core-env.lua index 50759dd19..c496a5a8c 100644 --- a/tex/context/base/mkiv/core-env.lua +++ b/tex/context/base/mkiv/core-env.lua @@ -47,12 +47,13 @@ local cache = tokens.cache local iftrue = cache["iftrue"].mode -local dimencode = cache["scratchdimen"] .command -local countcode = cache["scratchcounter"] .command -local tokencode = cache["scratchtoken"] .command -local skipcode = cache["scratchskip"] .command -local muskipcode = cache["scratchmuskip"] .command ------ attributecode = cache["scratchattribute"].command +local dimencode = cache["scratchdimen"] .command -- tokens.commands.assign_dimen +local countcode = cache["scratchcounter"] .command -- tokens.commands.assign_int +local tokencode = cache["scratchtoken"] .command -- tokens.commands.assign_toks +local skipcode = cache["scratchskip"] .command -- tokens.commands.assign_glue +local muskipcode = cache["scratchmuskip"] .command -- tokens.commands.assign_mu_glue +----- attributecode = cache["scratchattribute"].command -- tokens.commands.assign_attr +local conditioncode = cache["iftrue"] .command -- tokens.commands.if_test local types = { [dimencode] = "dimen", @@ -61,6 +62,7 @@ local types = { [skipcode] = "skip", [muskipcode] = "muskip", -- [attributecode] = "attribute", + [conditioncode] = "condition" } setmetatableindex(texmodes, function(t,k) @@ -123,6 +125,30 @@ setmetatablenewindex(texifs, function(t,k) -- just ignore end) +if CONTEXTLMTXMODE > 0 then + + iftrue = cache["iftrue"].index + + -- if we really need performance we can have a dedicated cache for each + -- kind of variable + + setmetatableindex(texconstants, function(t,k) + return cache[k].command == countcode and texgetcount(k) or 0 + end) + + setmetatableindex(texconditionals, function(t,k) -- 0 == true + return cache[k].command == countcode and texgetcount(k) == 0 + end) + + table.setmetatableindex(texifs, function(t,k) + local c = cache[k] + print(k) + inspect(c) + return c.command == conditioncode and c.index == iftrue + end) + +end + tex.isdefined = isdefined function tex.isdimen(name) diff --git a/tex/context/base/mkiv/core-lmt.mkxl b/tex/context/base/mkiv/core-lmt.mkxl index 75a791a50..7fb38e830 100644 --- a/tex/context/base/mkiv/core-lmt.mkxl +++ b/tex/context/base/mkiv/core-lmt.mkxl @@ -13,14 +13,11 @@ \writestatus{loading}{ConTeXt System Macros / Primitives} -%D This is offered temporarily because in the end we don't expect u sers to use the -%D low level direction directives directly. - \registerctxluafile{core-lmt}{} \unprotect -% nothing yet +% nothing here \protect \endinput diff --git a/tex/context/base/mkiv/export-example.css b/tex/context/base/mkiv/export-example.css index 096408ee1..7cfd7f291 100644 --- a/tex/context/base/mkiv/export-example.css +++ b/tex/context/base/mkiv/export-example.css @@ -479,8 +479,9 @@ context|div.verbatim { font-family : "DejaVu Sans Mono", "Lucida Console", monospace ; } -/* lines : display */ -/* line : mixed */ +/* lines : display */ +/* line : mixed */ +/* linenumber : inline */ lines, context|div.lines { @@ -501,6 +502,15 @@ context|div.line { white-space : pre-wrap ; } +linenumber, +context|div.linenumber { + display : inline-block ; + margin-right : 1em ; + width : 3em ; + text-align : left ; + font-family : "DejaVu Sans Mono", "Lucida Console", monospace ; +} + /* synonym : inline */ /* sorting : inline */ diff --git a/tex/context/base/mkiv/export-example.tex b/tex/context/base/mkiv/export-example.tex index 32cb79c5e..9ef414422 100644 --- a/tex/context/base/mkiv/export-example.tex +++ b/tex/context/base/mkiv/export-example.tex @@ -1,5 +1,3 @@ -% language=uk - \usemodule[abr-01] \setupexport diff --git a/tex/context/base/mkiv/font-fil.mklx b/tex/context/base/mkiv/font-fil.mklx index 2b8224dfe..65cd64428 100644 --- a/tex/context/base/mkiv/font-fil.mklx +++ b/tex/context/base/mkiv/font-fil.mklx @@ -92,7 +92,7 @@ {\expandafter\let\csname\??fontfile\fontclass\m_font_name\endcsname\m_font_file \doifelsenextoptionalcs\font_basics_define_font_synonym_yes_opt\font_basics_define_font_synonym_yes_nil} -\unexpanded\def\edefinefontsynonym[#name]#crap[#file]% +\unexpanded\def\edefinefontsynonym[#name]#ignore[#file]% {\edef\m_font_name{#name}% \edef\m_font_file{#file}% \ifempty\fontclass @@ -101,33 +101,66 @@ \expandafter\font_basics_define_font_synonym_yes_expanded \fi} -\unexpanded\def\font_basics_define_font_synonym_nop_expanded#crap[#spec]% +\unexpanded\def\font_basics_define_font_synonym_nop_expanded#ignore[#spec]% {\expandafter\let\csname\??fontfile\m_font_name\endcsname\m_font_file - \normalexpanded{\font_basics_define_font_synonym_nop_opt[#1]}} + \normalexpanded{\font_basics_define_font_synonym_nop_opt[#spec]}} -\unexpanded\def\font_basics_define_font_synonym_yes_expanded#crap[#spec]% +\unexpanded\def\font_basics_define_font_synonym_yes_expanded#ignore[#spec]% {\expandafter\let\csname\??fontfile\fontclass\m_font_name\endcsname\m_font_file \normalexpanded{\font_basics_define_font_synonym_yes_opt[#spec]}} +% \unexpanded\def\font_basics_define_font_synonym_nop_opt[#specification]% +% {\let\p_features \undefined +% \let\p_fallbacks \undefined +% \let\p_goodies \undefined +% \let\p_designsize\undefined +% \expandafter\font_basics_get_font_parameter_nop#specification,]=,} +% +% \unexpanded\def\font_basics_define_font_synonym_yes_opt[#specification]% +% {\let\p_features \undefined +% \let\p_fallbacks \undefined +% \let\p_goodies \undefined +% \let\p_designsize\undefined +% \expandafter\font_basics_get_font_parameter_yes#specification,]=,} +% +% % todo: check if we can use \edef but then we need to protect \mathsizesuffix .. in fact that +% % can be default then: \let\mathsizesuffix\relax .. i need to play with it first +% +% \def\font_basics_get_font_parameter_nop#key=#value,% +% {\if]#key% +% \font_basics_get_font_parameter_nop_finish +% \else +% \expandafter\normaldef\csname p_#key\endcsname{#value}% % no edef as we need to keep \mathsizesuffix +% \expandafter\font_basics_get_font_parameter_nop +% \fi} +% +% \def\font_basics_get_font_parameter_yes#key=#value,% +% {\if]#key% +% \font_basics_get_font_parameter_yes_finish +% \else +% \expandafter\normaldef\csname p_#key\endcsname{#value}% % no edef as we need to keep \mathsizesuffix +% \expandafter\font_basics_get_font_parameter_yes +% \fi} + \unexpanded\def\font_basics_define_font_synonym_nop_opt[#specification]% {\let\p_features \undefined \let\p_fallbacks \undefined \let\p_goodies \undefined \let\p_designsize\undefined - \expandafter\font_basics_get_font_parameter_nop#specification,]=,} + \expandafter\font_basics_get_font_parameter_nop#specification,\ignorearguments} \unexpanded\def\font_basics_define_font_synonym_yes_opt[#specification]% {\let\p_features \undefined \let\p_fallbacks \undefined \let\p_goodies \undefined \let\p_designsize\undefined - \expandafter\font_basics_get_font_parameter_yes#specification,]=,} + \expandafter\font_basics_get_font_parameter_yes#specification,\ignorearguments} % todo: check if we can use \edef but then we need to protect \mathsizesuffix .. in fact that % can be default then: \let\mathsizesuffix\relax .. i need to play with it first \def\font_basics_get_font_parameter_nop#key=#value,% - {\if]#key% + {\ifarguments \font_basics_get_font_parameter_nop_finish \else \expandafter\normaldef\csname p_#key\endcsname{#value}% % no edef as we need to keep \mathsizesuffix @@ -135,7 +168,7 @@ \fi} \def\font_basics_get_font_parameter_yes#key=#value,% - {\if]#key% + {\ifarguments \font_basics_get_font_parameter_yes_finish \else \expandafter\normaldef\csname p_#key\endcsname{#value}% % no edef as we need to keep \mathsizesuffix @@ -202,32 +235,66 @@ % todo: replace * by ... less messy with features +% \def\truefontname#name% +% {\expandafter\font_helpers_true_fontname#name*\empty*\relax} +% +% \def\font_helpers_true_fontname#name*#first#rest*#crap\relax +% {\ifcsname\??fontfile\fontclass#name\endcsname +% \ifempty#first% +% \expandafter\truefontname\lastnamedcs +% \else +% \expandafter\font_helpers_true_fontname_check\lastnamedcs*#first#rest% +% \fi +% \orelse\ifcsname\??fontfile\defaultfontclass#name\endcsname +% \ifempty#first% +% \expandafter\truefontname\lastnamedcs +% \else +% \expandafter\font_helpers_true_fontname_check\lastnamedcs*#first#rest% +% \fi +% \orelse\ifcsname\??fontfile#name\endcsname +% \ifempty#first% +% \expandafter\truefontname\lastnamedcs +% \else +% \expandafter\font_helpers_true_fontname_check\lastnamedcs*#first#rest% +% \fi +% \else +% #name\ifempty#first\else*#first#rest\fi +% \fi} +% +% \def\font_helpers_true_fontname_check#name% +% {\expandafter\font_helpers_true_fontname_check_indeed#name*\relax} +% +% \def\font_helpers_true_fontname_check_indeed#name*#crap\relax +% {\ifcsname\??fontfile\fontclass#name\endcsname +% \expandafter\font_helpers_true_fontname_check\lastnamedcs +% \orelse\ifcsname\??fontfile\defaultfontclass#name\endcsname +% \expandafter\font_helpers_true_fontname_check\lastnamedcs +% \orelse\ifcsname\??fontfile#name\endcsname +% \expandafter\font_helpers_true_fontname_check\lastnamedcs +% \else +% #name% +% \fi} + \def\truefontname#name% {\expandafter\font_helpers_true_fontname#name*\empty*\relax} -\def\font_helpers_true_fontname#name*#first#rest*#crap\relax +\def\font_helpers_true_fontname#name*#first#rest*#ignore\relax {\ifcsname\??fontfile\fontclass#name\endcsname \ifempty#first% - %\expandafter\truefontname\csname\??fontfile\fontclass#name\endcsname \expandafter\truefontname\lastnamedcs \else - %\expandafter\font_helpers_true_fontname_check\csname\??fontfile\fontclass#name\endcsname*#first#rest% \expandafter\font_helpers_true_fontname_check\lastnamedcs*#first#rest% \fi \orelse\ifcsname\??fontfile\defaultfontclass#name\endcsname \ifempty#first% - %\expandafter\truefontname\csname\??fontfile\defaultfontclass#name\endcsname \expandafter\truefontname\lastnamedcs \else - %\expandafter\font_helpers_true_fontname_check\csname\??fontfile\defaultfontclass#name\endcsname*#first#rest% \expandafter\font_helpers_true_fontname_check\lastnamedcs*#first#rest% \fi \orelse\ifcsname\??fontfile#name\endcsname \ifempty#first% - %\expandafter\truefontname\csname\??fontfile#name\endcsname \expandafter\truefontname\lastnamedcs \else - %\expandafter\font_helpers_true_fontname_check\csname\??fontfile#name\endcsname*#first#rest% \expandafter\font_helpers_true_fontname_check\lastnamedcs*#first#rest% \fi \else @@ -237,15 +304,12 @@ \def\font_helpers_true_fontname_check#name% {\expandafter\font_helpers_true_fontname_check_indeed#name*\relax} -\def\font_helpers_true_fontname_check_indeed#name*#crap\relax +\def\font_helpers_true_fontname_check_indeed#name*#ignore\relax {\ifcsname\??fontfile\fontclass#name\endcsname - %\expandafter\font_helpers_true_fontname_check\csname\??fontfile\fontclass#name\endcsname \expandafter\font_helpers_true_fontname_check\lastnamedcs \orelse\ifcsname\??fontfile\defaultfontclass#name\endcsname - %\expandafter\font_helpers_true_fontname_check\csname\??fontfile\defaultfontclass#name\endcsname \expandafter\font_helpers_true_fontname_check\lastnamedcs \orelse\ifcsname\??fontfile#name\endcsname - %\expandafter\font_helpers_true_fontname_check\csname\??fontfile#name\endcsname \expandafter\font_helpers_true_fontname_check\lastnamedcs \else #name% @@ -271,10 +335,8 @@ \def\expandfontsynonym#command#name% one level expansion {\ifcsname\??fontfile\fontclass#name\endcsname - %\expandafter\normaldef\expandafter#command\expandafter{\csname\??fontfile\fontclass#name\endcsname}% \expandafter\normaldef\expandafter#command\expandafter{\lastnamedcs}% \orelse\ifcsname\??fontfile\defaultfontclass#2\endcsname - %\expandafter\normaldef\expandafter#command\expandafter{\csname\??fontfile\defaultfontclass#name\endcsname}% \expandafter\normaldef\expandafter#command\expandafter{\lastnamedcs}% \fi} diff --git a/tex/context/base/mkiv/font-fil.mkvi b/tex/context/base/mkiv/font-fil.mkvi index 8622e733f..f70be13ee 100644 --- a/tex/context/base/mkiv/font-fil.mkvi +++ b/tex/context/base/mkiv/font-fil.mkvi @@ -103,7 +103,7 @@ \unexpanded\def\font_basics_define_font_synonym_nop_expanded#crap[#spec]% {\expandafter\let\csname\??fontfile\m_font_name\endcsname\m_font_file - \normalexpanded{\font_basics_define_font_synonym_nop_opt[#1]}} + \normalexpanded{\font_basics_define_font_synonym_nop_opt[#spec]}} \unexpanded\def\font_basics_define_font_synonym_yes_expanded#crap[#spec]% {\expandafter\let\csname\??fontfile\fontclass\m_font_name\endcsname\m_font_file diff --git a/tex/context/base/mkiv/font-mat.mklx b/tex/context/base/mkiv/font-mat.mklx index d08a2ce87..da576bf9a 100644 --- a/tex/context/base/mkiv/font-mat.mklx +++ b/tex/context/base/mkiv/font-mat.mklx @@ -386,25 +386,13 @@ \font_helpers_synchronize_math_family_mr \fi} -\ifdefined \fontid % we need to keep this test for a while - \appendtoks - \ifnum\fontid\textfont\zerocount=\fontid\textfont\plusthree - \letvalue{\??fontmathstoredstrategy\fontclass}\font_helpers_set_math_partial_bold_strategy - \else - \letvalue{\??fontmathstoredstrategy\fontclass}\font_helpers_set_math_full_bold_strategy - \fi - \to \t_font_math_strategies -\else - \appendtoks - \edef\currentmathfontmr{\fontname\textfont\zerocount}% - \edef\currentmathfontmb{\fontname\textfont\plusthree}% - \ifx\currentmathfontmr\currentmathfontmb - \letvalue{\??fontmathstoredstrategy\fontclass}\font_helpers_set_math_partial_bold_strategy - \else - \letvalue{\??fontmathstoredstrategy\fontclass}\font_helpers_set_math_full_bold_strategy - \fi - \to \t_font_math_strategies -\fi +\appendtoks + \ifnum\fontid\textfont\zerocount=\fontid\textfont\plusthree + \letvalue{\??fontmathstoredstrategy\fontclass}\font_helpers_set_math_partial_bold_strategy + \else + \letvalue{\??fontmathstoredstrategy\fontclass}\font_helpers_set_math_full_bold_strategy + \fi +\to \t_font_math_strategies %def\font_helpers_synchronize_math_bold_strategy{\csname\??fontmathstoredstrategy\fontclass\endcsname} \def\font_helpers_synchronize_math_bold_strategy{\begincsname\??fontmathstoredstrategy\fontclass\endcsname} diff --git a/tex/context/base/mkiv/font-ots.lua b/tex/context/base/mkiv/font-ots.lua index 3b6ea6a72..b612e85e7 100644 --- a/tex/context/base/mkiv/font-ots.lua +++ b/tex/context/base/mkiv/font-ots.lua @@ -2056,6 +2056,7 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck) local sweepnode = sweepnode local sweeptype = sweeptype local sweepoverflow = false + local checkdisc = getprev(head) local keepdisc = not sweepnode local lookaheaddisc = nil local backtrackdisc = nil @@ -2089,6 +2090,7 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck) sweepnode = current current = getnext(current) else + -- we can use an iterator while replace and i <= l do if getid(replace) == glyph_code then i = i + 1 @@ -2189,7 +2191,7 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck) local current = prev local i = f local t = sweeptype == "pre" or sweeptype == "replace" - if not current and t and current == checkdisk then + if not current and t and current == checkdisc then current = getprev(sweepnode) end while current and i > 1 do -- missing getprev added / moved outside @@ -2218,7 +2220,7 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck) end end current = getprev(current) - if t and current == checkdisk then + if t and current == checkdisc then current = getprev(sweepnode) end end @@ -2443,6 +2445,10 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s local current = start local last = start + if s == 1 then + goto next + end + -- current match if l > f then @@ -2512,10 +2518,9 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s break end end - -- commented, for Kai to check - -- if n <= l then - -- notmatchpre[last] = true - -- end + if n <= l then + notmatchpre[last] = true + end else notmatchpre[last] = true end diff --git a/tex/context/base/mkiv/grph-trf.mkiv b/tex/context/base/mkiv/grph-trf.mkiv index 522dd08d6..d6a6acd78 100644 --- a/tex/context/base/mkiv/grph-trf.mkiv +++ b/tex/context/base/mkiv/grph-trf.mkiv @@ -969,7 +969,7 @@ \d_grph_rotate_used_height\ht\nextbox % \clf_analyzerotate % rather accurate - \numexpr\p_rotation_rotation\relax + \p_rotation_rotation\space \d_grph_rotate_width \d_grph_rotate_height \d_grph_rotate_depth diff --git a/tex/context/base/mkiv/lpdf-lmt.lua b/tex/context/base/mkiv/lpdf-lmt.lua index 43c4c1059..90e1fcea2 100644 --- a/tex/context/base/mkiv/lpdf-lmt.lua +++ b/tex/context/base/mkiv/lpdf-lmt.lua @@ -2713,7 +2713,8 @@ do -- pdf.setforcefile(false) -- default anyway -- end -- - pdfname = file.addsuffix(tex.jobname,"pdf") + -- pdfname = file.addsuffix(tex.jobname,"pdf") + pdfname = tex.jobname .. ".pdf" openfile(pdfname) -- luatex.registerstopactions(1,function() diff --git a/tex/context/base/mkiv/lpdf-pde.lua b/tex/context/base/mkiv/lpdf-pde.lua index ec1064a0d..1c80eb5b2 100644 --- a/tex/context/base/mkiv/lpdf-pde.lua +++ b/tex/context/base/mkiv/lpdf-pde.lua @@ -48,6 +48,7 @@ local abs = math.abs local concat, swapped, sortedhash, sortedkeys = table.concat, table.swapped, table.sortedhash, table.sortedkeys local utfchar = string.char local setmetatableindex = table.setmetatableindex +local ioopen = io.open local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns local P, C, S, R, Ct, Cc, V, Carg, Cs, Cf, Cg = lpeg.P, lpeg.C, lpeg.S, lpeg.R, lpeg.Ct, lpeg.Cc, lpeg.V, lpeg.Carg, lpeg.Cs, lpeg.Cf, lpeg.Cg @@ -67,6 +68,7 @@ local lpdf_epdf = { } lpdf.epdf = lpdf_epdf local pdfopen = pdfe.open +local pdfopenfile = pdfe.openfile local pdfnew = pdfe.new local pdfclose = pdfe.close @@ -440,8 +442,11 @@ function lpdf_epdf.load(filename,userpassword,ownerpassword,fromstring) if not document then statistics.starttiming(lpdf_epdf) local __data__ + local __file__ if fromstring then __data__ = pdfnew(filename,#filename) + elseif pdfopenfile then + __data__ = pdfopenfile(ioopen(filename,"rb")) else __data__ = pdfopen(filename) end diff --git a/tex/context/base/mkiv/luat-mac.lua b/tex/context/base/mkiv/luat-mac.lua index e6789a233..c754f602c 100644 --- a/tex/context/base/mkiv/luat-mac.lua +++ b/tex/context/base/mkiv/luat-mac.lua @@ -30,36 +30,89 @@ local report_macros = logs.reporter("interface","macros") local stack, top, n, hashes = { }, nil, 0, { } +-- local function set(s) +-- if top then +-- n = n + 1 +-- if n > 9 then +-- report_macros("number of arguments > 9, ignoring %s",s) +-- else +-- local ns = #stack +-- local h = hashes[ns] +-- if not h then +-- h = rep("#",2^(ns-1)) +-- hashes[ns] = h +-- end +-- if s == "ignore" then +-- top[s] = "" +-- return h .. "0" +-- else +-- local m = h .. n +-- top[s] = m +-- return m +-- end +-- end +-- end +-- end + +-- local function get(s) +-- if s == "ignore" then +-- return "" +-- else +-- if not top then +-- report_macros("keeping #%s, no stack",s) +-- return "#" .. s -- can be lua +-- end +-- local m = top[s] +-- if m then +-- return m +-- else +-- report_macros("keeping #%s, not on stack",s) +-- return "#" .. s -- quite likely an error +-- end +-- end +-- end + local function set(s) if top then - n = n + 1 - if n > 9 then - report_macros("number of arguments > 9, ignoring %s",s) + local ns = #stack + local h = hashes[ns] + if not h then + h = rep("#",2^(ns-1)) + hashes[ns] = h + end + if s == "ignore" then + return h .. "-" else - local ns = #stack - local h = hashes[ns] - if not h then - h = rep("#",2^(ns-1)) - hashes[ns] = h + n = n + 1 + if n > 9 then + report_macros("number of arguments > 9, ignoring %s",s) + elseif s == "discard" then + top[s] = "" + return h .. "0" + else + local m = h .. n + top[s] = m + return m end - local m = h .. n - top[s] = m - return m end end end local function get(s) - if not top then - report_macros("keeping #%s, no stack",s) - return "#" .. s -- can be lua - end - local m = top[s] - if m then - return m + if s == "ignore" or s == "discard" then + return "" else - report_macros("keeping #%s, not on stack",s) - return "#" .. s -- quite likely an error + if not top then + report_macros("keeping #%s, no stack",s) + return "#" .. s -- can be lua + end + local m = top[s] + if m then + return m + else + report_macros("keeping #%s, not on stack",s) + return "#" .. s -- quite likely an error + end end end @@ -336,6 +389,8 @@ end -- ]])) -- print(macros.preprocessed([[\checked \def \bla #bla{bla#{bla}}]])) +-- print(macros.preprocessed([[\checked \def \bla #bla#discard#foo{bla#{bla}+#ignore+bla#foo}]])) +-- print(macros.preprocessed([[\checked \def \bla #bla#ignore#foo{bla#{bla}+#ignore+bla#foo}]])) -- print(macros.preprocessed([[\def\bla#bla{#{bla}bla}]])) -- print(macros.preprocessed([[\def\blä#{blá}{blà :#{blá}}]])) -- print(macros.preprocessed([[\def\blä#bla{blà :#bla}]])) diff --git a/tex/context/base/mkiv/math-ini.mkxl b/tex/context/base/mkiv/math-ini.mkxl index 9cc3dfe1f..41b4e5d53 100644 --- a/tex/context/base/mkiv/math-ini.mkxl +++ b/tex/context/base/mkiv/math-ini.mkxl @@ -427,10 +427,8 @@ \unexpanded\def\math_set_font_style_alternate#1% {\ifcsname\??mathstylealternative\fontclass:#1\endcsname - %\expandafter\math_set_font_alternate\csname\??mathstylealternate\fontclass:#1\endcsname \expandafter\math_set_font_alternate\lastnamedcs \orelse\ifcsname\??mathstylealternative#1\endcsname - %\expandafter\math_set_font_alternate\csname\??mathstylealternate#1\endcsname \expandafter\math_set_font_alternate\lastnamedcs \fi} @@ -719,15 +717,15 @@ \unexpanded\def\math_strut_normal {\vrule - \normalexpanded{\math_strut_htdp{\mathstylefont\normalmathstyle}}% \s!width \zeropoint + \normalexpanded{\math_strut_htdp{\mathstylefont\normalmathstyle}}% \relax} \unexpanded\def\math_strut_visual {\hskip-.01\emwidth \vrule - \normalexpanded{\math_strut_htdp{\mathstylefont\normalmathstyle}}% \s!width .02\emwidth + \normalexpanded{\math_strut_htdp{\mathstylefont\normalmathstyle}}% \relax \hskip-.01\emwidth} diff --git a/tex/context/base/mkiv/math-rad.mkvi b/tex/context/base/mkiv/math-rad.mkvi index c640e768e..c279c3526 100644 --- a/tex/context/base/mkiv/math-rad.mkvi +++ b/tex/context/base/mkiv/math-rad.mkvi @@ -26,12 +26,24 @@ % \def\rootradical{\Uroot \defaultmathfamily "221A } % can be done in char-def % \def\surdradical{\Uradical \defaultmathfamily "221A } % can be done in char-def -\def\root#1\of{\rootradical{#1}} % #2 +\unexpanded\def\root#1\of{\rootradical{#1}} % #2 \unexpanded\def\sqrt{\doifelsenextoptionalcs\rootwithdegree\rootwithoutdegree} -\unexpanded\def\styledrootradical#1#2% so that \text works ok ... \rootradical behaves somewhat weird - {\normalexpanded{\rootradical{\normalunexpanded{#1}}{\noexpand\triggermathstyle{\normalmathstyle}\normalunexpanded{#2}}}} +\ifcase \contextlmtxmode + + \unexpanded\def\styledrootradical#1#2% so that \text works ok ... \rootradical behaves somewhat weird + {\normalexpanded{\rootradical + {\normalunexpanded{#1}}% + {\noexpand\triggermathstyle{\number\normalmathstyle}% + \normalunexpanded{#2}}}} + +\else % experimental new keyword: (maybe keywords should come after the symbol) + + \unexpanded\def\styledrootradical#1#2% so that \text works ok ... \rootradical behaves somewhat weird + {\Uroot style \normalmathstyle "0 "221A {#1}{#2}} + +\fi \unexpanded\def\rootwithdegree[#1]{\rootradical{#1}} \unexpanded\def\rootwithoutdegree {\rootradical {}} diff --git a/tex/context/base/mkiv/mult-aux.mkxl b/tex/context/base/mkiv/mult-aux.mkxl index e73b5ef45..74e717128 100644 --- a/tex/context/base/mkiv/mult-aux.mkxl +++ b/tex/context/base/mkiv/mult-aux.mkxl @@ -168,6 +168,10 @@ %D manual does less than 6000 assignments and the payoff starts around a tenfold of %D that. But \unknown\ it's less tracing, so that's another benefit. +%D Watch out: we accept that a \[k=v,,k=v] will generate a case where a key can become +%D a comma and trigger a warning but we intercept that elsewhere. The alternative is +%D to skip to the comma first which takes more time. + \let\m_mult_interfaces_namespace\empty \def\mult_interfaces_get_parameters#1[#2% @@ -201,8 +205,11 @@ \mult_interfaces_adef\m_mult_interfaces_namespace{#1}{#2}% \fi} -\def\mult_interfaces_get_parameters_item_error#0#0#0#4#5% - {\mult_interfaces_get_parameters_error_indeed{#4}{#5}} +% \def\mult_interfaces_get_parameters_item_error#0#0#0#4#5% +% {\if,#5\else\mult_interfaces_get_parameters_error_indeed{#4}{#5}\fi} + +\def\mult_interfaces_get_parameters_item_error#-#-#-#1#2% + {\if,#2\else\mult_interfaces_get_parameters_error_indeed{#1}{#2}\fi} \startinterface english @@ -215,18 +222,27 @@ \expandafter\def\csname\m_mult_interfaces_namespace#1\endcsname{#2}% \fi} - \def\mult_interfaces_get_parameters_item_error#0\csname#2#3\endcsname#0% - {\mult_interfaces_get_parameters_error_indeed{#2}{#3}} +% \def\mult_interfaces_get_parameters_item_error#0\csname#2#3\endcsname#0% +% {\if,#3\else\mult_interfaces_get_parameters_error_indeed{#2}{#3}\fi} + + \def\mult_interfaces_get_parameters_item_error#-\csname#1#2\endcsname#-% + {\if,#2\else\mult_interfaces_get_parameters_error_indeed{#1}{#2}\fi} \stopinterface %D Used? -\def\mult_check_for_assignment_indeed#0=#2#0^^^^0004% - {\if#2^^^^0003\assignmentfalse\else\assignmenttrue\fi} +% \def\mult_check_for_assignment_indeed#0=#2#0^^^^0004% +% {\if#2^^^^0003\assignmentfalse\else\assignmenttrue\fi} +% +% \def\mult_check_for_assignment_indeed_begin_#0=#2#0^^^^0004% +% {\if#2^^^^0003} + +\def\mult_check_for_assignment_indeed#-=#1#-^^^^0004% + {\if#1^^^^0003\assignmentfalse\else\assignmenttrue\fi} -\def\mult_check_for_assignment_indeed_begin_#0=#2#0^^^^0004% - {\if#2^^^^0003} +\def\mult_check_for_assignment_indeed_begin_#-=#1#-^^^^0004% + {\if#1^^^^0003} \def\mult_check_for_assignment#1% {\expandafter\mult_check_for_assignment_indeed\detokenize{#1}=^^^^0003^^^^0003^^^^0004} diff --git a/tex/context/base/mkiv/mult-ini.lua b/tex/context/base/mkiv/mult-ini.lua index 0c8581281..3dc425953 100644 --- a/tex/context/base/mkiv/mult-ini.lua +++ b/tex/context/base/mkiv/mult-ini.lua @@ -454,16 +454,18 @@ implement { local function showassignerror(namespace,key,line) - local ns, instance = match(namespace,"^(%d+)[^%a]+(%a*)") - if ns then - namespace = corenamespaces[tonumber(ns)] or ns - end - -- injected in the stream for timing: - if instance and instance ~= "" then - context.writestatus("setup",formatters["error in line %a, namespace %a, instance %a, key %a"](line,namespace,instance,key)) - else - context.writestatus("setup",formatters["error in line %a, namespace %a, key %a"](line,namespace,key)) - end + -- if key and key ~= "" and key ~= "," then + local ns, instance = match(namespace,"^(%d+)[^%a]+(%a*)") + if ns then + namespace = corenamespaces[tonumber(ns)] or ns + end + -- injected in the stream for timing: + if instance and instance ~= "" then + context.writestatus("setup",formatters["error in line %a, namespace %a, instance %a, key %a"](line,namespace,instance,key)) + else + context.writestatus("setup",formatters["error in line %a, namespace %a, key %a"](line,namespace,key)) + end + -- end end implement { diff --git a/tex/context/base/mkiv/mult-low.lua b/tex/context/base/mkiv/mult-low.lua index ec65d6a7c..58202fa1a 100644 --- a/tex/context/base/mkiv/mult-low.lua +++ b/tex/context/base/mkiv/mult-low.lua @@ -57,7 +57,8 @@ return { "spacecatcode", "lettercatcode", "othercatcode", "activecatcode", "commentcatcode", "invalidcatcode", -- "tabasciicode", "newlineasciicode", "formfeedasciicode", "endoflineasciicode", "endoffileasciicode", - "spaceasciicode", "hashasciicode", "dollarasciicode", "commentasciicode", "ampersandasciicode", + "commaasciicode", "spaceasciicode", "periodasciicode", + "hashasciicode", "dollarasciicode", "commentasciicode", "ampersandasciicode", "colonasciicode", "backslashasciicode", "circumflexasciicode", "underscoreasciicode", "leftbraceasciicode", "barasciicode", "rightbraceasciicode", "tildeasciicode", "delasciicode", "leftparentasciicode", "rightparentasciicode", diff --git a/tex/context/base/mkiv/mult-prm.lua b/tex/context/base/mkiv/mult-prm.lua index 91afcf524..e4ff584b4 100644 --- a/tex/context/base/mkiv/mult-prm.lua +++ b/tex/context/base/mkiv/mult-prm.lua @@ -271,8 +271,10 @@ return { "etoksapp", "etokspre", "exceptionpenalty", + "expandafterpars", "expandafterspaces", "expanded", + "expandtoken", "explicitdiscretionary", "explicithyphenpenalty", "firstvalidlanguage", @@ -329,6 +331,7 @@ return { "lastnodesubtype", "leftmarginkern", "letcharcode", + "letdatacode", "letfrozen", "letprotected", "linedirection", diff --git a/tex/context/base/mkiv/pack-rul.mkiv b/tex/context/base/mkiv/pack-rul.mkiv index ba81a0956..393668c60 100644 --- a/tex/context/base/mkiv/pack-rul.mkiv +++ b/tex/context/base/mkiv/pack-rul.mkiv @@ -1900,7 +1900,7 @@ {\iffirstargument \setupcurrentmathframed[#1]% \fi - \c_framed_mstyle\mathstyle + \c_framed_mstyle\normalmathstyle \edef\m_framed_location{\mathframedparameter\c!location}% \ifx\m_framed_location\v!mathematics \let\normalstrut\pack_framed_math_pos diff --git a/tex/context/base/mkiv/pack-rul.mkxl b/tex/context/base/mkiv/pack-rul.mkxl index 4fef06ad0..6268aad3e 100644 --- a/tex/context/base/mkiv/pack-rul.mkxl +++ b/tex/context/base/mkiv/pack-rul.mkxl @@ -1949,7 +1949,7 @@ {\iffirstargument \setupcurrentmathframed[#1]% \fi - \c_framed_mstyle\mathstyle + \c_framed_mstyle\normalmathstyle \edef\m_framed_location{\mathframedparameter\c!location}% \ifx\m_framed_location\v!mathematics \let\normalstrut\pack_framed_math_pos diff --git a/tex/context/base/mkiv/page-bck.mkiv b/tex/context/base/mkiv/page-bck.mkiv index 1ec7cdbb8..1af681049 100644 --- a/tex/context/base/mkiv/page-bck.mkiv +++ b/tex/context/base/mkiv/page-bck.mkiv @@ -269,14 +269,14 @@ \def\page_backgrounds_set_boxes_b {\ifconditional\c_page_backgrounds_new_left % \showmessage\m!layouts8\empty - \page_backgrounds_set_box\leftbackground % \conditionalfalse + \page_backgrounds_set_box\leftbackground \global\setfalse\c_page_backgrounds_new_left \fi} \def\page_backgrounds_set_boxes_c {\ifconditional\c_page_backgrounds_new_right % \showmessage\m!layouts8\empty - \page_backgrounds_set_box\rightbackground % \conditionaltrue + \page_backgrounds_set_box\rightbackground \global\setfalse\c_page_backgrounds_new_right \fi} diff --git a/tex/context/base/mkiv/page-lin.mkvi b/tex/context/base/mkiv/page-lin.mkvi index 6a03d12e4..4debcb68f 100644 --- a/tex/context/base/mkiv/page-lin.mkvi +++ b/tex/context/base/mkiv/page-lin.mkvi @@ -16,6 +16,9 @@ % % to be redone (was experiment) .. can be hooked into margin code % reshuffle arguments +% +% this is early luatex code, 2007 or even before that, and it shows ... we +% have better tricks now \writestatus{loading}{ConTeXt Core Macros / Line Numbering} @@ -348,6 +351,7 @@ \def\page_lines_add_numbers_to_box#box#column#max#nesting% {\bgroup + \strc_tags_enable_indeed \b_page_lines_number #box\relax \c_page_lines_column #column\relax \c_page_lines_last_column#max\relax @@ -459,24 +463,34 @@ % \def\dodollap{\hbox to \zeropoint{\normalhss\box\nextbox}\endgroup} \def\page_line_handle_left#align#width#distance% - {\llap + {\dostarttagged\t!linenumber\empty + \llap {\page_lines_number_inject#align#width% + \dostarttagged\t!ignore\empty \kern\dimexpr #distance+\d_page_lines_distance \ifconditional\c_page_lines_dir_left_to_right\else+\d_page_lines_line_width\fi \relax \the\everylinenumber - \hss}} + \hss + \dostoptagged}% + \dostoptagged} \def\page_line_handle_right#align#width#distance% - {\rlap - {\kern\dimexpr + {\dostarttagged\t!linenumber\empty + \rlap + {\dostarttagged\t!ignore\empty + \kern\dimexpr #distance+\d_page_lines_distance \ifconditional\c_page_lines_dir_left_to_right+\d_page_lines_line_width\fi \relax + \dostoptagged \page_lines_number_inject#align#width% + \dostarttagged\t!ignore\empty \the\everylinenumber - \hss}} + \hss + \dostoptagged}% + \dostoptagged} \setuvalue{\??linenumberinghandler\v!left}% {\page_line_handle_left\p_align\leftmarginwidth\leftmargindistance} diff --git a/tex/context/base/mkiv/status-files.pdf b/tex/context/base/mkiv/status-files.pdf Binary files differindex 3aa2579ce..e57661b9e 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.pdf Binary files differindex 713f812fa..271444c2d 100644 --- a/tex/context/base/mkiv/status-lua.pdf +++ b/tex/context/base/mkiv/status-lua.pdf diff --git a/tex/context/base/mkiv/strc-tag.lua b/tex/context/base/mkiv/strc-tag.lua index 88e0f108d..694f7bdf0 100644 --- a/tex/context/base/mkiv/strc-tag.lua +++ b/tex/context/base/mkiv/strc-tag.lua @@ -104,6 +104,7 @@ local properties = allocate { -- todo: more "record = true" to improve forma lines = { pdf = "Code", nature = "display" }, line = { pdf = "Code", nature = "mixed" }, + linenumber = { pdf = "Span", nature = "inline" }, synonym = { pdf = "Span", nature = "inline" }, sorting = { pdf = "Span", nature = "inline" }, @@ -362,7 +363,9 @@ function tags.start(tag,specification) metadata = nil end local userdata = specification.userdata - if userdata ~= "" and type(userdata) == "string" then + if userdata == "" then + specification.userdata = nil + elseif type(userdata) == "string" then specification.userdata = settings_to_hash(userdata) end local detail = specification.detail diff --git a/tex/context/base/mkiv/strc-tag.mkiv b/tex/context/base/mkiv/strc-tag.mkiv index 83ee03090..ab532f0ef 100644 --- a/tex/context/base/mkiv/strc-tag.mkiv +++ b/tex/context/base/mkiv/strc-tag.mkiv @@ -61,6 +61,7 @@ \def\t!lines {lines} % Code \def\t!line {line} % Code +\def\t!linenumber {linenumber} % Span \def\t!sorting {sorting} % Span \def\t!synonym {synonym} % Span @@ -329,11 +330,8 @@ \chardef\strc_tags_placeholder_char\zerocount % "FFFC -\unexpanded\def\strc_tags_enable - {% once enable one is toast - \global\settrue\c_strc_tags_enabled - % and gets: - \let\dotaggedplaceholder \strc_tags_placeholder_char +\unexpanded\def\strc_tags_enable_indeed + {\let\dotaggedplaceholder \strc_tags_placeholder_char \let\dostarttagged \strc_tags_enabled_start_detail \let\dostarttaggednodetail\strc_tags_enabled_start_no_detail \let\dostarttaggedchained \strc_tags_enabled_start_chained @@ -341,6 +339,12 @@ \let\dostartignoretagging \strc_tags_start_yes_ignore \let\dostopignoretagging \strc_tags_stop_yes_ignore} +\unexpanded\def\strc_tags_enable + {% once enable one is toast + \global\settrue\c_strc_tags_enabled + % and gets: + \strc_tags_enable_indeed} + \unexpanded\def\strc_tags_disable {\ifconditional\c_strc_tags_enabled % so now all are artifacts diff --git a/tex/context/base/mkiv/supp-box.lua b/tex/context/base/mkiv/supp-box.lua index 8c615b528..353562344 100644 --- a/tex/context/base/mkiv/supp-box.lua +++ b/tex/context/base/mkiv/supp-box.lua @@ -28,6 +28,11 @@ local vlist_code = nodecodes.vlist local glue_code = nodecodes.glue local penalty_code = nodecodes.penalty local glyph_code = nodecodes.glyph +local localpar_code = nodecodes.localpar + +local indent_code = nodes.listcodes.indent + +local hmode_code = tex.modelevels.horizontal local nuts = nodes.nuts local tonut = nuts.tonut @@ -39,6 +44,7 @@ local getprev = nuts.getprev local getboth = nuts.getboth local getdisc = nuts.getdisc local getid = nuts.getid +local getsubtype = nuts.getsubtype local getlist = nuts.getlist local getattribute = nuts.getattribute local getbox = nuts.getbox @@ -89,6 +95,7 @@ local setlistcolor = nodes.tracers.colors.setlist local texget = tex.get local texgetbox = tex.getbox local texsetdimen = tex.setdimen +local texgetnest = tex.getnest local function hyphenatedlist(head,usecolor) local current = head and tonut(head) @@ -828,24 +835,50 @@ implement { if CONTEXTLMTXMODE > 0 then - interfaces.implement { name = "widthuptohere", public = true, protected = true, value = true, actions = function() - local n = tex.getnest() + local n = texgetnest() local w = 0 - if n.mode == tex.modelevels.horizontal then - local h = nodes.hpack(n.head.next) - w = h.width - h.list = nil - nodes.free(h) + if n.mode == hmode_code then + local h = hpack(getnext(tonut(n.head))) + w = getwidth(h) + setlist(h) + free(h) end return tokens.values.dimension, w end, } - end + +interfaces.implement { + name = "doifelseindented", + public = true, + protected = true, + actions = function() + local n = texgetnest() + local b = false + if n.mode == hmode_code then + n = tonut(n.head) + while n do + n = getnext(n) + if n then + local id = getid(n) + if id == hlist_code then + if getsubtype(n) == indent_code then + b = getwidth(n) > 0 + break + end + elseif id ~= localpar_code then + break + end + end + end + end + commands.doifelse(b) + end, +} diff --git a/tex/context/base/mkiv/supp-box.mkiv b/tex/context/base/mkiv/supp-box.mkiv index 74a3462dd..35b400b09 100644 --- a/tex/context/base/mkiv/supp-box.mkiv +++ b/tex/context/base/mkiv/supp-box.mkiv @@ -220,7 +220,7 @@ \newcount\c_boxes_math_style \unexpanded\def\syst_boxes_math_set_nextbox#1% - {\c_boxes_math_style\mathstyle + {\c_boxes_math_style\normalmathstyle \setbox\nextbox\hbox{\normalstartimath\mathsurround\zeropoint\triggermathstyle\c_boxes_math_style{#1}\normalstopimath}} %D \macros diff --git a/tex/context/base/mkiv/supp-box.mkxl b/tex/context/base/mkiv/supp-box.mkxl index af1030f2f..bb3c71aaa 100644 --- a/tex/context/base/mkiv/supp-box.mkxl +++ b/tex/context/base/mkiv/supp-box.mkxl @@ -189,7 +189,7 @@ \newcount\c_boxes_math_style \unexpanded\def\syst_boxes_math_set_nextbox#1% - {\c_boxes_math_style\mathstyle + {\c_boxes_math_style\normalmathstyle \setbox\nextbox\hbox{\normalstartimath\mathsurround\zeropoint\triggermathstyle\c_boxes_math_style{#1}\normalstopimath}} %D \macros diff --git a/tex/context/base/mkiv/syst-aux.mkxl b/tex/context/base/mkiv/syst-aux.mkxl index c92201aa2..d78a7b307 100644 --- a/tex/context/base/mkiv/syst-aux.mkxl +++ b/tex/context/base/mkiv/syst-aux.mkxl @@ -201,21 +201,37 @@ %D is more efficient but it probably won't be noticed. It's anyway cheaper on memory %D access. -\def\gobbleoneargument #0{} -\def\gobbletwoarguments #0#0{} -\def\gobblethreearguments #0#0#0{} -\def\gobblefourarguments #0#0#0#0{} -\def\gobblefivearguments #0#0#0#0{} -\def\gobblesixarguments #0#0#0#0{} -\def\gobblesevenarguments #0#0#0#0#0{} -\def\gobbleeightarguments #0#0#0#0#0#0{} -\def\gobbleninearguments #0#0#0#0#0#0#0{} - -\def\gobbleoneoptional [#0]{} -\def\gobbletwooptionals [#0][#0]{} -\def\gobblethreeoptionals[#0][#0][#0]{} -\def\gobblefouroptionals [#0][#0][#0][#0]{} -\def\gobblefiveoptionals [#0][#0][#0][#0][#0]{} +% \def\gobbleoneargument #0{} +% \def\gobbletwoarguments #0#0{} +% \def\gobblethreearguments #0#0#0{} +% \def\gobblefourarguments #0#0#0#0{} +% \def\gobblefivearguments #0#0#0#0{} +% \def\gobblesixarguments #0#0#0#0{} +% \def\gobblesevenarguments #0#0#0#0#0{} +% \def\gobbleeightarguments #0#0#0#0#0#0{} +% \def\gobbleninearguments #0#0#0#0#0#0#0{} +% +% \def\gobbleoneoptional [#0]{} +% \def\gobbletwooptionals [#0][#0]{} +% \def\gobblethreeoptionals[#0][#0][#0]{} +% \def\gobblefouroptionals [#0][#0][#0][#0]{} +% \def\gobblefiveoptionals [#0][#0][#0][#0][#0]{} + +\def\gobbleoneargument #-{} +\def\gobbletwoarguments #-#-{} +\def\gobblethreearguments #-#-#-{} +\def\gobblefourarguments #-#-#-#-{} +\def\gobblefivearguments #-#-#-#-{} +\def\gobblesixarguments #-#-#-#-{} +\def\gobblesevenarguments #-#-#-#-#-{} +\def\gobbleeightarguments #-#-#-#-#-#-{} +\def\gobbleninearguments #-#-#-#-#-#-#-{} + +\def\gobbleoneoptional [#-]{} +\def\gobbletwooptionals [#-][#-]{} +\def\gobblethreeoptionals[#-][#-][#-]{} +\def\gobblefouroptionals [#-][#-][#-][#-]{} +\def\gobblefiveoptionals [#-][#-][#-][#-][#-]{} %D Reserved macros for tests: @@ -621,31 +637,65 @@ %D These are normally only used for keywords, i.e.\ strings so we can delegate %D the work to \LUA: -% \unexpanded\def\doifelseinset#1#2{\clf_doifelseinset{#1}{#2}} -% \unexpanded\def\doifinset #1#2{\clf_doifinset {#1}{#2}} -% \unexpanded\def\doifnotinset #1#2{\clf_doifnotinset {#1}{#2}} +\unexpanded\def\doifelseinset#1#2{\clf_doifelseinset{#1}{#2}} +\unexpanded\def\doifinset #1#2{\clf_doifinset {#1}{#2}} +\unexpanded\def\doifnotinset #1#2{\clf_doifnotinset {#1}{#2}} % % \let\firstinset \clf_firstinset -\unexpanded\def\doifelseinset#1#2% - {\ifhasxtoks{,#1,}{,#2,}% - \expandafter\firstoftwoarguments - \else - \expandafter\secondoftwoarguments - \fi} +% These don't accept spaces after commas: +% +% \unexpanded\def\doifelseinset#1#2% +% {\ifhasxtoks{,#1,}{,#2,}% +% \expandafter\firstoftwoarguments +% \else +% \expandafter\secondoftwoarguments +% \fi} -\unexpanded\def\doifinset#1#2% - {\ifhasxtoks{,#1,}{,#2,}% - \expandafter\firstofoneargument - \else - \expandafter\gobbleoneargument - \fi} +% \unexpanded\def\doifinset#1#2% +% {\ifhasxtoks{,#1,}{,#2,}% +% \expandafter\firstofoneargument +% \else +% \expandafter\gobbleoneargument +% \fi} -\unexpanded\def\doifnotinset#1#2% - {\ifhasxtoks{,#1,}{,#2,}% - \expandafter\gobbleoneargument - \else - \expandafter\firstofoneargument - \fi} +% \unexpanded\def\doifnotinset#1#2% +% {\ifhasxtoks{,#1,}{,#2,}% +% \expandafter\gobbleoneargument +% \else +% \expandafter\firstofoneargument +% \fi} + +% But these do: + +\edef\a!comma{\expandtoken \ignorecatcode \commaasciicode} +\edef\a!space{\expandtoken \ignorecatcode \spaceasciicode} + +\normalexpanded { + + \unexpanded \def \noexpand \doifelseinset#1#2% + {\noexpand\ifhasxtoks{,\a!space#1,}{,#2,}% + \noexpand\expandafter\noexpand\firstoftwoarguments + \noexpand\else + \noexpand\expandafter\noexpand\secondoftwoarguments + \noexpand\fi} + + \unexpanded \def \noexpand \doifinset#1#2% + {\noexpand\ifhasxtoks{,\a!space#1,}{,#2,}% + \noexpand\expandafter\noexpand\firstofoneargument + \noexpand\else + \noexpand\expandafter\noexpand\gobbleoneargument + \noexpand\fi} + + \unexpanded \def \noexpand \doifnotinset#1#2% + {\noexpand\ifhasxtoks{,\a!space#1,}{,#2,}% + \noexpand\expandafter\noexpand\gobbleoneargument + \noexpand\else + \noexpand\expandafter\noexpand\firstofoneargument + \noexpand\fi} + +} + +%D Done. \let\doifinsetelse\doifelseinset @@ -769,10 +819,15 @@ \normalexpanded{\noexpand\expandafterspaces\syst_helpers_process_comma_item#1,}\ignorearguments\ignorearguments\ignorearguments \popmacro\commalistcommand} +% \let\syst_helpers_process_comma_item_next_a \syst_helpers_process_comma_item_next +% \def\syst_helpers_process_comma_item_next_b#0\ignorearguments{\let\syst_helpers_process_comma_item_next\syst_helpers_process_comma_item_next_a} +% \def\syst_helpers_process_comma_item_next_c#0\ignorearguments{\let\syst_helpers_process_comma_item_next\syst_helpers_process_comma_item_next_b} +% \def\syst_helpers_process_comma_item_gobble#0\ignorearguments{} + \let\syst_helpers_process_comma_item_next_a \syst_helpers_process_comma_item_next -\def\syst_helpers_process_comma_item_next_b#0\ignorearguments{\let\syst_helpers_process_comma_item_next\syst_helpers_process_comma_item_next_a} -\def\syst_helpers_process_comma_item_next_c#0\ignorearguments{\let\syst_helpers_process_comma_item_next\syst_helpers_process_comma_item_next_b} -\def\syst_helpers_process_comma_item_gobble#0\ignorearguments{} +\def\syst_helpers_process_comma_item_next_b#-\ignorearguments{\let\syst_helpers_process_comma_item_next\syst_helpers_process_comma_item_next_a} +\def\syst_helpers_process_comma_item_next_c#-\ignorearguments{\let\syst_helpers_process_comma_item_next\syst_helpers_process_comma_item_next_b} +\def\syst_helpers_process_comma_item_gobble#-\ignorearguments{} \unexpanded\def\quitcommalist {\let\syst_helpers_process_comma_item_next\syst_helpers_process_comma_item_next_b} \unexpanded\def\quitprevcommalist{\let\syst_helpers_process_comma_item_next\syst_helpers_process_comma_item_next_c} @@ -1298,7 +1353,10 @@ \fi \fi} -\def\syst_helpers_raw_process_action_gobble#0\ignorearguments +% \def\syst_helpers_raw_process_action_gobble#0\ignorearguments +% {} + +\def\syst_helpers_raw_process_action_gobble#-\ignorearguments {} \def\syst_helpers_raw_process_action_next @@ -1483,10 +1541,16 @@ \def\syst_helpers_grab_parameter_next {\expandafterspaces\syst_helpers_grab_parameter} -\unexpanded\def\dogetparameters#1[#2]#0[#4]% +% \unexpanded\def\dogetparameters#1[#2]#0[#4]% +% {\def\m_syst_parameter_n{#2}% +% \let\m_syst_parameter_s#1% +% \expandafterspaces\syst_helpers_grab_parameter#4\ignorearguments\ignorearguments} + +\unexpanded\def\dogetparameters#1[#2]#-[#3]% {\def\m_syst_parameter_n{#2}% \let\m_syst_parameter_s#1% - \expandafterspaces\syst_helpers_grab_parameter#4\ignorearguments\ignorearguments} + \expandafterspaces\syst_helpers_grab_parameter#3\ignorearguments\ignorearguments} + %D \macros %D {getemptyparameters} @@ -1634,7 +1698,7 @@ \def\commalistsize{0} -\def\syst_helpers_get_comma_list_size#0,% +\def\syst_helpers_get_comma_list_size#0,% no #- as we need to count {\ifarguments\or \advance\commalistcounter\plusone \expandafter\syst_helpers_get_comma_list_size @@ -1665,7 +1729,9 @@ %D Filters: -\def\syst_helpers_gobble_comma_list#0\ignorearguments{} +% \def\syst_helpers_gobble_comma_list#0\ignorearguments{} + +\def\syst_helpers_gobble_comma_list#-\ignorearguments{} \def\syst_helpers_get_from_comma_list#1,% {\ifarguments \or @@ -2505,32 +2571,59 @@ % \def\fifthofsixarguments #1#2#3#4#5#6{#5} % \def\sixthofsixarguments #1#2#3#4#5#6{#6} +% \def\firstofoneargument #1{#1} +% +% \def\firstoftwoarguments #1#0{#1} +% \def\secondoftwoarguments #0#2{#2} +% +% \def\firstofthreearguments #1#0#0{#1} +% \def\secondofthreearguments #0#2#0{#2} +% \def\thirdofthreearguments #0#0#3{#3} +% +% \def\firstoffourarguments #1#0#0#0{#1} +% \def\secondoffourarguments #0#2#0#0{#2} +% \def\thirdoffourarguments #0#0#3#0{#3} +% \def\fourthoffourarguments #0#0#0#4{#4} +% +% \def\firstoffivearguments #1#0#0#0#0{#1} +% \def\secondoffivearguments #0#2#0#0#0{#2} +% \def\thirdoffivearguments #0#0#3#0#0{#3} +% \def\fourthoffivearguments #0#0#0#4#0{#4} +% \def\fifthoffivearguments #0#0#0#0#5{#5} +% +% \def\firstofsixarguments #1#0#0#0#0#0{#1} +% \def\secondofsixarguments#0#2#0#0#0#0{#2} +% \def\thirdofsixarguments #0#0#3#0#0#0{#3} +% \def\fourthofsixarguments#0#0#0#4#0#0{#4} +% \def\fifthofsixarguments #0#0#0#0#5#0{#5} +% \def\sixthofsixarguments #0#0#0#0#0#6{#6} + \def\firstofoneargument #1{#1} -\def\firstoftwoarguments #1#0{#1} -\def\secondoftwoarguments #0#2{#2} +\def\firstoftwoarguments #1#-{#1} +\def\secondoftwoarguments #-#1{#1} -\def\firstofthreearguments #1#0#0{#1} -\def\secondofthreearguments #0#2#0{#2} -\def\thirdofthreearguments #0#0#3{#3} +\def\firstofthreearguments #1#-#-{#1} +\def\secondofthreearguments #-#1#-{#1} +\def\thirdofthreearguments #-#-#1{#1} -\def\firstoffourarguments #1#0#0#0{#1} -\def\secondoffourarguments #0#2#0#0{#2} -\def\thirdoffourarguments #0#0#3#0{#3} -\def\fourthoffourarguments #0#0#0#4{#4} +\def\firstoffourarguments #1#-#-#-{#1} +\def\secondoffourarguments #-#1#-#-{#1} +\def\thirdoffourarguments #-#-#1#-{#1} +\def\fourthoffourarguments #-#-#-#1{#1} -\def\firstoffivearguments #1#0#0#0#0{#1} -\def\secondoffivearguments #0#2#0#0#0{#2} -\def\thirdoffivearguments #0#0#3#0#0{#3} -\def\fourthoffivearguments #0#0#0#4#0{#4} -\def\fifthoffivearguments #0#0#0#0#5{#5} +\def\firstoffivearguments #1#-#-#-#-{#1} +\def\secondoffivearguments #-#1#-#-#-{#1} +\def\thirdoffivearguments #-#-#1#-#-{#1} +\def\fourthoffivearguments #-#-#-#1#-{#1} +\def\fifthoffivearguments #-#-#-#-#1{#1} -\def\firstofsixarguments #1#0#0#0#0#0{#1} -\def\secondofsixarguments#0#2#0#0#0#0{#2} -\def\thirdofsixarguments #0#0#3#0#0#0{#3} -\def\fourthofsixarguments#0#0#0#4#0#0{#4} -\def\fifthofsixarguments #0#0#0#0#5#0{#5} -\def\sixthofsixarguments #0#0#0#0#0#6{#6} +\def\firstofsixarguments #1#-#-#-#-#-{#1} +\def\secondofsixarguments#-#1#-#-#-#-{#1} +\def\thirdofsixarguments #-#-#1#-#-#-{#1} +\def\fourthofsixarguments#-#-#-#1#-#-{#1} +\def\fifthofsixarguments #-#-#-#-#1#-{#1} +\def\sixthofsixarguments #-#-#-#-#-#1{#1} % \unexpanded\def\firstofoneunexpanded #1{#1} % @@ -2541,14 +2634,23 @@ % \unexpanded\def\secondofthreeunexpanded#1#2#3{#2} % \unexpanded\def\thirdofthreeunexpanded #1#2#3{#3} +% \unexpanded\def\firstofoneunexpanded #1{#1} +% +% \unexpanded\def\firstoftwounexpanded #1#0{#1} +% \unexpanded\def\secondoftwounexpanded #0#2{#2} +% +% \unexpanded\def\firstofthreeunexpanded #1#0#0{#1} +% \unexpanded\def\secondofthreeunexpanded#0#2#0{#2} +% \unexpanded\def\thirdofthreeunexpanded #0#0#3{#3} + \unexpanded\def\firstofoneunexpanded #1{#1} -\unexpanded\def\firstoftwounexpanded #1#0{#1} -\unexpanded\def\secondoftwounexpanded #0#2{#2} +\unexpanded\def\firstoftwounexpanded #1#-{#1} +\unexpanded\def\secondoftwounexpanded #-#1{#1} -\unexpanded\def\firstofthreeunexpanded #1#0#0{#1} -\unexpanded\def\secondofthreeunexpanded#0#2#0{#2} -\unexpanded\def\thirdofthreeunexpanded #0#0#3{#3} +\unexpanded\def\firstofthreeunexpanded #1#-#-{#1} +\unexpanded\def\secondofthreeunexpanded#-#1#-{#1} +\unexpanded\def\thirdofthreeunexpanded #-#-#1{#1} %D \macros %D {globalletempty,letempty, @@ -2643,10 +2745,15 @@ \def\syst_helpers_grab_raw_parameter_next {\expandafterspaces\syst_helpers_grab_raw_parameter} -\unexpanded\def\rawgetparameters#1[#2]#0[#4]% +% \unexpanded\def\rawgetparameters#1[#2]#0[#4]% +% {\def\m_syst_parameter_n{#2}% +% %\expandafterspaces\syst_helpers_grab_raw_parameter#4\ignorearguments\ignorearguments} +% \expandafter\expandafterspaces\expandafter\syst_helpers_grab_raw_parameter#4\ignorearguments\ignorearguments} + +\unexpanded\def\rawgetparameters#1[#2]#-[#3]% {\def\m_syst_parameter_n{#2}% - %\expandafterspaces\syst_helpers_grab_raw_parameter#4\ignorearguments\ignorearguments} - \expandafter\expandafterspaces\expandafter\syst_helpers_grab_raw_parameter#4\ignorearguments\ignorearguments} + %\expandafterspaces\syst_helpers_grab_raw_parameter#3\ignorearguments\ignorearguments} + \expandafter\expandafterspaces\expandafter\syst_helpers_grab_raw_parameter#3\ignorearguments\ignorearguments} %D \macros %D {doglobal, @@ -3082,10 +3189,7 @@ \globalpushmacro\recurseaction \unexpanded\gdef\recurseaction##1##2{#1}% \let\endofloop\syst_helpers_loop - \syst_helpers_loop1% no \plusone else \recurselevel wrong - \globalpopmacro\recurselevel - \globalpopmacro\recurseaction - \global\advance\outerrecurse\minusone} + \syst_helpers_loop1}% no \plusone else \recurselevel wrong \unexpanded\def\syst_helpers_loop#1% {\def\recurselevel{#1}% @@ -3095,13 +3199,16 @@ {\syst_helpers_recurse_content \endofloop} -\unexpanded\def\syst_helpers_loop_nop#1% - {} +\unexpanded\def\syst_helpers_loop_nop#0% + {\let\endofloop\syst_helpers_loop + \globalpopmacro\recurselevel + \globalpopmacro\recurseaction + \global\advance\outerrecurse\minusone} \unexpanded\def\exitloop % \exitloop quits at end {\let\endofloop\syst_helpers_loop_nop} -\unexpanded\def\exitloopnow#1\endofloop % \exitloopnow quits directly +\unexpanded\def\exitloopnow#0\endofloop % \exitloopnow quits directly {\syst_helpers_loop_nop} %D The loop is executed at least once, so beware of situations like: @@ -3689,9 +3796,9 @@ % {} \unexpanded\def\gobbleuntil#1% - {\def\syst_helpers_gobble_indeed##0#1{}\syst_helpers_gobble_indeed} + {\def\syst_helpers_gobble_indeed##-#1{}\syst_helpers_gobble_indeed} -\unexpanded\def\gobbleuntilrelax#0\relax +\unexpanded\def\gobbleuntilrelax#-\relax {} %D The next one simply expands the pickup up tokens. @@ -4316,7 +4423,7 @@ \let\syst_helpers_split_string\relax \unexpanded\def\beforesplitstring#1\at#2\to#3% - {\def\syst_helpers_split_string##1#2##0^^^^0004% + {\def\syst_helpers_split_string##1#2##0^^^^0004% no #- as we need to count {\ifarguments \let#3\empty \or @@ -4327,7 +4434,7 @@ \expandafter\syst_helpers_split_string#1^^^^0004\ignorearguments\ignorearguments} \unexpanded\def\aftersplitstring#1\at#2\to#3% - {\def\syst_helpers_split_string##0#2##2^^^^0004% + {\def\syst_helpers_split_string##0#2##2^^^^0004% no #- as we need to count {\ifarguments \let#3\empty \or @@ -4387,7 +4494,7 @@ \let\beforetestandsplitstring\beforesplitstring \unexpanded\def\aftertestandsplitstring#1\at#2\to#3% - {\def\syst_helpers_split_string##0#2##2^^^^0004% + {\def\syst_helpers_split_string##0#2##2^^^^0004% no #- as we need to count {\ifarguments \let#3\empty \or @@ -4418,11 +4525,17 @@ %D splitatcolon, %D splitatcolons} -\unexpanded\def\syst_helpers_splitatperiod #1.#2.#0^^^^0004#4#5{\def #4{#1}\def #5{#2}} -\unexpanded\def\syst_helpers_splitatcomma #1,#2,#0^^^^0004#4#5{\def #4{#1}\def #5{#2}} -\unexpanded\def\syst_helpers_splitatasterisk #1*#2*#0^^^^0004#4#5{\def #4{#1}\def #5{#2}} -\unexpanded\def\syst_helpers_splitatcolon #1:#2:#0^^^^0004#4#5{\def #4{#1}\def #5{#2}} -\unexpanded\def\syst_helpers_splitatcolons #1::#2::#0^^^^0004#4#5{\edef#4{#1}\edef#5{#2}} +% \unexpanded\def\syst_helpers_splitatperiod #1.#2.#0^^^^0004#4#5{\def #4{#1}\def #5{#2}} +% \unexpanded\def\syst_helpers_splitatcomma #1,#2,#0^^^^0004#4#5{\def #4{#1}\def #5{#2}} +% \unexpanded\def\syst_helpers_splitatasterisk #1*#2*#0^^^^0004#4#5{\def #4{#1}\def #5{#2}} +% \unexpanded\def\syst_helpers_splitatcolon #1:#2:#0^^^^0004#4#5{\def #4{#1}\def #5{#2}} +% \unexpanded\def\syst_helpers_splitatcolons #1::#2::#0^^^^0004#4#5{\edef#4{#1}\edef#5{#2}} + +\unexpanded\def\syst_helpers_splitatperiod #1.#2.#-^^^^0004#3#4{\def #3{#1}\def #4{#2}} +\unexpanded\def\syst_helpers_splitatcomma #1,#2,#-^^^^0004#3#4{\def #3{#1}\def #4{#2}} +\unexpanded\def\syst_helpers_splitatasterisk #1*#2*#-^^^^0004#3#4{\def #3{#1}\def #4{#2}} +\unexpanded\def\syst_helpers_splitatcolon #1:#2:#-^^^^0004#3#4{\def #3{#1}\def #4{#2}} +\unexpanded\def\syst_helpers_splitatcolons #1::#2::#-^^^^0004#3#4{\edef#3{#1}\edef#4{#2}} \unexpanded\def\splitatperiod #1{\normalexpanded{\syst_helpers_splitatperiod #1}..^^^^0004} \unexpanded\def\splitatcomma #1{\normalexpanded{\syst_helpers_splitatcomma #1},,^^^^0004} % not at ", " @@ -4528,14 +4641,16 @@ {\dodoglobal\edef#2{#1\ifempty#2\else,#2\fi}}} \unexpanded\def\xsplitstring#1#2% \cs {str} - {\def\syst_helpers_split_string##1,#2,##2,#2,##3\\% + %{\def\syst_helpers_split_string##1,#2,##2,#2,##3\\% + {\def\syst_helpers_split_string##1,#2,##2,#2,##-\\% {\edef\m_syst_string_one{\bcleanedupcommalist##1\empty\empty\relax}% \edef\m_syst_string_two{\acleanedupcommalist##2,,\relax}}% \expandafter\syst_helpers_split_string\expandafter,#1,,#2,,#2,\\} \def\bcleanedupcommalist#1#2#3\relax{\if#1,\else#1\fi\if#2,\else#2\fi#3} \def\bcleanedupcommalist#1#2\relax{\if#1,\else#1\fi#2} -\def\acleanedupcommalist#1,,#2\relax{#1} +%def\acleanedupcommalist#1,,#2\relax{#1} +\def\acleanedupcommalist#1,,#-\relax{#1} \unexpanded\def\removefromcommalist#1#2% to be sped up {\rawdoifelseinset{#1}#2% @@ -4694,8 +4809,7 @@ % \def\PtToCm#1% % {\withoutpt\the\dimexpr0.0351459804\dimexpr#1\relax\relax cm} -\def\PtToCm#1% - {\thewithoutunit\dimexpr0.0351459804\dimexpr#1\relax\relax cm} +\def\PtToCm#1{\thewithoutunit\dimexpr0.0351459804\dimexpr#1\relax\relax cm} %D We also support: %D @@ -5228,9 +5342,16 @@ %D This command can be integrated in \type {\getparameters}, but we decided best not %D to do so. +% \unexpanded\def\processassignlist#1[#2]#3% +% {\def\syst_helpers_process_assign_list_assign[##1=##2=##3]% +% {\doif{##3}\relax{#3{##1}}}% +% \def\syst_helpers_process_assign_list_step##1% +% {\syst_helpers_process_assign_list_assign[##1==\relax]}% +% \processcommalist[#2]\syst_helpers_process_assign_list_step} + \unexpanded\def\processassignlist#1[#2]#3% - {\def\syst_helpers_process_assign_list_assign[##1=##2=##3]% - {\doif{##3}\relax{#3{##1}}}% + {\def\syst_helpers_process_assign_list_assign[##1=##-=##2]% + {\doif{##2}\relax{#3{##1}}}% \def\syst_helpers_process_assign_list_step##1% {\syst_helpers_process_assign_list_assign[##1==\relax]}% \processcommalist[#2]\syst_helpers_process_assign_list_step} @@ -6293,7 +6414,10 @@ \def\docheckedpair#1% {\syst_helpers_checked_pair#1,,\_o_e_p_} -\def\syst_helpers_checked_pair#1,#2,#0\_o_e_p_ +% \def\syst_helpers_checked_pair#1,#2,#0\_o_e_p_ +% {#1,#2} + +\def\syst_helpers_checked_pair#1,#2,#-\_o_e_p_ {#1,#2} %D Here are some nasty helpers. They can be used to fill often expanded token diff --git a/tex/context/base/mkiv/syst-ini.mkiv b/tex/context/base/mkiv/syst-ini.mkiv index 3e71e0893..1de243a6d 100644 --- a/tex/context/base/mkiv/syst-ini.mkiv +++ b/tex/context/base/mkiv/syst-ini.mkiv @@ -58,7 +58,9 @@ \chardef\primeasciicode 39 % ' \chardef\leftparentasciicode 40 \chardef\rightparentasciicode 41 +\chardef\commaasciicode 44 \chardef\hyphenasciicode 45 +\chardef\periodasciicode 46 \chardef\forwardslashasciicode 47 % / \chardef\colonasciicode 58 \chardef\lessthanasciicode 60 % < used as alternative verbatim { diff --git a/tex/context/base/mkiv/syst-ini.mkxl b/tex/context/base/mkiv/syst-ini.mkxl index 09ab93d58..a4c355bba 100644 --- a/tex/context/base/mkiv/syst-ini.mkxl +++ b/tex/context/base/mkiv/syst-ini.mkxl @@ -58,7 +58,9 @@ \chardef\primeasciicode 39 % ' \chardef\leftparentasciicode 40 \chardef\rightparentasciicode 41 +\chardef\commaasciicode 44 \chardef\hyphenasciicode 45 +\chardef\periodasciicode 46 \chardef\forwardslashasciicode 47 % / \chardef\colonasciicode 58 \chardef\lessthanasciicode 60 % < used as alternative verbatim { diff --git a/tex/context/base/mkiv/toks-ini.lua b/tex/context/base/mkiv/toks-ini.lua index f38cf915f..da5affa63 100644 --- a/tex/context/base/mkiv/toks-ini.lua +++ b/tex/context/base/mkiv/toks-ini.lua @@ -67,7 +67,7 @@ local scan_luainteger = token.scan_luainteger or scan_int -- only lmtx local scan_luacardinal = token.scan_luacardinal or scan_int -- only lmtx local get_next = token.get_next -local get_next_token = token.get_next_token +----- get_next_token = token.get_next_token local skip_next = token.skip_next local peek_next_char = token.peek_next_char local is_next_char = token.is_next_char @@ -90,6 +90,9 @@ tokens.istoken = is_token tokens.isdefined = is_defined tokens.defined = is_defined +tokens.getdata = token.get_data -- only lmtx +tokens.setdata = token.set_data -- only lmtx + local bits = { escape = 0x00000001, -- 2^00 begingroup = 0x00000002, -- 2^01 @@ -278,6 +281,7 @@ if setinspector then frozen = t.frozen, mode = t.mode, index = t.index, + user = t.user, cmdname = cmdname, } end @@ -298,3 +302,18 @@ tokens.cache = table.setmetatableindex(function(t,k) t[k] = v return v end) + +if LUATEXVERSION < 114 and CONTEXTLMTXMODE == 0 then + + local d = tokens.defined + local c = tokens.create + + function tokens.defined(s,b) + if b then + return d(s) + else + return c(s).cmd_name == "undefined_cmd" + end + end + +end diff --git a/tex/context/base/mkiv/type-ini.mklx b/tex/context/base/mkiv/type-ini.mklx index b4eee64d8..c710fbec5 100644 --- a/tex/context/base/mkiv/type-ini.mklx +++ b/tex/context/base/mkiv/type-ini.mklx @@ -277,7 +277,7 @@ \expandafter\font_typescripts_start_gobble \fi} -\def\font_typescripts_start_gobble#definitions\stoptypescript{} +\def\font_typescripts_start_gobble#ignore\stoptypescript{} \def\font_typescripts_start_document#definitions\stoptypescript {\toksapp\c_font_typescripts_document{\starttypescript#definitions\stoptypescript}} |