Общее решение, которое работает со всеми поддерживаемыми форматами вывода, может быть построено путем использования pandoc Lua filters : Функция pandoc.utils.hierarchicalize
может использоваться для получения иерархии документов. Мы можем использовать это, чтобы связать идентификаторы разделов с номерами разделов, которые впоследствии можно будет использовать для добавления этих номеров в ссылки без описания ссылок (например, [](#myheader)
).
local hierarchicalize = (require 'pandoc.utils').hierarchicalize
local section_numbers = {}
function populate_section_numbers (doc)
function populate (elements)
for _, el in pairs(elements) do
if el.t == 'Sec' then
section_numbers['#' .. el.attr.identifier] = table.concat(el.numbering, '.')
populate(el.contents)
end
end
end
populate(hierarchicalize(doc.blocks))
end
function resolve_section_ref (link)
if #link.content > 0 or link.target:sub(1, 1) ~= '#' then
return nil
end
local section_number = pandoc.Str(section_numbers[link.target])
return pandoc.Link({section_number}, link.target, link.title, link.attr)
end
return {
{Pandoc = populate_section_numbers},
{Link = resolve_section_ref}
}
Вышеуказанное должно быть сохранено в файл, а затем передано в pandoc с помощью опции --lua-filter
.
Пример
Используя пример из вопроса
# This is my header {#header}
## Some subsection
See section [](#header), especially [](#some-subsection)
Используя вышеупомянутый фильтр, последняя строка будет отображаться как «Смотрите раздел 1, особенно 1.1».
Не забудьте вызвать pandoc с параметром --number-sections
, иначе заголовки не будут пронумерованы.