From 6db11f114036fc2a18af3e265a9f8e980ad2b594 Mon Sep 17 00:00:00 2001 From: Marius Date: Tue, 12 Oct 2010 10:33:50 +0300 Subject: beta 2010.10.12 01:03 --- tex/context/base/cont-new.mkiv | 2 - tex/context/base/cont-new.tex | 2 +- tex/context/base/context.tex | 2 +- tex/context/base/lpdf-ano.lua | 71 +++++++----------- tex/context/base/lpdf-wid.lua | 2 +- tex/context/base/mult-cld.lua | 65 +++++++++------- tex/context/base/mult-sys.tex | 6 ++ tex/context/base/node-ref.lua | 5 +- tex/context/base/page-flt.lua | 51 +++++++++++-- tex/context/base/page-flt.mkiv | 61 +++++++++++---- tex/context/base/page-mul.mkiv | 14 ++-- tex/context/base/page-one.mkiv | 14 ++-- tex/context/base/page-set.mkiv | 8 +- tex/context/base/sort-ini.lua | 2 +- tex/context/base/strc-flt.mkii | 2 +- tex/context/base/strc-flt.mkiv | 74 ++++++++++--------- tex/context/base/strc-num.lua | 8 +- tex/context/base/strc-ref.lua | 110 +++++++++++++++++++++------- tex/context/base/strc-reg.lua | 10 ++- tex/context/base/strc-reg.mkiv | 1 + tex/context/base/syst-lua.mkiv | 5 ++ tex/generic/context/luatex-fonts-merged.lua | 2 +- 22 files changed, 333 insertions(+), 184 deletions(-) diff --git a/tex/context/base/cont-new.mkiv b/tex/context/base/cont-new.mkiv index 33f4b7d6d..e400dfaa0 100644 --- a/tex/context/base/cont-new.mkiv +++ b/tex/context/base/cont-new.mkiv @@ -45,6 +45,4 @@ buffers.change_state = logs.obsolete("buffers.change_state","buffers.finishstate") \stopluacode -\def\luaexpr#1{\ctxlua{tex.sprint(tex.ctxcatcodes,tostring(#1))}} % todo: other catcode regimes - \protect \endinput diff --git a/tex/context/base/cont-new.tex b/tex/context/base/cont-new.tex index 3020a29c8..eaec0cc5c 100644 --- a/tex/context/base/cont-new.tex +++ b/tex/context/base/cont-new.tex @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2010.10.11 01:11} +\newcontextversion{2010.10.12 01:03} %D This file is loaded at runtime, thereby providing an %D excellent place for hacks, patches, extensions and new diff --git a/tex/context/base/context.tex b/tex/context/base/context.tex index d2c821541..218dba703 100644 --- a/tex/context/base/context.tex +++ b/tex/context/base/context.tex @@ -20,7 +20,7 @@ %D your styles an modules. \edef\contextformat {\jobname} -\edef\contextversion{2010.10.11 01:11} +\edef\contextversion{2010.10.12 01:03} %D For those who want to use this: diff --git a/tex/context/base/lpdf-ano.lua b/tex/context/base/lpdf-ano.lua index 05be69810..839930238 100644 --- a/tex/context/base/lpdf-ano.lua +++ b/tex/context/base/lpdf-ano.lua @@ -33,7 +33,6 @@ local javascriptcode = interactions.javascripts.code local references = structures.references local bookmarks = structures.bookmarks -local references = structures.references local runners = references.runners local specials = references.specials @@ -131,44 +130,26 @@ local function link(url,filename,destination,page,actions) NewWindow = (actions.newwindow and true) or nil, } elseif destination and destination ~= "" then - local realpage, p = texcount.realpageno, tonumber(page) - if not p then - -- sorry - elseif p > realpage then - texcount.referencepagestate = 3 - elseif p < realpage then - texcount.referencepagestate = 2 - else - texcount.referencepagestate = 1 - end + local p = references.checkedpage(actions.n,page) return pdfdictionary { -- can be cached S = pdf_goto, D = destination, } elseif page and page ~= "" then - local realpage, p = texcount.realpageno, tonumber(page) - if p then - if p > realpage then - texcount.referencepagestate = 3 - elseif p < realpage then - texcount.referencepagestate = 2 - else - texcount.referencepagestate = 1 - end - if p > 0 then - --~ return gotopagedestination(p) - --~ return pdfdictionary { -- can be cached - --~ S = pdf_goto, - --~ D = pagedestination(p), - --~ } - return pdfdictionary { -- can be cached - S = pdf_goto, - D = pdfarray { - pdfreference(pdfpagereference(p)), - pdf_fit, - } + local p = references.checkedpage(actions.n,page) + if p and p > 0 then + --~ return gotopagedestination(p) + --~ return pdfdictionary { -- can be cached + --~ S = pdf_goto, + --~ D = pagedestination(p), + --~ } + return pdfdictionary { -- can be cached + S = pdf_goto, + D = pdfarray { + pdfreference(pdfpagereference(p)), + pdf_fit, } - end + } else commands.writestatus("references","invalid page reference: %s",page or "?") end @@ -227,7 +208,7 @@ local function pdfaction(actions) return nil end end - return first + return first, actions.n end end end @@ -235,16 +216,18 @@ end lpdf.action = pdfaction function codeinjections.prerollreference(actions) -- share can become option - local main = actions and pdfaction(actions) - if main then - main = pdfdictionary { - Subtype = pdf_link, - Border = pdf_border, - H = (not actions.highlight and pdf_n) or nil, - A = pdfshareobjectreference(main), - F = 4, -- print (mandate in pdf/a) - } - return main("A") + if actions then + local main, n = pdfaction(actions) + if main then + main = pdfdictionary { + Subtype = pdf_link, + Border = pdf_border, + H = (not actions.highlight and pdf_n) or nil, + A = pdfshareobjectreference(main), + F = 4, -- print (mandate in pdf/a) + } + return main("A"), n + end end end diff --git a/tex/context/base/lpdf-wid.lua b/tex/context/base/lpdf-wid.lua index fe02196dc..e45e9727c 100644 --- a/tex/context/base/lpdf-wid.lua +++ b/tex/context/base/lpdf-wid.lua @@ -10,7 +10,7 @@ local format, gmatch, gsub, find = string.format, string.gmatch, string.gsub, st local texsprint, ctxcatcodes, texbox, texcount = tex.sprint, tex.ctxcatcodes, tex.box, tex.count local settings_to_array = utilities.parsers.settings_to_array -local report_media = logs.report("media") +local report_media = logs.new("media") local backends, lpdf, nodes = backends, lpdf, nodes diff --git a/tex/context/base/mult-cld.lua b/tex/context/base/mult-cld.lua index 3d3194b69..edc4253a9 100644 --- a/tex/context/base/mult-cld.lua +++ b/tex/context/base/mult-cld.lua @@ -16,6 +16,8 @@ if not modules then modules = { } end modules ['mult-cld'] = { -- Todo: optional checking against interface -- Todo: coroutine trickery +-- tflush needs checking ... sort of weird that it's not a table + context = context or { } local context = context @@ -26,6 +28,7 @@ local insert, remove = table.insert, table.remove local tex = tex local texsprint = tex.sprint +local textprint = tex.tprint local texprint = tex.print local texiowrite = texio.write local texcount = tex.count @@ -33,7 +36,7 @@ local ctxcatcodes = tex.ctxcatcodes local prtcatcodes = tex.prtcatcodes local vrbcatcodes = tex.vrbcatcodes -local flush = texsprint or function(cct,...) print(concat{...}) end +local flush = texsprint local report_cld = logs.new("cld") @@ -99,10 +102,10 @@ local trace_context = logs.new("context") -- here function context.trace(intercept) local normalflush = flush - flush = function(c,...) - trace_context(concat({...})) + flush = function(...) + trace_context(concat({...},"",2)) if not intercept then - normalflush(c,...) + normalflush(...) end end context.trace = function() end @@ -114,13 +117,18 @@ end function context.setflush(newflush) local oldflush = flush - flush = newflush + flush = newflush or flush return oldflush end trackers.register("context.flush", function(v) if v then context.trace() end end) trackers.register("context.intercept", function(v) if v then context.trace(true) end end) +--~ context.trace() + +-- beware, we had command as part of the flush and made it "" afterwards so that we could +-- keep it there (...,command,...) but that really confuses the tex machinery + local function writer(command,first,...) -- 5% faster than just ... and separate flush of command if not command then -- error @@ -128,25 +136,37 @@ local function writer(command,first,...) -- 5% faster than just ... and separate flush(currentcatcodes,command) else local t = { first, ... } + flush(currentcatcodes,command) for i=1,#t do - if i == 2 then - command = "" - end local ti = t[i] local typ = type(ti) if ti == nil then - flush(currentcatcodes,command) - elseif typ == "string" or typ == "number" then - flush(currentcatcodes,command,"{",ti,"}") + -- nothing + elseif typ == "string" then + if ti == "" then + flush(currentcatcodes,"{}") + else + flush(currentcatcodes,"{",ti,"}") + end + elseif typ == "number" then + flush(currentcatcodes,"{",ti,"}") elseif typ == "table" then local tn = #ti if tn == 0 then local done = false for k, v in next, ti do if done then - flush(currentcatcodes,",",k,'=',v) + if v == "" then + flush(currentcatcodes,",",k,'=') + else + flush(currentcatcodes,",",k,'=',v) + end else - flush(currentcatcodes,command,"[",k,'=',v) + if v == "" then + flush(currentcatcodes,"[",k,'=') + else + flush(currentcatcodes,"[",k,'=',v) + end done = true end end @@ -154,34 +174,32 @@ local function writer(command,first,...) -- 5% faster than just ... and separate elseif tn == 1 then -- some 20% faster than the next loop local tj = ti[1] if type(tj) == "function" then - flush(currentcatcodes,command,"[\\mkivflush{",_store_(tj),"}]") + flush(currentcatcodes,"[\\mkivflush{",_store_(tj),"}]") else - flush(currentcatcodes,command,"[",tj,"]") + flush(currentcatcodes,"[",tj,"]") end - else -- is concat really faster than flushes here? + else -- is concat really faster than flushes here? probably needed anyway (print artifacts) for j=1,tn do local tj = ti[j] if type(tj) == "function" then ti[j] = "\\mkivflush{" .. _store_(tj) .. "}" end end - flush(currentcatcodes,command,"[",concat(ti,","),"]") + flush(currentcatcodes,"[",concat(ti,","),"]") end elseif typ == "function" then - flush(currentcatcodes,command,"{\\mkivflush{",_store_(ti),"}}") + flush(currentcatcodes,"{\\mkivflush{",_store_(ti),"}}") -- elseif typ == "boolean" then -- flush(currentcatcodes,"\n") elseif ti == true then - flush(currentcatcodes,command,"\n") + flush(currentcatcodes,"\n") elseif typ == false then -- if force == "direct" then - flush(currentcatcodes,command,tostring(ti)) + flush(currentcatcodes,tostring(ti)) -- end elseif typ == "thread" then - flush(currentcatcodes,command) trace_context("coroutines not supported as we cannot yield across boundaries") else - flush(currentcatcodes,command) trace_context("error: %s gets a weird argument %s",command,tostring(ti)) end end @@ -191,9 +209,6 @@ end --~ experiments.register("context.writer",function() --~ writer = newwriter --~ end) - --- -- -- - local function indexer(t,k) local c = "\\" .. k .. " " local f = function(...) return writer(c,...) end diff --git a/tex/context/base/mult-sys.tex b/tex/context/base/mult-sys.tex index 4f0f6c28b..760c83033 100644 --- a/tex/context/base/mult-sys.tex +++ b/tex/context/base/mult-sys.tex @@ -204,6 +204,12 @@ \definesystemconstant {default} \definesystemconstant {smallcaps} +\definesystemconstant {text} +\definesystemconstant {page} +\definesystemconstant {leftpage} +\definesystemconstant {rightpage} +\definesystemconstant {somewhere} + %D A more experienced \TEX\ user will recognize the next four %D constants. We need these because font-definitions are %D partially english. diff --git a/tex/context/base/node-ref.lua b/tex/context/base/node-ref.lua index 0473e4523..082f1c8b0 100644 --- a/tex/context/base/node-ref.lua +++ b/tex/context/base/node-ref.lua @@ -16,6 +16,8 @@ if not modules then modules = { } end modules ['node-bck'] = { -- is grouplevel still used? +local allocate, mark = utilities.storage.allocate, utilities.storage.mark + local cleanupreferences, cleanupdestinations = false, true local attributes, nodes, node = attributes, nodes, node @@ -378,7 +380,7 @@ local function makereference(width,height,depth,reference) if trace_references then report_backends("resolving reference attribute %s",reference) end - local resolved, ht, dp, set = sr[1], sr[2], sr[3], sr[4] + local resolved, ht, dp, set, n = sr[1], sr[2], sr[3], sr[4], sr[5] if ht then if height < ht then height = ht end if depth < dp then depth = dp end @@ -398,6 +400,7 @@ local function makereference(width,height,depth,reference) else result = annot end + references.registerpage(n) result = hpack_list(result,0) result.width, result.height, result.depth = 0, 0, 0 if cleanupreferences then stack[reference] = nil end diff --git a/tex/context/base/page-flt.lua b/tex/context/base/page-flt.lua index 6b6755c22..a1798adc9 100644 --- a/tex/context/base/page-flt.lua +++ b/tex/context/base/page-flt.lua @@ -18,6 +18,8 @@ local trace_floats = false trackers.register("graphics.floats", function(v) tra local report_floats = logs.new("floats") +local C, S, P, lpegmatch = lpeg.C, lpeg.S, lpeg.P, lpeg.match + -- we use floatbox, floatwidth, floatheight -- text page leftpage rightpage (todo: top, bottom, margin, order) @@ -32,6 +34,7 @@ local function initialize() page = { }, leftpage = { }, rightpage = { }, + somewhere = { }, } end @@ -76,12 +79,21 @@ local function setdimensions(b) return w, h, d end -local function get(stack,n) - n = n or #stack - if n > 0 then - local t = stack[n] - if t then - return t, t.box, n +local function get(stack,n,bylabel) + if bylabel then + for i=1,#stack do + local s = stack[i] + if s.data.label == n then + return s, s.box, i + end + end + else + n = n or #stack + if n > 0 then + local t = stack[n] + if t then + return t, t.box, n + end end end end @@ -131,10 +143,10 @@ function floats.resave(which) end end -function floats.flush(which,n) +function floats.flush(which,n,bylabel) which = which or default local stack = stacks[which] - local t, b, n = get(stack,n or 1) + local t, b, n = get(stack,n or 1,bylabel) if t then local w, h, d = setdimensions(b) if trace_floats then @@ -234,3 +246,26 @@ function floats.thecheckedpagefloat(packed) end texsprint(ctxcatcodes,result) end + +local method = C((1-S(", :"))^1) +local position = P(":") * C((1-S("*,"))^1) * P("*") * C((1-S(","))^1) +local label = P(":") * C((1-S(",*: "))^0) + +local pattern = method * (label * position + C("") * position + label + C("") * C("") * C("")) + +-- table.print { lpeg.match(pattern,"somewhere:blabla,crap") } +-- table.print { lpeg.match(pattern,"somewhere:1*2") } +-- table.print { lpeg.match(pattern,"somewhere:blabla:1*2") } +-- table.print { lpeg.match(pattern,"somewhere::1*2") } +-- table.print { lpeg.match(pattern,"somewhere,") } +-- table.print { lpeg.match(pattern,"somewhere") } + +function floats.analysemethod(str) + if str ~= "" then -- extra check, already done at the tex end + local method, label, row, column = lpegmatch(pattern,str) + context.setvalue("floatmethod",method or "") + context.setvalue("floatlabel", label or "") + context.setvalue("floatrow", row or "") + context.setvalue("floatcolumn",column or "") + end +end diff --git a/tex/context/base/page-flt.mkiv b/tex/context/base/page-flt.mkiv index 370b40e89..9857bb0ea 100644 --- a/tex/context/base/page-flt.mkiv +++ b/tex/context/base/page-flt.mkiv @@ -75,6 +75,10 @@ {\ctxlua{floats.flush("#1",\number#2)}% \the\everyfloatscheck} +\def\dofloatsflushbylabel#1#2% + {\ctxlua{floats.flush("#1","#2",true)}% + \the\everyfloatscheck} + \def\dofloatssave#1% {\ctxlua{floats.save("#1")}% \the\everyfloatscheck} @@ -112,6 +116,31 @@ \def\dofloatssavepagefloat#1#2% {\ctxlua{floats.save("#1", { specification = "#2" })}} +\def\dofloatssavesomewherefloat#1#2% #1=method + {\ctxlua{floats.save("#1", { specification = "#2", label = "\floatlabel" })}} + +%D This is an experimental new feature (for Alan Braslau), a prelude to more: +%D +%D \starttyping +%D test \placefigure{}{} +%D test \placefigure[somewhere:123][whatever]{}{} +%D test \placefigure[somewhere:456][whatever]{}{} +%D test \placefigure{}{} +%D +%D \placenamedfloat[figure][456] +%D \placenamedfloat[figure][123] +%D \stoptyping + +\def\placenamedfloat + {\dodoubleargument\doplacenamedfloat} + +\def\doplacenamedfloat[#1][#2]% + {\def\currentfloat{#1}% + \blank[\@@bkspacebefore]% + \dofloatsflushbylabel\s!somewhere{#2}% + \box\floatbox + \blank[\@@bkspaceafter]} + %D The following code is in transition as we don't want to break the %D current single column, multi column, and columnset mechanism. %D @@ -119,7 +148,7 @@ \def\dogetfloat {\ifsomefloatwaiting - \dofloatsflush{text}{1}% + \dofloatsflush\s!text{1}% \ifcenterfloatbox \ifdim\wd\globalscratchbox<\hsize \global\setbox\floatbox\hbox to \hsize{\hss\box\floatbox\hss}% @@ -138,14 +167,14 @@ \fi} \def\dosavefloat - {\dofloatssave{text}% + {\dofloatssave\s!text \nonoindentation} % brrr nonoindentation here \def\doresavefloat - {\dofloatsresave{text}} + {\dofloatsresave\s!text} \def\doreversesavefloat - {\dofloatsresave{text}} + {\dofloatsresave\s!text} \def\doflushsavedfloats % simplified \OTRONEdodoflushfloats {\doloop @@ -177,21 +206,21 @@ % \def\doflushpagefloats % {\doifoddpageelse -% {\ifnum\dofloatsnofstacked{rightpage}>\zerocount -% \doflushsomepagefloat{rightpage}% -% \else\ifnum\dofloatsnofstacked{page}>\zerocount -% \doflushsomepagefloat{page} -% \else\ifnum\dofloatsnofstacked{leftpage}>\zerocount +% {\ifnum\dofloatsnofstacked\s!rightpage>\zerocount +% \doflushsomepagefloat\s!rightpage +% \else\ifnum\dofloatsnofstacked\s!page>\zerocount +% \doflushsomepagefloat\s!page +% \else\ifnum\dofloatsnofstacked\s!leftpage>\zerocount % \null\vfill\eject -% %\doflushsomepagefloat{leftpage}% +% %\doflushsomepagefloat\s!leftpage % \fi\fi\fi} -% {\ifnum\dofloatsnofstacked{leftpage}>\zerocount -% \doflushsomepagefloat{leftpage}% -% \else\ifnum\dofloatsnofstacked{page}>\zerocount -% \doflushsomepagefloat{page} -% \else\ifnum\dofloatsnofstacked{rightpage}>\zerocount +% {\ifnum\dofloatsnofstacked\s!leftpage>\zerocount +% \doflushsomepagefloat\s!leftpage +% \else\ifnum\dofloatsnofstacked\s!page>\zerocount +% \doflushsomepagefloat\s!page +% \else\ifnum\dofloatsnofstacked\s!rightpage>\zerocount % \null\vfill\eject -% %\doflushsomepagefloat{rightpage}% +% %\doflushsomepagefloat\s!rightpage % \fi\fi\fi}} \def\doflushpagefloats diff --git a/tex/context/base/page-mul.mkiv b/tex/context/base/page-mul.mkiv index 70f5bd337..b7efb8782 100644 --- a/tex/context/base/page-mul.mkiv +++ b/tex/context/base/page-mul.mkiv @@ -1329,7 +1329,7 @@ \else \bgroup \getcolumnstatus\column\count255\total\dimen0\goal\dimen2\\% - \dofloatsgetinfo{text}% + \dofloatsgetinfo\s!text \setbox\scratchbox\vbox % tricky met objecten ? {\blank[\@@bkspacebefore] \snaptogrid\vbox{\vskip\floatheight}}% copy? @@ -1359,7 +1359,7 @@ \let\doflushcolumnfloat\relax \getcolumnstatus\column\mofcolumns\total\dimen0\goal\dimen2\\% \ifdim\dimen0>\zeropoint - \dofloatsgetinfo{text}% + \dofloatsgetinfo\s!text \ifdim\floatwidth>\hsize % dropped ? \else @@ -1371,7 +1371,7 @@ \ifnum\mofcolumns<\nofcolumns \advance\mofcolumns \plusone \ifdim\ht\currenttopcolumnbox=\zeropoint - \dofloatsflush{text}{1}% + \dofloatsflush\s!text{1}% \global\setbox\currenttopcolumnbox\vbox {\snaptogrid\vbox{\box\floatbox} \whitespace % nodig ? @@ -1395,7 +1395,7 @@ \blank[\@@bkspacebefore] \nobreak \fi - \dofloatsflush{text}{1}% + \dofloatsflush\s!text{1}% \flushfloatbox \blank[\@@bkspaceafter] \fi @@ -1436,7 +1436,7 @@ \whitespace % nodig ? \blank[\@@bkspaceafter]}% \else - \dofloatsgetinfo{text}% + \dofloatsgetinfo\s!text \ifdim\floatwidth>\hsize \dimen0\dimexpr\floatwidth+\intercolumnwidth+.5pt\relax \dimen2\dimexpr\hsize +\intercolumnwidth+.5pt\relax @@ -1447,7 +1447,7 @@ \count0\zerocount \else \dimen0\dimexpr\count0\hsize+\count0\intercolumnwidth-\intercolumnwidth\relax - \dofloatsflush{text}{1}% + \dofloatsflush\s!text{1}% \ifdim\floatwidth>\finalcolumntextwidth % better somewhere else too \global\setbox\floatbox\hbox to \finalcolumntextwidth{\hss\box\floatbox\hss}% \fi % otherwise the graphic may disappear @@ -1460,7 +1460,7 @@ \fi \showmessage\m!columns{13}\empty \else - \dofloatsflush{text}{1}% + \dofloatsflush\s!text{1}% \ifdim\floatwidth>\finalcolumntextwidth % better somewhere else too \global\setbox\floatbox\hbox to \finalcolumntextwidth{\hss\box\floatbox\hss}% \fi % otherwise the graphic may disappear diff --git a/tex/context/base/page-one.mkiv b/tex/context/base/page-one.mkiv index 1ac769637..e150d453a 100644 --- a/tex/context/base/page-one.mkiv +++ b/tex/context/base/page-one.mkiv @@ -343,15 +343,15 @@ {\ifsomefloatwaiting \ifpackflushedfloats \centerfloatboxfalse % not needed as we do call directly - \dofloatscollect{text}{\hsize}{1em}% + \dofloatscollect\s!text{\hsize}{1em}% \OTRONEsetvsize \global\setbox\floatbox\hbox to \hsize {\hfil \dorecurse\nofcollectedfloats {\ifcase\columndirection % nog document wide - \dofloatsflush{text}{1}% + \dofloatsflush\s!text{1}% \else - \dofloatsflushn{text}{\the\numexpr\nofcollectedfloats-\recurselevel+1\relax}% + \dofloatsflushn\s!text{\the\numexpr\nofcollectedfloats-\recurselevel+1\relax}% \fi \ifdim\wd\floatbox>\makeupwidth % \hsize \hbox to \makeupwidth{\hss\box\floatbox\hss}% @@ -490,9 +490,11 @@ \doifinset\v!tall{#1}\flushsidefloatsafterpar \fi} -\def\OTRONEsomepagefloat [#1]{\dofloatssavepagefloat{page} {#1}} -\def\OTRONEsomeleftpagefloat [#1]{\dofloatssavepagefloat{leftpage} {#1}} -\def\OTRONEsomerightpagefloat[#1]{\dofloatssavepagefloat{rightpage}{#1}} +\def\OTRONEsomepagefloat [#1]{\dofloatssavepagefloat {\s!page} {#1}} +\def\OTRONEsomeleftpagefloat [#1]{\dofloatssavepagefloat {\s!leftpage} {#1}} +\def\OTRONEsomerightpagefloat[#1]{\dofloatssavepagefloat {\s!rightpage}{#1}} + +%def\OTRONEsomesoemwherefloat[#1]{\dofloatssavesomewherefloat{\s!somewhere}{#1}} \def\OTRONEsometopsfloat[#1]% {\ifdim\topinserted=\zeropoint diff --git a/tex/context/base/page-set.mkiv b/tex/context/base/page-set.mkiv index 0cb83a1dc..f2e11e8a0 100644 --- a/tex/context/base/page-set.mkiv +++ b/tex/context/base/page-set.mkiv @@ -1333,11 +1333,11 @@ \def\OTRSETsavebox#1% clean up the skips {\OTRSETunpreparebox{#1}% - \dofloatssave{text}} + \dofloatssave\s!text} \def\OTRSETresavebox#1% clean up the skips {\OTRSETunpreparebox{#1}% - \dofloatsresave{text}} + \dofloatsresave\s!text} \def\OTRSETflushfloatbox % nog verder doorvoeren en meer info in marge {\iftestfloatbox\ruledhbox\fi{\box\floatbox}} @@ -1348,10 +1348,10 @@ \doloop {\ifsomefloatwaiting \OTRSETskipstart - \dofloatsgetinfo{text}% + \dofloatsgetinfo\s!text \ifdim\floatwidth>\zeropoint \!!doneatrue - \dofloatsflush{text}{1}% + \dofloatsflush\s!text{1}% \dp\floatbox\zeropoint \OTRSETstoreincolumnslot{TBLR}\floatbox \if!!donea diff --git a/tex/context/base/sort-ini.lua b/tex/context/base/sort-ini.lua index a8ad1a6e0..548a92efe 100644 --- a/tex/context/base/sort-ini.lua +++ b/tex/context/base/sort-ini.lua @@ -103,7 +103,7 @@ local replacements, m_mappings, z_mappings, p_mappings, entries, orders, lower, local mte = { __index = function(t,k) - if utfbyte(k) < digitsoffset then + if k ~= "" and utfbyte(k) < digitsoffset then local el if k then local l = lower[k] or lcchars[k] diff --git a/tex/context/base/strc-flt.mkii b/tex/context/base/strc-flt.mkii index 62d02aa2a..3d07cdc20 100644 --- a/tex/context/base/strc-flt.mkii +++ b/tex/context/base/strc-flt.mkii @@ -2035,7 +2035,7 @@ \c!nbottom=0, \c!nlines=4, \c!local=, - \c!default=\v!figure, + \c!default=, % was \v!figure but this is the location \c!numbering=\v!yes] % float strategy, replaces some of the above macros diff --git a/tex/context/base/strc-flt.mkiv b/tex/context/base/strc-flt.mkiv index ff849517f..ce101c870 100644 --- a/tex/context/base/strc-flt.mkiv +++ b/tex/context/base/strc-flt.mkiv @@ -110,17 +110,17 @@ \c!textcolor=, \c!align=, \c!number=\v!yes, -% \c!prefix=\v!no, -% \c!prefixconnector=., -% \c!way=\v!by\v!chapter, -% \c!prefixsegments=2:2, -% \c!way=\@@nrway, -% \c!blockway=\@@nrblockway, -% \c!sectionnumber=\@@nrsectionnumber, -% \c!separator=\@@koseparator, -% \c!starter=\@@kostarter, -% \c!stopper=\@@kostopper, -% \c!suffix=\floatcaptionsuffix, % hook + % \c!prefix=\v!no, + % \c!prefixconnector=., + % \c!way=\v!by\v!chapter, + % \c!prefixsegments=2:2, + % \c!way=\@@nrway, + % \c!blockway=\@@nrblockway, + % \c!sectionnumber=\@@nrsectionnumber, + % \c!separator=\@@koseparator, + % \c!starter=\@@kostarter, + % \c!stopper=\@@kostopper, + % \c!suffix=\floatcaptionsuffix, % hook \c!distance=1em, \c!conversion=\v!numbers, \c!command=] @@ -169,7 +169,7 @@ \c!local=, \c!bottombefore=, % e.g. \vfill \c!bottomafter=, - \c!default=\v!figure, + \c!default=, % default location \c!numbering=\v!yes] \def\@@bknumbering {\floatsharedparameter\c!numbering } % global one @@ -206,7 +206,6 @@ % \c!sectionnumber=\floatcaptionparameter\c!sectionnumber, % \c!conversion=\floatcaptionparameter\c!conversion]% - %D Individial settings: \unexpanded\def\setupfloat {\dodoubleargument\dosetupfloat} @@ -302,14 +301,6 @@ \installstructurelistprocessor{float}{\usestructurelistprocessor{number+title}} -% \def\thecurrentfloatnumber -% {\ifnofloatcaption \else \ifnofloatnumber \else -% % \labeltexts\currentfloat{\convertedstructurecounter[\currentfloat]}% ! ! todo: use a lua call instead -% \ifx\currentfloatnumber\relax\else -% \labeltexts\currentfloat{\ctxlua{structures.lists.savednumber("\currentfloat",\currentfloatnumber)}}% -% \fi -% \fi \fi} - \def\thecurrentfloatnumber {\ifnofloatcaption \else \ifnofloatnumber \else \ifx\currentfloatnumber\relax\else @@ -1872,25 +1863,34 @@ % float strategy, replaces some of the above macros \let\floatmethod \empty +\let\floatlabel \empty \let\floatcolumn \empty \let\floatrow \empty \let\forcedfloatmethod\empty +% \def\setfloatmethodvariables#1% +% {\getfromcommalist[#1][1]% +% \@EA\beforesplitstring\commalistelement\at:\to\floatmethod +% \@EA\aftersplitstring \commalistelement\at:\to\floatcolumn +% \@EA\aftersplitstring \floatcolumn\at*\to\floatrow +% \@EA\beforesplitstring\floatcolumn\at*\to\floatcolumn} + +\def\setfloatmethodvariables#1% \floatmethod \floatlabel \floatrow \floatcolumn + {\ctxlua{floats.analysemethod("#1")}} + \def\dogetfloatbox#1#2% {\ifvisible - \doifelsenothing{#2} - {\getfromcommalist[#1][1]% - \@EA\beforesplitstring\commalistelement\at:\to\floatmethod - \@EA\aftersplitstring \commalistelement\at:\to\floatcolumn - \@EA\aftersplitstring \floatcolumn\at*\to\floatrow - \@EA\beforesplitstring\floatcolumn\at*\to\floatcolumn - % todo: nog algemeen otr - \ifdefined\OTRSETsetpreferedcolumnslot - \OTRSETsetpreferedcolumnslot\floatcolumn\floatrow - \fi} - {\let\floatcolumn\empty - \let\floatrow\empty - \edef\floatmethod{#2}}% + \let \floatlabel \empty + \let \floatcolumn\empty + \let \floatrow \empty + \edef\floatmethod{#2}% + \ifx\floatmethod\empty + \setfloatmethodvariables{#1}% + % todo: nog algemeen otr + \ifdefined\OTRSETsetpreferedcolumnslot + \OTRSETsetpreferedcolumnslot\floatcolumn\floatrow + \fi + \fi \doifundefined{\string\floatmethod\floatmethod} {\let\floatmethod\v!here}% \doifsomething\forcedfloatmethod @@ -1902,6 +1902,9 @@ \def\installfloathandler#1#2% #1=keyword #2=handler {\setvalue{\string\floatmethod#1}{#2}} +\def\somesomewherefloat[#1]% + {\dofloatssavesomewherefloat\s!somewhere{#1}} + \installfloathandler \v!here \someherefloat \installfloathandler \v!force \somefixdfloat \installfloathandler \v!left \someleftsidefloat @@ -1923,6 +1926,8 @@ \installfloathandler \v!leftedge \someinleftedgefloat \installfloathandler \v!rightedge \someinrightedgefloat +\installfloathandler \v!somewhere \somesomewherefloat + \installfloathandler \v!backspace \somebackspacefloat \installfloathandler \v!cutspace \somecutspacefloat @@ -1966,6 +1971,7 @@ \unexpanded\def\placesomebotsfloat {\OTRcommand\somebotsfloat} \unexpanded\def\placesomesidefloat {\OTRcommand\somesidefloat} \unexpanded\def\placesomefacefloat {\OTRcommand\somefacefloat} +%unexpanded\def\placesomesomewherefloat{\OTRcommand\somesomewherefloat} \def\somefixdfloat {\placesomefixdfloat} \def\somepagefloat {\placesomepagefloat} diff --git a/tex/context/base/strc-num.lua b/tex/context/base/strc-num.lua index 72cd75ecf..c2f989070 100644 --- a/tex/context/base/strc-num.lua +++ b/tex/context/base/strc-num.lua @@ -125,7 +125,8 @@ local function allocate(name,i) -- block = "", -- todo numbers = nil, state = variables.start, -- true - data = { } + data = { }, + saved = { }, } tobesaved[name] = { } counterdata[name] = cd @@ -360,15 +361,14 @@ end function counters.save(name) -- or just number local cd = counterdata[name] if cd then - cd.saved = table.copy(cd.data) + table.insert(cd.saved,table.copy(cd.data)) end end function counters.restore(name) local cd = counterdata[name] if cd and cd.saved then - cd.data = cd.saved - cd.saved = nil + cd.data = table.remove(cd.saved) end end diff --git a/tex/context/base/strc-ref.lua b/tex/context/base/strc-ref.lua index 6811c4da3..12b4b2558 100644 --- a/tex/context/base/strc-ref.lua +++ b/tex/context/base/strc-ref.lua @@ -10,6 +10,7 @@ local format, find, gmatch, match, concat = string.format, string.find, string.g local lpegmatch, lpegP, lpegCs = lpeg.match, lpeg.P, lpeg.Cs local texsprint, texwrite, texcount, texsetcount = tex.sprint, tex.write, tex.count, tex.setcount local allocate, mark = utilities.storage.allocate, utilities.storage.mark +local setmetatable, rawget = setmetatable, rawget local allocate = utilities.storage.allocate @@ -53,18 +54,22 @@ local executers = allocate() local handlers = allocate() local tobesaved = allocate() local collected = allocate() - -references.derived = derived -references.specials = specials -references.runners = runners -references.internals = internals -references.exporters = exporters -references.imported = imported -references.filters = filters -references.executers = executers -references.handlers = handlers -references.tobesaved = tobesaved -references.collected = collected +local tobereferred = allocate() +local referred = allocate() + +references.derived = derived +references.specials = specials +references.runners = runners +references.internals = internals +references.exporters = exporters +references.imported = imported +references.filters = filters +references.executers = executers +references.handlers = handlers +references.tobesaved = tobesaved +references.collected = collected +references.tobereferred = tobereferred +references.referred = referred storage.register("structures/references/defined", references.defined, "structures.references.defined") @@ -87,6 +92,7 @@ local function initializer() -- can we use a tobesaved as metatable for collecte initializers[i](tobesaved,collected) end end + local function finalizer() -- tobesaved = mark(references.tobesaved) for i=1,#finalizers do @@ -94,10 +100,68 @@ local function finalizer() end end -if job then - job.register('structures.references.collected', tobesaved, initializer, finalizer) +job.register('structures.references.collected', tobesaved, initializer, finalizer) + +local maxreferred = 1 + +local function initializer() -- can we use a tobesaved as metatable for collected? + tobereferred = mark(references.tobereferred) + referred = mark(references.referred) + + function get(t,n) -- catch sparse, a bit slow but who cares + for i=n,1,-1 do -- we could make a tree ... too much work + local p = rawget(t,i) + if p then + return p + end + end + end + setmetatable(referred, { __index = get }) +end + +local function finalizer() -- make sparse + local last + for i=1,maxreferred do + local r = tobereferred[i] + if not last then + last = r + elseif r == last then + tobereferred[i] = nil + else + last = r + end + end +end + +function references.referredpage(n) + return referred[n] or referred[n] or texcount.realpageno end +function references.checkedpage(n,page) + local r, p = referred[n] or texcount.realpageno, tonumber(page) + if not p then + -- sorry + elseif p > r then + texcount.referencepagestate = 3 + elseif p < r then + texcount.referencepagestate = 2 + else + texcount.referencepagestate = 1 + end + return p +end + +function references.registerpage(n) + if not tobereferred[n] then + if n > maxreferred then + maxreferred = n + end + tobereferred[n] = texcount.realpageno + end +end + +job.register('structures.references.referred', tobereferred, initializer, finalizer) + -- todo: delay split till later as in destinations we split anyway local orders, lastorder = { }, 0 @@ -763,12 +827,15 @@ end local prefixsplitter = lpegCs(lpegP((1-lpegP(":"))^1 * lpegP(":"))) * lpegCs(lpegP(1)^1) - -- todo: add lots of tracing here +local n = 0 + local function identify(prefix,reference) local set = resolve(prefix,reference) local bug = false +n = n + 1 +set.n = n for i=1,#set do local var = set[i] local special, inner, outer, arguments, operation = var.special, var.inner, var.outer, var.arguments, var.operation @@ -1131,10 +1198,12 @@ function references.getcurrentmetadata(tag) texsprint(ctxcatcodes,data) end end + local function currentmetadata(tag) local data = currentreference and currentreference.i return data and data.metadata and data.metadata[tag] end + references.currentmetadata = currentmetadata function references.getcurrentprefixspec(default) -- todo: message @@ -1328,16 +1397,7 @@ function references.analyze(actions) what = what(a,actions) end end - local realpage, p = texcount.realpageno, tonumber(actions.realpage) - if not p then - -- sorry - elseif p > realpage then - texcount.referencepagestate = 3 - elseif p < realpage then - texcount.referencepagestate = 2 - else - texcount.referencepagestate = 1 - end + references.checkedpage(actions.n,actions.realpage) end end return actions diff --git a/tex/context/base/strc-reg.lua b/tex/context/base/strc-reg.lua index e2fbb9527..59356bf30 100644 --- a/tex/context/base/strc-reg.lua +++ b/tex/context/base/strc-reg.lua @@ -292,14 +292,20 @@ function registers.extend(name,tag,rawdata) -- maybe do lastsection internally rr.lastrealpage = texcount.realpageno rr.lastsection = sections.currentid() if rawdata then - preprocessentries(rawdata) + if rawdata.entries then + preprocessentries(rawdata) + end for k,v in next, rawdata do if not r[k] then r[k] = v else local rk = r[k] for kk,vv in next, v do - if vv ~= "" then + if type(vv) == "table" then + if next(vv) then + rk[kk] = vv + end + elseif vv ~= "" then rk[kk] = vv end end diff --git a/tex/context/base/strc-reg.mkiv b/tex/context/base/strc-reg.mkiv index f4782d477..f16c27663 100644 --- a/tex/context/base/strc-reg.mkiv +++ b/tex/context/base/strc-reg.mkiv @@ -332,6 +332,7 @@ \fi \globallet\currentregistercoding\s!tex \fi + % I hate this kind of mess ... but it's a user request. \ifx\currentregisterentries\empty \normalexpanded{\ctxlua{structures.registers.extend("\currentregister","\currentregisterlabel", { metadata = { diff --git a/tex/context/base/syst-lua.mkiv b/tex/context/base/syst-lua.mkiv index 40cd9f756..f9be10e6d 100644 --- a/tex/context/base/syst-lua.mkiv +++ b/tex/context/base/syst-lua.mkiv @@ -34,4 +34,9 @@ \def\writestatus#1#2{\ctxlua{commands.writestatus(\!!bs#1\!!es,\!!bs#2\!!es)}} +% a handy helper (we can probably omit the tex.ctxcatcodes here as nowadays we seldom +% change the regime at the tex end + +\def\luaexpr#1{\ctxlua{tex.sprint(tex.ctxcatcodes,tostring(#1))}} + \protect \endinput diff --git a/tex/generic/context/luatex-fonts-merged.lua b/tex/generic/context/luatex-fonts-merged.lua index 23e16c428..415fff8dd 100644 --- a/tex/generic/context/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex-fonts-merged.lua @@ -1,6 +1,6 @@ -- merged file : luatex-fonts-merged.lua -- parent file : luatex-fonts.lua --- merge date : 10/11/10 01:11:52 +-- merge date : 10/12/10 01:03:01 do -- begin closure to overcome local limits and interference -- cgit v1.2.3