diff options
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.pdfBinary files differ index 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.pdfBinary files differ index 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.pdfBinary files differ index 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 | 
