[dev-context] Reset counter with each heading

Wolfgang Schuster wolfgang.schuster at gmail.com
Mon Oct 1 19:47:21 CEST 2012


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


More information about the dev-context mailing list