-- This filter creates prefixes for figures and tables in appendices. -- List of appendix names local abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" -- Default prefix local prefix = "" -- Default pre-prefex if appendices exceed 26 local preprefix = "" -- Prefix counter local intprefix = 0 -- Pre-prefix counter local intpreprefix = 0 -- Table counter local tblnum = 0 -- Figure counter local fignum = 0 -- Appendix counter local appnum = 0 -- Table table local tbl = {} -- Figure table local fig = {} -- New style already used local newsppendixstyle = true -- Word for appendix local appendixword = "Appendix" local referenceword = "References" getappendixword = function(meta) if meta.language and meta.language["crossref-apx-prefix"] then appendixword = pandoc.utils.stringify(meta.language["crossref-apx-prefix"]) end -- Is there another word for reference section? if meta.language and meta.language["section-title-references"] then referenceword = pandoc.utils.stringify(meta.language["section-title-references"]) end end -- return table number associated with id local tbllabel = function(id) if id ~= "" then -- Is id in tbl? if tbl[id] then -- Do nothing else -- Add id to tbl tblnum = tblnum + 1 tbl[id] = tblnum end return tbl[id] end end -- return figure number associated with id local figlabel = function(id, ss) if id ~= "" then -- Is id in fig? if fig[id] then -- Do nothing else if ss then -- Add id to fig fig[id] = fignum .. ss else -- increment fignum fignum = fignum + 1 -- Add id to fig fig[id] = fignum end end end return fig[id] end local after_reference = false local walkblock = function(b) if b.tag == "Div" and b.identifier and b.identifier:find("^apx%-") then after_reference = true return nil end -- Increment prefix for every level-1 header after References if b.tag == "Header" and b.level == 1 then local headerfirstword = pandoc.utils.stringify(b.content[1]) if headerfirstword == referenceword or headerfirstword == "References" then after_reference = true return nil end if headerfirstword == appendixword or headerfirstword == "Appendix" or (b.identifier and b.identifier:find("^apx%-")) or after_reference then after_reference = true if not (b.identifier and b.identifier:find("^apx%-")) then b.identifier = "apx-" .. b.identifier end if (headerfirstword == appendixword or headerfirstword == "Appendix") and newsppendixstyle then print( "This style of creating appendices is deprecated:\n\n# Appendix A\n\n#Relationship Descriptive Scale\n\nInstead, use a single descriptive level-1 heading,\nfollowed by a an identifier with the apx prefix:\n\n# Relationship Description Scale {#apx-relationship}\n") newsppendixstyle = false end appnum = appnum + 1 if intprefix == 26 then intprefix = 0 intpreprefix = intpreprefix + 1 preprefix = preprefix .. pandoc.text.sub(abc, intpreprefix, intpreprefix) end intprefix = intprefix + 1 tblnum = 0 fignum = 0 prefix = preprefix .. pandoc.text.sub(abc, intprefix, intprefix) if b.attr then b.attr.attributes.appendixtitle = prefix end end end -- Assign prefixes and numbers if b.identifier then if b.identifier:find("^tbl%-") then b.attributes.prefix = prefix b.attributes.tblnum = tbllabel(b.identifier) else if b.identifier:find("^fig%-") then b.attributes.prefix = prefix b.attributes.fignum = figlabel(b.identifier) b.content:walk { Image = function(img) img.attributes.prefix = prefix img.attributes.fignum = figlabel(b.identifier) end } local subfigcount = 0 -- Find subfigures b.content:walk { Block = function(bb) if bb.identifier then if bb.identifier:find("^fig%-") then subfigcount = subfigcount + 1 b.attributes.hassubfigs = "true" bb.attributes.prefix = prefix bb.attributes.subfigscript = pandoc.text.sub(abc, subfigcount, subfigcount) bb.attributes.fignum = figlabel(bb.identifier, bb.attributes.subfigscript) end end end } else b:walk { Figure = function(fg) if fg.identifier then if fg.identifier:find("^fig%-") then fg.attributes.prefix = prefix fg.attributes.fignum = figlabel(fg.identifier) fg.content:walk { Image = function(img) img.attributes.prefix = prefix img.attributes.fignum = figlabel(fg.identifier) end } end end end } end end if b.identifier:find("^apx%-") then local a = pandoc.Header(1, appendixword .. " " .. prefix) return pandoc.List({ a, b }) else return b end end end local filter = { traverse = 'topdown', Meta = getappendixword, Block = walkblock } return filter