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