Hi Hans, can you add a option for the “way” key for \setupcounter which resets a counter for every section independent of the level which was requested by Peter Schorsch on the mailing list. I looked into the source file (strc-num.lua and strc-sec.mkiv) and only four lines have to be changed to add this feature (I used “head” for the name because there was a predefined variable). strc-sec.mkiv: \setvalue{\??headlevel\v!block}{0} \setvalue{\??headlevel\v!none }{-1} \setvalue{\??headlevel\v!text }{-2} +\setvalue{\??headlevel\v!head }{-3} strc-num.lua: function counters.setown(name,n,value) local cd = counterdata[name] if cd then local d = allocate(name,n) d.own = value d.number = (d.number or d.start or 0) + (d.step or 0) local level = cd.level if not level or level == -1 then -- -1 is signal that we reset manually - elseif level > 0 then + elseif level > 0 or level == -3 then check(name,d,n+1) elseif level == 0 then -- happens elsewhere, check this for block end synchronize(name,d) end end function counters.add(name,n,delta) local cd = counterdata[name] if cd and (cd.state == v_start or cd.state == "") then local data = cd.data local d = allocate(name,n) d.number = (d.number or d.start or 0) + delta*(d.step or 0) -- d.own = nil local level = cd.level if not level or level == -1 then -- -1 is signal that we reset manually if trace_counters then report_counters("adding, name: %s, level: manually, action: no checking",name) end elseif level == -2 then -- -2 is signal that we work per text if trace_counters then report_counters("adding, name: %s, level: text, action: checking",name) end check(name,data,n+1) - elseif level > 0 then + elseif level > 0 or level == -3 then -- within countergroup if trace_counters then report_counters("adding, name: %s, level: %s, action: checking within group",name,level) end check(name,data,n+1) elseif level == 0 then -- happens elsewhere if trace_counters then report_counters("adding, name: %s, level: %s, action: no checking",name,level) end else if trace_counters then report_counters("adding, name: %s, level: unknown, action: no checking",name) end end synchronize(name,d) return d.number -- not needed end return 0 end function counters.check(level) for name, cd in next, counterdata do - if cd.level == level then + if cd.level == level or level > 0 and cd.level == -3 then if trace_counters then report_counters("resetting, name: %s, level: %s",name,level) end reset(name) end end end The question for the counter.check function is if it should also reset the counter for each new sectionblock (replace my change above with “if cd.level == level then”) or only at the start of a new section (that’s how my change behaves now). Wolfgang