Я думаю, что это правильные идеи, но не правильные инструменты.Вместо использования m4 вы можете проверить фильтры pandoc , особенно встроенные фильтры Lua или отличный пакет panflute python.Они позволяют вам манипулировать фактической структурой документа, а не только текстовым представлением.
Например, этот фильтр Lua удаляет все заголовки в документе:
function Header (header)
header.level = header.level + 1
return header
end
Аналогично, вы можете определить свой собственныйоператор include, основанный на блоках кода:
```{include="FILENAME.md"}
```
Включить с этим фильтром:
function CodeBlock (cb)
if not cb.attributes.include then
return
end
local fh = io.open(cb.attributes.include)
local blocks = pandoc.read(fh:read('*a')).blocks
f:close()
return blocks
end
Также возможно применить фильтр только к подмножеству блоков (требуется небольшой взлом):
local blocks = …
local div = pandoc.Div(blocks)
local filtered_blocks = pandoc.walk_block(div, YOUR_FILTER).content
Вы можете комбинировать и расширять эти строительные блоки, чтобы написать свой собственный фильтр и определить свои расширения.Таким образом, можно получить основной документ, который включает все ваши подфайлы и при необходимости сдвигает уровни заголовков.