diff options
author | Context Git Mirror Bot <phg42.2a@gmail.com> | 2015-02-03 22:15:05 +0100 |
---|---|---|
committer | Context Git Mirror Bot <phg42.2a@gmail.com> | 2015-02-03 22:15:05 +0100 |
commit | b52a3ec06867c6722c0f6aeeeae57029235e53fb (patch) | |
tree | 108a6cf2226cefbfe7517c8b4b4a1a3d9d7adbc3 | |
parent | dd7b0113318332d153bf0b8cddbdfef4e1e9f90f (diff) | |
download | context-b52a3ec06867c6722c0f6aeeeae57029235e53fb.tar.gz |
2015-02-03 21:39:00
30 files changed, 627 insertions, 341 deletions
diff --git a/tex/context/base/bibl-tra.mkii b/tex/context/base/bibl-tra.mkii index a9ce392a2..868ca0fc6 100644 --- a/tex/context/base/bibl-tra.mkii +++ b/tex/context/base/bibl-tra.mkii @@ -642,8 +642,7 @@ %D If you want to write an extension to the styles, you might %D as well define some of these commands yourself. %D -%D The argument liust has been reordered here, and the meanings -%D are: +%D The argument list has been reordered here, and the meanings are: %D %D {\obeylines\parskip0pt %D \type{#1} firstnames diff --git a/tex/context/base/bibl-tra.mkiv b/tex/context/base/bibl-tra.mkiv index 092d21ca7..8ceffe2f3 100644 --- a/tex/context/base/bibl-tra.mkiv +++ b/tex/context/base/bibl-tra.mkiv @@ -689,7 +689,7 @@ \doifassignmentelse{#1}% {\getparameters[\??pb][k=\s!unknown,t=article,n=,s=,a=,y=,o=,u=,#1]}% {\getparameters[\??pb][k=#1,t=article,n=,s=,a=,y=,o=,u=]}% - \ctxlua{bibtex.hacks.register("\@@pbk","\@@pbs")}% + \ctxlua{bibtex.hacks.register(\!!bs\@@pbk\!!es,\!!bs\@@pbs\!!es)}% \catcode\commentasciicode\othercatcode \dodostartpublication} diff --git a/tex/context/base/cont-new.mkiv b/tex/context/base/cont-new.mkiv index 1d8a82cc7..52c4e4d3c 100644 --- a/tex/context/base/cont-new.mkiv +++ b/tex/context/base/cont-new.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2015.01.30 15:28} +\newcontextversion{2015.02.03 21:36} %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/context-version.pdf b/tex/context/base/context-version.pdf Binary files differindex 8994c342a..cc5438f72 100644 --- a/tex/context/base/context-version.pdf +++ b/tex/context/base/context-version.pdf diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv index 56bb004b4..ba82de9d3 100644 --- a/tex/context/base/context.mkiv +++ b/tex/context/base/context.mkiv @@ -28,7 +28,7 @@ %D up and the dependencies are more consistent. \edef\contextformat {\jobname} -\edef\contextversion{2015.01.30 15:28} +\edef\contextversion{2015.02.03 21:36} \edef\contextkind {beta} %D For those who want to use this: diff --git a/tex/context/base/font-inj.lua b/tex/context/base/font-inj.lua index 87330a393..87d3f9b27 100644 --- a/tex/context/base/font-inj.lua +++ b/tex/context/base/font-inj.lua @@ -79,19 +79,20 @@ function injections.resetcounts() keepregisteredcounts = false end +-- We need to make sure that a possible metatable will not kick in +-- unexpectedly. + function injections.reset(n) - local p = rawget(properties,start) - if p and p.injections then - -- todo: decrement counters? tricky as we then need to change the nof* to not increment - -- when we change a property - p.injections = nil -- should we keep the liga index? + local p = rawget(properties,n) + if p and rawget(p,"injections") then + p.injections = nil end end function injections.setligaindex(n,index) local p = rawget(properties,n) if p then - local i = p.injections + local i = rawget(p,"injections") if i then i.ligaindex = index else @@ -111,8 +112,8 @@ end function injections.getligaindex(n,default) local p = rawget(properties,n) if p then - p = p.injections - if p then + local i = rawget(p,"injections") + if i then return p.ligaindex or default end end @@ -132,7 +133,7 @@ function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmne -- local p = rawget(properties,start) if p then - local i = p.injections + local i = rawget(p,"injections") if i then i.cursiveanchor = true else @@ -149,7 +150,7 @@ function injections.setcursive(start,nxt,factor,rlmode,exit,entry,tfmstart,tfmne end local p = rawget(properties,nxt) if p then - local i = p.injections + local i = rawget(p,"injections") if i then i.cursivex = dx i.cursivey = dy @@ -183,7 +184,7 @@ function injections.setpair(current,factor,rlmode,r2lflag,spec,injection) -- r2l end local p = rawget(properties,current) if p then - local i = p.injections + local i = rawget(p,"injections") if i then if leftkern ~= 0 or rightkern ~= 0 then i.leftkern = i.leftkern or 0 + leftkern @@ -238,7 +239,7 @@ function injections.setkern(current,factor,rlmode,x,injection) injection = "injections" end if p then - local i = p[injection] + local i = rawget(p,injection) if i then i.leftkern = dx + i.leftkern or 0 else @@ -268,7 +269,7 @@ function injections.setmark(start,base,factor,rlmode,ba,ma,tfmbase) -- ba=basean end local p = rawget(properties,start) if p then - local i = p.injections + local i = rawget(p,"injections") if i then i.markx = dx i.marky = dy @@ -311,18 +312,18 @@ local function show(n,what,nested,symbol) if n then local p = rawget(properties,n) if p then - local p = p[what] - if p then - local leftkern = p.leftkern or 0 - local rightkern = p.rightkern or 0 - local yoffset = p.yoffset or 0 - local markx = p.markx or 0 - local marky = p.marky or 0 - local markdir = p.markdir or 0 - local markbase = p.markbase or 0 -- will be markbasenode - local cursivex = p.cursivex or 0 - local cursivey = p.cursivey or 0 - local ligaindex = p.ligaindex or 0 + local i = p[what] + if i then + local leftkern = i.leftkern or 0 + local rightkern = i.rightkern or 0 + local yoffset = i.yoffset or 0 + local markx = i.markx or 0 + local marky = i.marky or 0 + local markdir = i.markdir or 0 + local markbase = i.markbase or 0 -- will be markbasenode + local cursivex = i.cursivex or 0 + local cursivey = i.cursivey or 0 + local ligaindex = i.ligaindex or 0 local margin = nested and 4 or 2 -- if rightkern ~= 0 or yoffset ~= 0 then @@ -412,10 +413,6 @@ local function collect_glyphs_1(head) local nf, tm = nil, nil for n in traverse_id(glyph_code,head) do -- only needed for relevant fonts if getsubtype(n) < 256 then - local pn = rawget(properties,n) - if pn then - pn = pn.injections - end local f = getfont(n) if f ~= nf then nf = f @@ -429,10 +426,14 @@ local function collect_glyphs_1(head) glyphs[nofglyphs] = n end -- yoffsets can influence curs steps - if pn then - local yoffset = pn.yoffset - if yoffset and yoffset ~= 0 then - setfield(n,"yoffset",yoffset) + local p = rawget(properties,n) + if p then + local i = rawget(p,"injections") + if i then + local yoffset = i.yoffset + if yoffset and yoffset ~= 0 then + setfield(n,"yoffset",yoffset) + end end end end @@ -468,21 +469,18 @@ local function inject_marks(marks,nofmarks) local n = marks[i] local pn = rawget(properties,n) if pn then - pn = pn.injections - end - if pn then - -- local markbase = pn.markbase - -- if markbase then - -- local p = markanchors[markbase] + pn = rawget(pn,"injections") + if pn then local p = pn.markbasenode if p then local px = getfield(p,"xoffset") local ox = 0 + local rightkern = nil local pp = rawget(properties,p) if pp then - pp = pp.injections + pp = rawget(pp,"injections") + rightkern = pp.rightkern end - local rightkern = pp and pp.rightkern if rightkern then -- x and w ~= 0 if pn.markdir < 0 then -- kern(w-x) glyph(p) kern(x) mark(n) @@ -491,7 +489,12 @@ local function inject_marks(marks,nofmarks) else -- kern(x) glyph(p) kern(w-x) mark(n) -- ox = px - getfield(p,"width") + pn.markx - pp.leftkern - ox = px - pn.markx - pp.leftkern + local leftkern = pp.leftkern + if leftkern then + ox = px - pn.markx + else + ox = px - pn.markx - leftkern + end -- report_injections("l2r case 1: %p",ox) end else @@ -529,7 +532,7 @@ local function inject_marks(marks,nofmarks) -- normally this can't happen (only when in trace mode which is a special case anyway) -- report_injections("missing mark anchor %i",pn.markbase or 0) end - -- end + end end end end @@ -541,7 +544,7 @@ local function inject_cursives(glyphs,nofglyphs) local n = glyphs[i] local pn = rawget(properties,n) if pn then - pn = pn.injections + pn = rawget(pn,"injections") end if pn then local cursivex = pn.cursivex @@ -623,16 +626,16 @@ local function inject_kerns(head,glyphs,nofglyphs) local n = glyphs[i] local pn = rawget(properties,n) if pn then - pn = pn.injections - end - if pn then - local leftkern = pn.leftkern - if leftkern ~= 0 then - insert_node_before(head,n,newkern(leftkern)) -- type 0/2 - end - local rightkern = pn.rightkern - if rightkern and rightkern ~= 0 then - insert_node_after(head,n,newkern(rightkern)) -- type 0/2 + local i = rawget(pn,"injections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + insert_node_before(head,n,newkern(leftkern)) -- type 0/2 + end + local rightkern = i.rightkern + if rightkern and rightkern ~= 0 then + insert_node_after(head,n,newkern(rightkern)) -- type 0/2 + end end end end @@ -685,10 +688,10 @@ local function inject_kerns_only(head,where) if p then local d = getfield(p,"post") if d then - local pn = pn.postinjections - if pn then - local leftkern = pn.leftkern - if leftkern ~= 0 then + local i = rawget(pn,"postinjections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then local t = find_tail(d) insert_node_after(d,t,newkern(leftkern)) end @@ -696,28 +699,28 @@ local function inject_kerns_only(head,where) end local d = getfield(p,"replace") if d then - local pn = pn.replaceinjections - if pn then - local leftkern = pn.leftkern - if leftkern ~= 0 then + local i = rawget(pn,"replaceinjections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then local t = find_tail(d) insert_node_after(d,t,newkern(leftkern)) end end else - local pn = pn.injections - if pn then - local leftkern = pn.leftkern - if leftkern ~= 0 then + local i = rawget(pn,"injections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then setfield(p,"replace",newkern(leftkern)) end end end else - local pn = pn.injections - if pn then - local leftkern = pn.leftkern - if leftkern ~= 0 then + local i = rawget(pn,"injections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then head = insert_node_before(head,n,newkern(leftkern)) end end @@ -735,12 +738,12 @@ local function inject_kerns_only(head,where) if getsubtype(n) < 256 then local pn = rawget(properties,n) if pn then - pn = pn.preinjections - end - if pn then - local leftkern = pn.leftkern - if leftkern ~= 0 then - h = insert_node_before(h,n,newkern(leftkern)) + local i = rawget(pn,"preinjections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + h = insert_node_before(h,n,newkern(leftkern)) + end end end else @@ -758,12 +761,12 @@ local function inject_kerns_only(head,where) if getsubtype(n) < 256 then local pn = rawget(properties,n) if pn then - pn = pn.postinjections - end - if pn then - local leftkern = pn.leftkern - if leftkern ~= 0 then - h = insert_node_before(h,n,newkern(leftkern)) + local i = rawget(pn,"postinjections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + h = insert_node_before(h,n,newkern(leftkern)) + end end end else @@ -781,12 +784,12 @@ local function inject_kerns_only(head,where) if getsubtype(n) < 256 then local pn = rawget(properties,n) -- why can it be empty { } if pn then - pn = pn.replaceinjections - end - if pn then - local leftkern = pn.leftkern - if leftkern ~= 0 then - h = insert_node_before(h,n,newkern(leftkern)) + local i = rawget(pn,"replaceinjections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + h = insert_node_before(h,n,newkern(leftkern)) + end end end else @@ -829,14 +832,14 @@ local function inject_pairs_only(head,where) if p then local d = getfield(p,"post") if d then - local pn = pn.postinjections - if pn then - local leftkern = pn.leftkern - if leftkern ~= 0 then + local i = rawget(pn,"postinjections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then local t = find_tail(d) insert_node_after(d,t,newkern(leftkern)) end - -- local rightkern = pn.rightkern + -- local rightkern = i.rightkern -- if rightkern and rightkern ~= 0 then -- insert_node_after(head,n,newkern(rightkern)) -- n = getnext(n) -- to be checked @@ -845,27 +848,27 @@ local function inject_pairs_only(head,where) end local d = getfield(p,"replace") if d then - local pn = pn.replaceinjections - if pn then - local leftkern = pn.leftkern - if leftkern ~= 0 then + local i = rawget(pn,"replaceinjections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then local t = find_tail(d) insert_node_after(d,t,newkern(leftkern)) end - -- local rightkern = pn.rightkern + -- local rightkern = i.rightkern -- if rightkern and rightkern ~= 0 then -- insert_node_after(head,n,newkern(rightkern)) -- n = getnext(n) -- to be checked -- end end else - local pn = pn.injections - if pn then - local leftkern = pn.leftkern - if leftkern ~= 0 then + local i = rawget(pn,"injections") + if i then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then setfield(p,"replace",newkern(leftkern)) end - -- local rightkern = pn.rightkern + -- local rightkern = i.rightkern -- if rightkern and rightkern ~= 0 then -- insert_node_after(head,n,newkern(rightkern)) -- n = getnext(n) -- to be checked @@ -874,17 +877,17 @@ local function inject_pairs_only(head,where) end else -- this is the most common case - local pn = pn.injections - if pn then - local yoffset = pn.yoffset + local i = rawget(pn,"injections") + if i then + local yoffset = i.yoffset if yoffset and yoffset ~= 0 then setfield(n,"yoffset",yoffset) end - local leftkern = pn.leftkern - if leftkern ~= 0 then + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then insert_node_before(head,n,newkern(leftkern)) end - local rightkern = pn.rightkern + local rightkern = i.rightkern if rightkern and rightkern ~= 0 then insert_node_after(head,n,newkern(rightkern)) n = getnext(n) -- to be checked @@ -902,23 +905,23 @@ local function inject_pairs_only(head,where) local h = d for n in traverse_id(glyph_code,d) do if getsubtype(n) < 256 then - local pn = rawget(properties,n) - if pn then - pn = pn.preinjections - end - if pn then - local yoffset = pn.yoffset - if yoffset and yoffset ~= 0 then - setfield(n,"yoffset",yoffset) - end - local leftkern = pn.leftkern - if leftkern ~= 0 then - h = insert_node_before(h,n,newkern(leftkern)) - end - local rightkern = pn.rightkern - if rightkern and rightkern ~= 0 then - insert_node_after(head,n,newkern(rightkern)) - n = getnext(n) -- to be checked + local p = rawget(properties,n) + if p then + local i = rawget(p,"preinjections") + if i then + local yoffset = i.yoffset + if yoffset and yoffset ~= 0 then + setfield(n,"yoffset",yoffset) + end + local leftkern = i.leftkern + if leftkern ~= 0 then + h = insert_node_before(h,n,newkern(leftkern)) + end + local rightkern = i.rightkern + if rightkern and rightkern ~= 0 then + insert_node_after(head,n,newkern(rightkern)) + n = getnext(n) -- to be checked + end end end else @@ -934,23 +937,23 @@ local function inject_pairs_only(head,where) local h = d for n in traverse_id(glyph_code,d) do if getsubtype(n) < 256 then - local pn = rawget(properties,n) - if pn then - pn = pn.postinjections - end - if pn then - local yoffset = pn.yoffset - if yoffset and yoffset ~= 0 then - setfield(n,"yoffset",yoffset) - end - local leftkern = pn.leftkern - if leftkern ~= 0 then - h = insert_node_before(h,n,newkern(leftkern)) - end - local rightkern = pn.rightkern - if rightkern and rightkern ~= 0 then - insert_node_after(head,n,newkern(rightkern)) - n = getnext(n) -- to be checked + local p = rawget(properties,n) + if p then + local i = rawget(p,"postinjections") + if i then + local yoffset = i.yoffset + if yoffset and yoffset ~= 0 then + setfield(n,"yoffset",yoffset) + end + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + h = insert_node_before(h,n,newkern(leftkern)) + end + local rightkern = i.rightkern + if rightkern and rightkern ~= 0 then + insert_node_after(head,n,newkern(rightkern)) + n = getnext(n) -- to be checked + end end end else @@ -966,23 +969,23 @@ local function inject_pairs_only(head,where) local h = d for n in traverse_id(glyph_code,d) do if getsubtype(n) < 256 then - local pn = rawget(properties,n) - if pn then - pn = pn.replaceinjections - end - if pn then - local yoffset = pn.yoffset - if yoffset and yoffset ~= 0 then - setfield(n,"yoffset",yoffset) - end - local leftkern = pn.leftkern - if leftkern ~= 0 then - h = insert_node_before(h,n,newkern(leftkern)) - end - local rightkern = pn.rightkern - if rightkern and rightkern ~= 0 then - insert_node_after(head,n,newkern(rightkern)) - n = getnext(n) -- to be checked + local p = rawget(properties,n) + if p then + local i = rawget(pn,"replaceinjections") + if i then + local yoffset = i.yoffset + if yoffset and yoffset ~= 0 then + setfield(n,"yoffset",yoffset) + end + local leftkern = i.leftkern + if leftkern and leftkern ~= 0 then + h = insert_node_before(h,n,newkern(leftkern)) + end + local rightkern = i.rightkern + if rightkern and rightkern ~= 0 then + insert_node_after(head,n,newkern(rightkern)) + n = getnext(n) -- to be checked + end end end else diff --git a/tex/context/base/lang-ini.mkiv b/tex/context/base/lang-ini.mkiv index 5a745a7d8..a55c4665a 100644 --- a/tex/context/base/lang-ini.mkiv +++ b/tex/context/base/lang-ini.mkiv @@ -366,6 +366,12 @@ \installcorenamespace{languagenumbers} +\appendtoks + % we need to reassign the number because new patterns can be defined later on + % so let's hope not that many \setups happen during a run + \global\expandafter\let\csname\??languagenumbers\currentlanguage\endcsname\undefined +\to \everysetuplanguage + \def\lang_basics_synchronize_yes {\zerocount % see below \global\expandafter\chardef\csname\??languagenumbers\currentlanguage\endcsname diff --git a/tex/context/base/node-aux.lua b/tex/context/base/node-aux.lua index 36e6ec27c..8f1146857 100644 --- a/tex/context/base/node-aux.lua +++ b/tex/context/base/node-aux.lua @@ -352,7 +352,7 @@ local function tonodes(str,fnt,attr) -- (str,template_glyph) -- moved from blob- n = new_glyph(fnt,s) end if attr then -- normally false when template --- setfield(n,"attr",copy_node_list(attr)) + -- setfield(n,"attr",copy_node_list(attr)) setfield(n,"attr",attr) end if head then diff --git a/tex/context/base/node-ref.lua b/tex/context/base/node-ref.lua index 78ef409bc..4c04e5ea7 100644 --- a/tex/context/base/node-ref.lua +++ b/tex/context/base/node-ref.lua @@ -32,9 +32,9 @@ local colors = attributes.colors local references = structures.references local tasks = nodes.tasks -local trace_backend = false trackers.register("nodes.backend", function(v) trace_backend = v end) local trace_references = false trackers.register("nodes.references", function(v) trace_references = v end) local trace_destinations = false trackers.register("nodes.destinations", function(v) trace_destinations = v end) +local trace_areas = false trackers.register("nodes.areas", function(v) trace_areas = v end) local report_reference = logs.reporter("backend","references") local report_destination = logs.reporter("backend","destinations") @@ -57,6 +57,7 @@ local setattr = nuts.setattr local getsubtype = nuts.getsubtype local hpack_list = nuts.hpack +local vpack_list = nuts.vpack local list_dimensions = nuts.dimensions local traverse = nuts.traverse local find_node_tail = nuts.tail @@ -69,6 +70,8 @@ local listcodes = nodes.listcodes local hlist_code = nodecodes.hlist local vlist_code = nodecodes.vlist local glue_code = nodecodes.glue +local glyph_code = nodecodes.glyph +local rule_code = nodecodes.rule local whatsit_code = nodecodes.whatsit local leftskip_code = skipcodes.leftskip @@ -83,68 +86,145 @@ local line_code = listcodes.line local new_rule = nodepool.rule local new_kern = nodepool.kern +local free_node = nuts.free + local tosequence = nodes.tosequence --- local function dimensions(parent,start,stop) --- stop = stop and getnext(stop) --- if parent then --- if stop then --- return list_dimensions(getfield(parent,"glue_set"),getfield(parent,"glue_sign"),getfield(parent,"glue_order"),start,stop) --- else --- return list_dimensions(getfield(parent,"glue_set"),getfield(parent,"glue_sign",getfield(parent,"glue_order"),start) --- end --- else --- if stop then --- return list_dimensions(start,stop) --- else --- return list_dimensions(start) --- end --- end --- end --- --- -- more compact +-- Normally a (destination) area is a box or a simple stretch if nodes but when it is +-- a paragraph we hav ea problem: we cannot calculate the height well. This happens +-- with footnotes or content broken across a page. + +local function vlist_dimensions(start,stop) + local temp + if stop then + temp = getnext(stop) + setfield(stop,"next",nil) + end + local v = vpack_list(start) + local w = getfield(v,"width") + local h = getfield(v,"height") + local d = getfield(v,"depth") + setfield(v,"list",nil) + free_node(v) + if temp then + setfield(stop,"next",temp) + end + return w, h, d +end -local function dimensions(parent,start,stop) +local function hlist_dimensions(start,stop,parent) + local last = stop and getnext(stop) if parent then - return list_dimensions(getfield(parent,"glue_set"),getfield(parent,"glue_sign"),getfield(parent,"glue_order"),start,stop and getnext(stop)) + return list_dimensions(getfield(parent,"glue_set"),getfield(parent,"glue_sign"),getfield(parent,"glue_order"),start,last) + else + return list_dimensions(start,last) + end +end + +local function dimensions(parent,start,stop) -- in principle we could move some to the caller + local id = getid(start) + if start == stop then + if id == hlist_code or id == vlist_code or id == glyph_code or id == rule_code then -- or image + if trace_areas then + report_area("dimensions taken of %a",nodecodes[id]) + end + return getfield(start,"width"), getfield(parent,"height"), getfield(parent,"depth") + else + if trace_areas then + report_area("dimensions calculated of %a",nodecodes[id]) + end + return hlist_dimensions(start,stop) -- one node only so simple + end + end + local last = stop and getnext(stop) + if parent then + -- todo: if no prev and no next and parent + -- todo: we need a a list_dimensions for a vlist + if getid(parent) == vlist_code then + local l = getlist(parent) + local c = l + local ok = false + while c do + if c == start then + ok = true + end + if ok and getid(c) == hlist_code then + break + else + c = getnext(c) + end + end + if ok and c then + if trace_areas then + report_area("dimensions taken of first line in vlist") + end + return getfield(c,"width"), getfield(c,"height"), getfield(c,"depth"), c + else + if trace_areas then + report_area("dimensions taken of vlist (probably wrong)") + end + return hlist_dimensions(start,stop,parent) + end + else + if trace_areas then + report_area("dimensions taken of range starting with %a using parent",nodecodes[id]) + end + return hlist_dimensions(start,stop,parent) + end else - return list_dimensions(start,stop and getnext(stop)) + if trace_areas then + report_area("dimensions taken of range starting with %a",nodecodes[id]) + end + return hlist_dimensions(start,stop) end end -- is pardir important at all? local function inject_range(head,first,last,reference,make,stack,parent,pardir,txtdir) - local width, height, depth = dimensions(parent,first,last) + local width, height, depth, line = dimensions(parent,first,last) if txtdir == "+TRT" or (txtdir == "===" and pardir == "TRT") then -- KH: textdir == "===" test added width = - width end local result, resolved = make(width,height,depth,reference) if result and resolved then - if head == first then - if trace_backend then - report_area("%s: %04i %s %s %s => w=%p, h=%p, d=%p, c=%S","head", - reference,pardir or "---",txtdir or "---",tosequence(first,last,true),width,height,depth,resolved) + if line then + -- special case, we only treat the first line in a vlist + local l = getlist(line) + if trace_areas then + report_area("%s: %04i %s %s %s => w=%p, h=%p, d=%p, c=%S","line", + reference,pardir or "---",txtdir or "---",tosequence(l,nil,true),width,height,depth,resolved) end - setfield(result,"next",first) - setfield(first,"prev",result) - return result, last + setfield(line,"list",result) + setfield(result,"next",l) + setfield(l,"prev",result) + return head, last else - if trace_backend then - report_area("%s: %04i %s %s %s => w=%p, h=%p, d=%p, c=%S","middle", - reference,pardir or "---",txtdir or "---",tosequence(first,last,true),width,height,depth,resolved) - end - local prev = getprev(first) - if prev then - setfield(prev,"next",result) - setfield(result,"prev",prev) + if head == first then + if trace_areas then + report_area("%s: %04i %s %s %s => w=%p, h=%p, d=%p, c=%S","head", + reference,pardir or "---",txtdir or "---",tosequence(first,last,true),width,height,depth,resolved) + end + setfield(result,"next",first) + setfield(first,"prev",result) + return result, last + else + if trace_areas then + report_area("%s: %04i %s %s %s => w=%p, h=%p, d=%p, c=%S","middle", + reference,pardir or "---",txtdir or "---",tosequence(first,last,true),width,height,depth,resolved) + end + local prev = getprev(first) + if prev then + setfield(prev,"next",result) + setfield(result,"prev",prev) + end + setfield(result,"next",first) + setfield(first,"prev",result) + -- if first == getnext(head) then + -- setfield(head,"next",result) -- hm, weird + -- end + return head, last end - setfield(result,"next",first) - setfield(first,"prev",result) --- if first == getnext(head) then --- setfield(head,"next",result) -- hm, weird --- end - return head, last end else return head, last @@ -152,9 +232,12 @@ local function inject_range(head,first,last,reference,make,stack,parent,pardir,t end local function inject_list(id,current,reference,make,stack,pardir,txtdir) - local width, height, depth, correction = getfield(current,"width"), getfield(current,"height"), getfield(current,"depth"), 0 - local moveright = false - local first = getlist(current) + local width = getfield(current,"width") + local height = getfield(current,"height") + local depth = getfield(current,"depth") + local correction = 0 + local moveright = false + local first = getlist(current) if id == hlist_code then -- box_code line_code -- can be either an explicit hbox or a line and there is no way -- to recognize this; anyway only if ht/dp (then inline) @@ -193,7 +276,7 @@ local function inject_list(id,current,reference,make,stack,pardir,txtdir) local result, resolved = make(width,height,depth,reference) -- todo: only when width is ok if result and resolved then - if trace_backend then + if trace_areas then report_area("%s: %04i %s %s %s: w=%p, h=%p, d=%p, c=%S","box", reference,pardir or "---",txtdir or "----","[]",width,height,depth,resolved) end @@ -227,6 +310,11 @@ local function inject_areas(head,attribute,make,stack,done,skip,parent,pardir,tx while current do local id = getid(current) if id == hlist_code or id == vlist_code then + + -- see dimensions: this is tricky with split off boxes like inserts + -- where we can end up with a first and last spanning lines + + local r = getattr(current,attribute) -- test \goto{test}[page(2)] test \gotobox{test}[page(2)] -- test \goto{\TeX}[page(2)] test \gotobox{\hbox {x} \hbox {x}}[page(2)] @@ -432,7 +520,7 @@ local function makereference(width,height,depth,reference) -- height and depth a -- step = 0 local annot = nodeinjections.reference(width,height,depth,set) if annot then -annot = tonut(annot) + annot = tonut(annot) -- todo nofreferences = nofreferences + 1 local result, current if trace_references then @@ -581,12 +669,15 @@ function references.mark(reference,h,d,view) end function references.inject(prefix,reference,h,d,highlight,newwindow,layer) -- todo: use currentreference is possible +-- print(prefix,reference,h,d,highlight,newwindow,layer) local set, bug = references.identify(prefix,reference) if bug or #set == 0 then -- unknown ref, just don't set it and issue an error else -- check - set.highlight, set.newwindow, set.layer = highlight, newwindow, layer + set.highlight = highlight + set.newwindow = newwindow + set.layer = layer setreference(h,d,set) -- sets attribute / todo: for set[*].error end end diff --git a/tex/context/base/page-mix.mkiv b/tex/context/base/page-mix.mkiv index ece93c948..4a86dfcf4 100644 --- a/tex/context/base/page-mix.mkiv +++ b/tex/context/base/page-mix.mkiv @@ -296,7 +296,11 @@ {\setvalue{\??mixedcolumnsseparator#1}{#2}} \installmixedcolumnseparator\v!rule - {\vrule\mixedcolumnsparameter\c!rulethickness\relax} + {\vrule + \s!width \mixedcolumnsparameter\c!rulethickness + \s!height\mixedcolumnseparatorheight + \s!depth \mixedcolumnseparatordepth + \relax} \unexpanded\def\page_mix_command_inject_separator {\begingroup diff --git a/tex/context/base/publ-aut.lua b/tex/context/base/publ-aut.lua index 7045ca41f..dc5a707cf 100644 --- a/tex/context/base/publ-aut.lua +++ b/tex/context/base/publ-aut.lua @@ -18,7 +18,8 @@ local concat = table.concat local utfchar = utf.char local formatters = string.formatters -local P, C, V, Cs, Ct, lpegmatch, lpegpatterns = lpeg.P, lpeg.C, lpeg.V, lpeg.Cs, lpeg.Ct, lpeg.match, lpeg.patterns +local P, C, V, Cs, Ct, Cg, Cf, Cc = lpeg.P, lpeg.C, lpeg.V, lpeg.Cs, lpeg.Ct, lpeg.Cg, lpeg.Cf, lpeg.Cc +local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns local context = context local commands = commands @@ -47,7 +48,7 @@ local report = logs.reporter("publications","authors") -- authorspec = von, surnames, jr, firstnames -- authorspec = von, surnames, jr, firstnames, initials -local space = P(" ") +local space = lpegpatterns.whitespace local comma = P(",") local period = P(".") local dash = P("-") @@ -82,6 +83,8 @@ local p_initial = p_shortone * period * dash^0 + p_longone * (period + dash + P(-1)) local initialsplitter = p_initial * P(-1) + Ct((p_initial)^1) +local optionsplitter = Cf(Ct("") * Cg(C((1-space)^1) * space^0 * Cc(true))^1,rawset) + local function is_upper(str) local first = lpegmatch(firstcharacter,str) local okay = chardata[first] @@ -122,7 +125,7 @@ local function splitauthorstring(str) -- print("hit 2",author,nofhits,nofused,math.round(100*nofhits/nofused)) end if not detail then - local firstnames, vons, surnames, initials, juniors + local firstnames, vons, surnames, initials, juniors, options local split = lpegmatch(commasplitter,author) local n = #split detail = { @@ -224,12 +227,17 @@ local function splitauthorstring(str) juniors = lpegmatch(spacesplitter,split[3]) firstnames = lpegmatch(spacesplitter,split[4]) initials = lpegmatch(spacesplitter,split[5]) + options = split[6] + if options then + options = lpegmatch(optionsplitter,options) + end end if firstnames and #firstnames > 0 then detail.firstnames = firstnames end if vons and #vons > 0 then detail.vons = vons end if surnames and #surnames > 0 then detail.surnames = surnames end if initials and #initials > 0 then detail.initials = initials end if juniors and #juniors > 0 then detail.juniors = juniors end + if options and next(options) then detail.options = options end cache[author] = detail nofhits = nofhits + 1 end diff --git a/tex/context/base/publ-dat.lua b/tex/context/base/publ-dat.lua index 97ff543ca..bfb38645b 100644 --- a/tex/context/base/publ-dat.lua +++ b/tex/context/base/publ-dat.lua @@ -400,27 +400,29 @@ do -- we apply some normalization - local space = S(" \t\n\r\f") -- / " " - - ----- command = P("\\") * Cc("btxcmd{") * (R("az","AZ")^1) * Cc("}") - ----- command = P("\\") * (Carg(1) * C(R("az","AZ")^1) / function(list,c) list[c] = (list[c] or 0) + 1 return "btxcmd{" .. c .. "}" end) - local command = P("\\") * (Carg(1) * C(R("az","AZ")^1) * space^0 / function(list,c) list[c] = (list[c] or 0) + 1 return "btxcmd{" .. c .. "}" end) - local somemath = P("$") * ((1-P("$"))^1) * P("$") -- let's not assume nested math - local any = P(1) - local done = P(-1) - local one_l = P("{") / "" - local one_r = P("}") / "" - local two_l = P("{{") / "" - local two_r = P("}}") / "" - local special = P("#") / "\\letterhash" - - local filter_0 = S('\\{}') - local filter_1 = (1-filter_0)^0 * filter_0 - local filter_2 = Cs( + local space = S(" \t\n\r\f") -- / " " + local collapsed = space^1/" " + + ----- command = P("\\") * Cc("btxcmd{") * (R("az","AZ")^1) * Cc("}") + ----- command = P("\\") * (Carg(1) * C(R("az","AZ")^1) / function(list,c) list[c] = (list[c] or 0) + 1 return "btxcmd{" .. c .. "}" end) + local command = P("\\") * (Carg(1) * C(R("az","AZ")^1) * space^0 / function(list,c) list[c] = (list[c] or 0) + 1 return "btxcmd{" .. c .. "}" end) + local somemath = P("$") * ((1-P("$"))^1) * P("$") -- let's not assume nested math + ----- character = lpegpatterns.utf8character + local any = P(1) + local done = P(-1) + local one_l = P("{") / "" + local one_r = P("}") / "" + local two_l = P("{{") / "" + local two_r = P("}}") / "" + local special = P("#") / "\\letterhash" + + local filter_0 = S('\\{}') + local filter_1 = (1-filter_0)^0 * filter_0 + local filter_2 = Cs( -- {{...}} ... {{...}} -- two_l * (command + special + any - two_r - done)^0 * two_r * done + -- one_l * (command + special + any - one_r - done)^0 * one_r * done + - (somemath + command + special + any )^0 + (somemath + command + special + collapsed + any)^0 ) -- Currently we expand shortcuts and for large ones (like the acknowledgements @@ -833,7 +835,7 @@ do local v = function(dataset,filename) report("no loader for file %a with filetype %a",filename,filetype) end - t[k] = v + t[filetype] = v return v end) diff --git a/tex/context/base/publ-ini.lua b/tex/context/base/publ-ini.lua index fe1007d88..2d85637a2 100644 --- a/tex/context/base/publ-ini.lua +++ b/tex/context/base/publ-ini.lua @@ -2263,7 +2263,7 @@ do end - -- entry + -- entry (we could provide a generic one) do diff --git a/tex/context/base/publ-ini.mkiv b/tex/context/base/publ-ini.mkiv index 4bfb7db8f..c9670f535 100644 --- a/tex/context/base/publ-ini.mkiv +++ b/tex/context/base/publ-ini.mkiv @@ -1378,6 +1378,9 @@ %D In-text entries: +\definebtxcitevariant + [entry] + \unexpanded\def\placecitation{\citation[entry]} % [#1] \unexpanded\def\btxhandleciteentry diff --git a/tex/context/base/publ-tra.lua b/tex/context/base/publ-tra.lua index 2b5d63a83..1c39aef97 100644 --- a/tex/context/base/publ-tra.lua +++ b/tex/context/base/publ-tra.lua @@ -92,10 +92,10 @@ function tracers.showdatasetcompleteness(settings) local fielddata = specification and specifications[specification] or specifications.apa local categories = fielddata.categories - local lpegmatch = lpeg.match - local texescape = lpeg.patterns.texescape + -- local lpegmatch = lpeg.match + -- local texescape = lpeg.patterns.texescape - local preamble = { "|lTBw(5em)|lBTp(10em)|pl|" } + local preamble = { "|lTBw(5em)|lBTp(10em)|plT|" } local function identified(tag,category,crossref) ctx_NC() @@ -114,12 +114,13 @@ function tracers.showdatasetcompleteness(settings) ctx_NC() if indirect then if value then - context("\\darkblue %s",lpegmatch(texescape,value)) + context("\\darkblue") + ctx_verbatim(value) else context("\\darkred\\tttf [missing crossref]") end elseif value then - context(lpegmatch(texescape,value)) + ctx_verbatim(value) else context("\\darkred\\tttf [missing value]") end @@ -133,9 +134,10 @@ function tracers.showdatasetcompleteness(settings) ctx_NC() context(key) ctx_NC() if indirect then - context("\\darkblue %s",lpegmatch(texescape,value)) + context("\\darkblue") + ctx_verbatim(value) elseif value then - context(lpegmatch(texescape,value)) + ctx_verbatim(value) end ctx_NC() ctx_NR() foundfields[key] = nil @@ -145,7 +147,7 @@ function tracers.showdatasetcompleteness(settings) local function special(done,key,value) ctx_NC() if not done then ctx_monobold("special") end ctx_NC() context(key) - ctx_NC() context(lpegmatch(texescape,value)) + ctx_NC() ctx_verbatim(value) ctx_NC() ctx_NR() return done or true end @@ -153,7 +155,7 @@ function tracers.showdatasetcompleteness(settings) local function extra(done,key,value) ctx_NC() if not done then ctx_monobold("extra") end ctx_NC() context(key) - ctx_NC() context(lpegmatch(texescape,value)) + ctx_NC() ctx_verbatim(value) ctx_NC() ctx_NR() return done or true end @@ -328,27 +330,31 @@ function tracers.showdatasetauthors(settings) if not dataset or dataset == "" then dataset = "standard" end if not field or field == "" then field = "author" end - local function flush(ai,k,i) + local function row(i,k,v) + ctx_NC() + if i then + ctx_verbatim(i) + end + ctx_NC() + ctx_verbatim(k) + ctx_EQ() + if type(v) == "table" then + ctx_verbatim(concat(v, " | ")) + else + ctx_verbatim(v) + end + ctx_NC() + ctx_NR() + end + + local function authorrow(ai,k,i) local v = ai[k] if v then - ctx_NC() - if i then - ctx_verbatim(i) - end - ctx_NC() - ctx_verbatim(k) - ctx_EQ() - if type(v) == "table" then - ctx_verbatim(concat(v, " | ")) - else - ctx_verbatim(v) - end - ctx_NC() - ctx_NR() + row(i,k,v) end end - local function row(key,value) + local function commonrow(key,value) ctx_NC() ctx_rlap(function() ctx_verbatim(key) end) ctx_NC() ctx_EQ() ctx_verbatim(value) @@ -366,19 +372,23 @@ function tracers.showdatasetauthors(settings) context.tt() context.starttabulate { "|B|Bl|p|" } ctx_FL() - row("tag",tag) - row("field",field) - row("content",getfield(dataset,tag,field)) + commonrow("tag",tag) + commonrow("field",field) + commonrow("content",getfield(dataset,tag,field)) for i=1,#a do ctx_ML() local ai = a[i] - flush(ai,"original",i) - flush(ai,"snippets") - flush(ai,"initials") - flush(ai,"firstnames") - flush(ai,"vons") - flush(ai,"surnames") - flush(ai,"juniors") + authorrow(ai,"original",i) + authorrow(ai,"snippets") + authorrow(ai,"initials") + authorrow(ai,"firstnames") + authorrow(ai,"vons") + authorrow(ai,"surnames") + authorrow(ai,"juniors") + local options = ai.options + if options then + row(false,"options",sortedkeys(options)) + end end ctx_LL() context.stoptabulate() diff --git a/tex/context/base/publ-usr.lua b/tex/context/base/publ-usr.lua index 4650401ee..f01112279 100644 --- a/tex/context/base/publ-usr.lua +++ b/tex/context/base/publ-usr.lua @@ -6,13 +6,16 @@ if not modules then modules = { } end modules ['publ-usr'] = { license = "see context related readme files" } -local P, Cs, R, Cc, Carg = lpeg.P, lpeg.Cs, lpeg.R, lpeg.Cc, lpeg.Carg +local P, Cs, R, Cc, C, Carg = lpeg.P, lpeg.Cs, lpeg.R, lpeg.Cc, lpeg.C, lpeg.Carg local lpegmatch = lpeg.match local settings_to_hash = utilities.parsers.settings_to_hash local publications = publications local datasets = publications.datasets +local report = logs.reporter("publications") +local trace = false trackers.register("publications",function(v) trace = v end) + -- local str = [[ -- \startpublication[k=Berdnikov:TB21-2-129,t=article,a={{Berdnikov},{}},y=2000,n=2257,s=BHHJ00] -- \artauthor[]{Alexander}[A.]{}{Berdnikov} @@ -30,42 +33,27 @@ local datasets = publications.datasets -- \stoppublication -- ]] -local remapped = { - artauthor = "author", - arttitle = "title", +local lists = { + author = true, + editor = true, + -- artauthor = true, + -- arteditor = true, } -local function register(target,key,a,b,c,d,e) - key = remapped[key] or key - if b and d and e then - local s = nil - if b ~= "" and b then - s = s and s .. " " .. b or b - end - if d ~= "" and d then - s = s and s .. " " .. d or d - end - if e ~= "" and e then - s = s and s .. " " .. e or e - end - if a ~= "" and a then - s = s and s .. " " .. a or a - end - local value = target[key] - if s then - if value then - target[key] = value .. " and " .. s - else - target[key] = s - end - else - if not value then - target[key] = s - end - end - else - target[key] = b - end +local function registervalue(target,key,value) + target[key] = value +end + +-- Instead of being generic we just hardcode the old stuff: + +local function registerauthor(target,key,juniors,firstnames,initials,vons,surnames) + local value = target[key] + target[key]= ((value and value .. " and {") or "{") .. + vons .. "},{" .. + surnames .. "},{" .. + juniors .. "},{" .. + firstnames .. "},{" .. + initials .. "}" end local leftbrace = P("{") @@ -75,14 +63,25 @@ local rightbracket = P("]") local backslash = P("\\") local letter = R("az","AZ") -local key = backslash * Cs(letter^1) * lpeg.patterns.space^0 -local mandate = leftbrace * Cs(lpeg.patterns.balanced) * rightbrace + Cc(false) -local optional = leftbracket * Cs((1-rightbracket)^0) * rightbracket + Cc(false) -local value = optional^-1 * mandate^-1 * optional^-1 * mandate^-2 +local skipspaces = lpeg.patterns.whitespace^0 +local key = Cs(letter^1) +local value = leftbrace * Cs(lpeg.patterns.balanced) * rightbrace +local optional = leftbracket * Cs((1-rightbracket)^0) * rightbracket + +local authorkey = (P("artauthor") + P("author")) / "author" + + (P("arteditor") + P("editor")) / "editor" +local authorvalue = (optional + Cc("{}")) * skipspaces -- [juniors] + * (value + Cc("{}")) * skipspaces -- {firstnames} + * (optional + Cc("{}")) * skipspaces -- [initials] + * (value + Cc("{}")) * skipspaces -- {vons} + * (value + Cc("{}")) * skipspaces -- {surnames} + +local keyvalue = Carg(1) * authorkey * skipspaces * authorvalue / registerauthor + + Carg(1) * key * skipspaces * value / registervalue -local pattern = ((Carg(1) * key * value) / register + P(1))^0 +local pattern = (backslash * keyvalue + P(1))^0 -function publications.addtexentry(dataset,settings,content) +local function addtexentry(dataset,settings,content) local current = datasets[dataset] local settings = settings_to_hash(settings) local data = { @@ -90,10 +89,38 @@ function publications.addtexentry(dataset,settings,content) category = settings.category or settings.t or "article", } lpegmatch(pattern,content,1,data) -- can set tag too - current.userdata[data.tag] = data - current.luadata[data.tag] = data - publications.markasupdated(current) + local tag = data.tag + current.userdata[tag] = data + current.luadata[tag] = data + current.details[tag] = nil return data end -commands.addbtxentry = publications.addtexentry +local pattern = ( Carg(1) + * P("\\startpublication") + * skipspaces + * optional + * C((1 - P("\\stoppublication"))^1) + * P("\\stoppublication") / addtexentry + + P("%") * (1-lpeg.patterns.newline)^0 + + P(1) +)^0 + +function publications.loaders.bbl(dataset,filename) + local dataset, fullname = publications.resolvedname(dataset,filename) + if not fullname then + return + end + local data = io.loaddata(filename) or "" + if data == "" then + report("empty file %a, nothing loaded",fullname) + return + end + if trace then + report("loading file %a",fullname) + end + lpegmatch(pattern,data,1,dataset) +end + +publications.addtexentry = addtexentry +commands.addbtxentry = addtexentry diff --git a/tex/context/base/s-fonts-ligatures.mkiv b/tex/context/base/s-fonts-ligatures.mkiv index 21d8efe34..3453aa010 100644 --- a/tex/context/base/s-fonts-ligatures.mkiv +++ b/tex/context/base/s-fonts-ligatures.mkiv @@ -70,9 +70,15 @@ \eTD \stoptexdefinition +\def\showotfligaturescells{3} +%def\showotfligaturesnx {12} +%def\showotfligatureswidth{18em} +\def\showotfligaturesnx {\the\numexpr 3*\showotfligaturescells} +\def\showotfligatureswidth{\the\dimexpr6em*\showotfligaturescells} + \starttexdefinition showotfligaturesbanner #1 \bTR[frame=off] - \bTD [nx=12,width=18em,align={middle,lohi},height=4ex] + \bTD [nx=\showotfligaturesnx,width=\showotfligatureswidth,align={middle,lohi},height=4ex] \tttf #1 \eTD \eTR @@ -132,7 +138,7 @@ \starttexdefinition showotfligaturesdefaults \bTR - \bTD [nx=12,width=18em,align=middle,height=4ex,frame=off] + \bTD [nx=\showotfligaturesnx,width=\showotfligatureswidth,align=middle,height=4ex,frame=off] \start \LigatureFont fb \stop \quad \start \LigatureFont ff \stop \quad \start \LigatureFont fi \stop \quad @@ -156,6 +162,8 @@ \showotfligaturesextremes {#2} \stoptexdefinition +% todo: n -> and split in lua + \starttexdefinition showotfligaturesexamples \showotfligaturesexample {leafing,baffling,efficient,shifffahrt} diff --git a/tex/context/base/s-structure-sections.mkiv b/tex/context/base/s-structure-sections.mkiv new file mode 100644 index 000000000..daaab5abc --- /dev/null +++ b/tex/context/base/s-structure-sections.mkiv @@ -0,0 +1,80 @@ +%D \module +%D [ file=s-structure-sections, +%D version=2015.02.02, +%D title=\CONTEXT\ Style File, +%D subtitle=Show Structure Sections, +%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. + +\unprotect + +\startluacode + local context = context + local ctx_NC, ctx_NR = context.NC, context.NR + local ctx_bold = context.bold + + structures.tracers = structures.tracers or { } + + function structures.tracers.showsections() + + local list = structures.sections.registered + local keys = table.keys(list) + table.sort(keys,function(a,b) + local la, lb = list[a].level, list[b].level + if la == lb then + return a < b + else + return la < lb + end + end) + context.start() + context.switchtobodyfont { "tt" } + context.starttabulate { "||c||||" } + context.FL() + ctx_NC() ctx_bold("name") + ctx_NC() ctx_bold("level") + ctx_NC() ctx_bold("parent") + ctx_NC() ctx_bold("section") + ctx_NC() ctx_bold("coupling") + ctx_NC() context.NR() + context.ML() + for i=1,#keys do + local k = keys[i] + local v = list[k] + ctx_NC() ctx_bold(k) + ctx_NC() context(v.level) + ctx_NC() context(v.parent) + ctx_NC() context(v.section) + ctx_NC() context(v.coupling) + ctx_NC() context.NR() + end + context.LL() + context.stoptabulate() + context.stop() + + end +\stopluacode + + +\starttexdefinition showstructuresections + + % no settings yet + + \ctxlua{structures.tracers.showsections()} + +\stoptexdefinition + +\protect + +\continueifinputfile{s-structure-sections.mkiv} + +\starttext + + \showstructuresections + +\stoptext diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf Binary files differindex 35d1d9880..275184f80 100644 --- a/tex/context/base/status-files.pdf +++ b/tex/context/base/status-files.pdf diff --git a/tex/context/base/status-lua.pdf b/tex/context/base/status-lua.pdf Binary files differindex a133c3289..b9623e001 100644 --- a/tex/context/base/status-lua.pdf +++ b/tex/context/base/status-lua.pdf diff --git a/tex/context/base/strc-con.mkvi b/tex/context/base/strc-con.mkvi index e32c3dd61..4a9315f33 100644 --- a/tex/context/base/strc-con.mkvi +++ b/tex/context/base/strc-con.mkvi @@ -263,7 +263,9 @@ \def\strc_constructions_ignore_head {\constructionsheaddistance\zeropoint - \constructionsheadwidth \zeropoint} + \constructionsheadwidth \zeropoint + % we also need to make sure that no stretch creeps in (new per 2015-02-02, for Alan) + \settrue\c_strc_constructions_distance_none} \let\currentconstructionhash\??construction @@ -325,7 +327,7 @@ \else \strc_constructions_preroll_head\currentconstructionsample \ifzeropt\wd\constructionheadbox - \strc_constructions_ignore_head + \strc_constructions_ignore_head \else \strc_constructions_set_width_and_distance \fi @@ -530,6 +532,11 @@ % The setups. These only deal with placement of the descriptor and initializing the % environment. The wrapping happens elsewhere. +% todo: optimize the setups with +% +% \ifconditional\c_strc_constructions_distance_none : no need for skip +% \ifzeropt\wd\constructionheadbox : no need for box and skips + \startsetups[\??constructionrenderings:\v!left] \edef\p_strc_constructions_hang{\constructionparameter\c!hang}% \doifsetupselse{\??constructionrenderings:\v!left:\p_strc_constructions_hang} { diff --git a/tex/context/base/strc-doc.lua b/tex/context/base/strc-doc.lua index 24a705164..f91136f5d 100644 --- a/tex/context/base/strc-doc.lua +++ b/tex/context/base/strc-doc.lua @@ -128,8 +128,21 @@ local registered = sections.registered storage.register("structures/sections/registered", registered, "structures.sections.registered") +local function update(name,level,section) + for k, v in next, registered do + if k ~= name and v.coupling == name then + report_structure("updating section level %a to level of %a",k,name) + context.doredefinehead(k,name) + update(k,level,section) + end + end +end + function sections.register(name,specification) registered[name] = specification + local level = specification.level + local section = specification.section + update(name,level,section) end function sections.currentid() diff --git a/tex/context/base/strc-not.mkvi b/tex/context/base/strc-not.mkvi index 6d2a04fec..142696b28 100644 --- a/tex/context/base/strc-not.mkvi +++ b/tex/context/base/strc-not.mkvi @@ -1218,7 +1218,7 @@ \begstrut \strc_references_flush_destination_nodes \strc_notes_set_destination_attribute_text - \strc_notes_inject_text + \strc_notes_inject_text\relax \ifvmode\obeydepth\else\endstrut\fi % \obeydepth is new per 2015-01-10 \strc_constructions_stored_stop % \endgroup diff --git a/tex/context/base/strc-ref.lua b/tex/context/base/strc-ref.lua index 633fc112a..1a4ccecd8 100644 --- a/tex/context/base/strc-ref.lua +++ b/tex/context/base/strc-ref.lua @@ -1716,7 +1716,9 @@ function references.valid(prefix,reference,highlight,newwindow,layer) unknowns[str] = u + 1 end else - set.highlight, set.newwindow, set.layer = highlight, newwindow, layer + set.highlight = highlight + set.newwindow = newwindow + set.layer = layer currentreference = set[1] end -- we can do the expansion here which saves a call diff --git a/tex/context/base/strc-sec.mkiv b/tex/context/base/strc-sec.mkiv index 06a34c11a..26ddfaac0 100644 --- a/tex/context/base/strc-sec.mkiv +++ b/tex/context/base/strc-sec.mkiv @@ -431,11 +431,17 @@ \the\everysetuphead \to \everydefinehead +\newtoks\everyredefinehead + \appendtoks - \setstructurelevel\currenthead{\thenamedheadlevel\currenthead}% + \the\everyredefinehead \to \everydefinehead \appendtoks + \setstructurelevel\currenthead{\thenamedheadlevel\currenthead}% +\to \everyredefinehead + +\appendtoks % beware, this is a global register \begingroup \edef\currentsectionheadcoupling{\sectionheadcoupling\currenthead}% @@ -445,9 +451,11 @@ coupling = "\currentsectionheadcoupling", section = "\currentsectionheadsection", level = \currentsectionlevel, + % for statistical purposes: + parent = "\currentheadparent" })}% \endgroup -\to \everydefinehead +\to \everyredefinehead \appendtoks % \setevalue{\e!next \currenthead}{\donexthead [\currenthead]}% @@ -461,6 +469,15 @@ {\setuevalue\currenthead{\strc_sectioning_handle_nop[\currenthead]}}% \to \everysetuphead +\unexpanded\def\doredefinehead#1#2% called at lua end + {\pushmacro\currenthead + \pushmacro\currentheadparent + \edef\currenthead{#1}% + \edef\currentheadparent{#2}% + \the\everyredefinehead\relax + \popmacro\currentheadparent + \popmacro\currenthead} + \let\currentnamedsection\empty \unexpanded\def\startnamedsection diff --git a/tex/context/base/strc-tag.mkiv b/tex/context/base/strc-tag.mkiv index e538eff2d..e1198af4d 100644 --- a/tex/context/base/strc-tag.mkiv +++ b/tex/context/base/strc-tag.mkiv @@ -73,6 +73,8 @@ \def\t!registerpages {registerpages} % Span \def\t!registerpage {registerpage} % Span \def\t!registerpagerange {registerpagerange} % Span +\def\t!registerfrompage {registerfrompage} % Span +\def\t!registertopage {registertopage} % Span \def\t!registerseparator {registerseparator} % Span \def\t!table {table} % Table diff --git a/tex/context/base/typo-brk.lua b/tex/context/base/typo-brk.lua index f9a65c6ba..2a9c94c86 100644 --- a/tex/context/base/typo-brk.lua +++ b/tex/context/base/typo-brk.lua @@ -107,7 +107,8 @@ methods[2] = function(head,start) -- ( => (- local tmp head, start, tmp = remove_node(head,start) head, start = insert_node_before(head,start,new_disc()) - setfield(start,"attr",copy_nodelist(getfield(tmp,"attr"))) -- just a copy will do + -- setfield(start,"attr",copy_nodelist(getfield(tmp,"attr"))) -- just a copy will do + setfield(start,"attr",getfield(tmp,"attr")) setfield(start,"replace",tmp) local tmp = copy_node(tmp) local hyphen = copy_node(tmp) @@ -125,7 +126,8 @@ methods[3] = function(head,start) -- ) => -) local tmp head, start, tmp = remove_node(head,start) head, start = insert_node_before(head,start,new_disc()) - setfield(start,"attr",copy_nodelist(getfield(tmp,"attr"))) -- just a copy will do + -- setfield(start,"attr",copy_nodelist(getfield(tmp,"attr"))) -- just a copy will do + setfield(start,"attr",getfield(tmp,"attr")) setfield(start,"replace",tmp) local tmp = copy_node(tmp) local hyphen = copy_node(tmp) @@ -143,7 +145,8 @@ methods[4] = function(head,start) -- - => - - - local tmp head, start, tmp = remove_node(head,start) head, start = insert_node_before(head,start,new_disc()) - setfield(start,"attr",copy_nodelist(getfield(tmp,"attr"))) -- just a copy will do + -- setfield(start,"attr",copy_nodelist(getfield(tmp,"attr"))) -- just a copy will do + setfield(start,"attr",getfield(tmp,"attr")) setfield(start,"pre",copy_node(tmp)) setfield(start,"post",copy_node(tmp)) setfield(start,"replace",tmp) @@ -171,7 +174,8 @@ methods[5] = function(head,start,settings) -- x => p q r if middle then setfield(start,"replace",(tonodes(tostring(middle),font,attr))) end - setfield(start,"attr",copy_nodelist(attr)) -- todo: critical only -- just a copy will do + -- setfield(start,"attr",copy_nodelist(attr)) -- todo: critical only -- just a copy will do + setfield(start,"attr",attr) -- todo: critical only -- just a copy will do free_node(tmp) insert_break(head,start,10000,10000) end diff --git a/tex/context/base/typo-dua.lua b/tex/context/base/typo-dua.lua index 73b00f033..1e9b325a6 100644 --- a/tex/context/base/typo-dua.lua +++ b/tex/context/base/typo-dua.lua @@ -710,7 +710,7 @@ local function apply_to_list(list,size,head,pardir) if enddir and getsubtype(current) == parfillskip_code then -- insert the last enddir before \parfillskip glue local d = new_textdir(enddir) --- setfield(d,"attr",copy_node(getfield(current,"attr"))) + -- setfield(d,"attr",getfield(current,"attr")) head = insert_node_before(head,current,d) enddir = false done = true @@ -719,7 +719,7 @@ local function apply_to_list(list,size,head,pardir) if begindir and getsubtype(current) == localpar_code then -- local_par should always be the 1st node local d = new_textdir(begindir) --- setfield(d,"attr",copy_node(getfield(current,"attr"))) + -- setfield(d,"attr",getfield(current,"attr")) head, current = insert_node_after(head,current,d) begindir = nil done = true @@ -727,7 +727,7 @@ local function apply_to_list(list,size,head,pardir) end if begindir then local d = new_textdir(begindir) --- setfield(d,"attr",copy_node(getfield(current,"attr"))) + -- setfield(d,"attr",getfield(current,"attr")) head = insert_node_before(head,current,d) done = true end @@ -739,7 +739,7 @@ local function apply_to_list(list,size,head,pardir) end if enddir then local d = new_textdir(enddir) --- setfield(d,"attr",copy_node(getfield(current,"attr"))) + -- setfield(d,"attr",getfield(current,"attr")) head, current = insert_node_after(head,current,d) done = true end diff --git a/tex/context/base/typo-dub.lua b/tex/context/base/typo-dub.lua index 7437e2c44..a1c9de752 100644 --- a/tex/context/base/typo-dub.lua +++ b/tex/context/base/typo-dub.lua @@ -819,7 +819,7 @@ local function apply_to_list(list,size,head,pardir) if enddir and getsubtype(current) == parfillskip_code then -- insert the last enddir before \parfillskip glue local d = new_textdir(enddir) --- setfield(d,"attr",copy_node(getfield(current,"attr"))) + -- setfield(d,"attr",getfield(current,"attr")) head = insert_node_before(head,current,d) enddir = false done = true @@ -828,7 +828,7 @@ local function apply_to_list(list,size,head,pardir) if begindir and getsubtype(current) == localpar_code then -- local_par should always be the 1st node local d = new_textdir(begindir) --- setfield(d,"attr",copy_node(getfield(current,"attr"))) + -- setfield(d,"attr",getfield(current,"attr")) head, current = insert_node_after(head,current,d) begindir = nil done = true @@ -836,7 +836,7 @@ local function apply_to_list(list,size,head,pardir) end if begindir then local d = new_textdir(begindir) --- setfield(d,"attr",copy_node(getfield(current,"attr"))) + -- setfield(d,"attr",getfield(current,"attr")) head = insert_node_before(head,current,d) done = true end @@ -848,7 +848,7 @@ local function apply_to_list(list,size,head,pardir) end if enddir then local d = new_textdir(enddir) --- setfield(d,"attr",copy_node(getfield(current,"attr"))) + -- setfield(d,"attr",getfield(current,"attr")) head, current = insert_node_after(head,current,d) done = true end diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua index ff3230b5f..bef47218d 100644 --- a/tex/generic/context/luatex/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex/luatex-fonts-merged.lua @@ -1,6 +1,6 @@ -- merged file : luatex-fonts-merged.lua -- parent file : luatex-fonts.lua --- merge date : 01/30/15 15:28:21 +-- merge date : 02/03/15 21:36:49 do -- begin closure to overcome local limits and interference |