From 0c75a2acf592eb4360685375904440f5e6b8125a Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Tue, 12 Nov 2019 19:54:50 +0100 Subject: 2019-11-12 18:53:00 --- tex/context/base/mkiv/anch-pos.lua | 44 ++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 6 deletions(-) (limited to 'tex/context/base/mkiv/anch-pos.lua') diff --git a/tex/context/base/mkiv/anch-pos.lua b/tex/context/base/mkiv/anch-pos.lua index 629e4f73f..e87409dbe 100644 --- a/tex/context/base/mkiv/anch-pos.lua +++ b/tex/context/base/mkiv/anch-pos.lua @@ -130,8 +130,9 @@ local splitter = lpeg.splitat(":",true) local function initializer() tobesaved = jobpositions.tobesaved collected = jobpositions.collected - local pagedata = { } - local freedata = setmetatableindex("table") + local pagedata = { } + local columndata = setmetatableindex("table") + local freedata = setmetatableindex("table") for tag, data in next, collected do local prefix, rest = lpegmatch(splitter,tag) if prefix == "p" then @@ -143,6 +144,8 @@ local function initializer() nofspecial = nofspecial + 1 local t = freedata[data.p or 0] t[#t+1] = data + elseif prefix == "columnarea" then + columndata[data.p or 0][data.c or 0] = data end setmetatable(data,default) end @@ -171,9 +174,10 @@ local function initializer() end end end - jobpositions.page = pagedata - jobpositions.free = freedata - jobpositions.used = next(collected) + jobpositions.page = pagedata + jobpositions.column = columndata + jobpositions.free = freedata + jobpositions.used = next(collected) end -- -- we can gain a little when we group positions but then we still have to @@ -342,6 +346,8 @@ function jobpositions.getrpos() return getrpos() end function jobpositions.gethpos() return gethpos() end function jobpositions.getvpos() return getvpos() end +-------- jobpositions.getcolumn() return column end + jobpositions.registerhandlers() local function setall(name,p,x,y,w,h,d,extra) @@ -554,7 +560,7 @@ jobpositions.e_region = e_region local lastregion -local function setregionbox(n,tag,k,lo,ro,to,bo) -- kind +local function setregionbox(n,tag,k,lo,ro,to,bo,column) -- kind if not tag or tag == "" then nofregions = nofregions + 1 tag = f_region(nofregions) @@ -573,6 +579,7 @@ local function setregionbox(n,tag,k,lo,ro,to,bo) -- kind ro = ro ~= 0 and ro or nil, to = to ~= 0 and to or nil, bo = bo ~= 0 and bo or nil, + c = column or nil, } lastregion = tag return tag, box @@ -1038,8 +1045,24 @@ local function onsamepage(list,page) return page end +local function columnofpos(realpage,xposition) + local p = job.positions.column[realpage] + if p then + for i=1,#p do + local c = p[i] + local x = c.x or 0 + local w = c.w or 0 + if xposition >= x and xposition <= (x + w) then + return i + end + end + end + return 1 +end + jobpositions.overlapping = overlapping jobpositions.onsamepage = onsamepage +jobpositions.columnofpos = columnofpos -- interface @@ -1395,6 +1418,10 @@ scanners.doifelsepositionsonthispage = function() -- list doifelse(onsamepage(scanstring(),tostring(texgetcount("realpageno")))) end +-- scanners.columnofpos = function() +-- context(columnofpos(scaninteger(),scandimen()) +-- end + scanners.doifelsepositionsused = function() doifelse(next(collected)) end @@ -1411,6 +1438,11 @@ scanners.markregionboxtagged = function() -- box tag markregionbox(scaninteger(),scanstring()) end +scanners.markregionboxtaggedn = function() -- box tag n + markregionbox(scaninteger(),scanstring(),nil, + nil,nil,nil,nil,nil,scaninteger()) +end + scanners.setregionboxtagged = function() -- box tag setregionbox(scaninteger(),scanstring()) end -- cgit v1.2.3