You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandoc Lua:如何为标题包裹Markdown块且不丢失Markdown语法

问题原因

原代码失效的核心原因是对pandoc文档结构的理解有误:

  • el.content 是Header元素内部存储标题文本的内联元素集合,仅能存放Str、Emph这类行内元素,不能放入块级元素
  • 你将块级类型的RawBlock插入内联集合,最后直接返回这个内联集合,会导致原有的一级标题块结构被完全破坏,pandoc无法识别该内容为标题,自然不会输出#开头的标题标记。

要实现块级元素包裹,需要直接返回由多个块级元素组成的序列,而非修改标题内部的行内内容。

修正后的过滤器代码
Header = function(el)
    if el.level == 1 then
        local div_start = pandoc.RawBlock('markdown', '::: test')
        local div_end = pandoc.RawBlock('markdown', ':::')
        -- 按顺序返回块:div起始标记、原完整标题、div结束标记
        return {div_start, el, div_end}
    end
    -- 其余层级标题原样返回
    return el
end
效果验证

使用你提供的测试文本,调用该过滤器转换后,输出内容和预期完全一致:

::: test
# Linux
:::
## Support for Linux users
Create a shell script

可选优化方案:如果不需要强制写死markdown原生fenced div语法,更推荐使用pandoc内置的Div结构实现,兼容性更强,输出HTML/PDF等其他格式时也能正确生成对应结构,pandoc输出markdown时会自动转为:::块语法:

Header = function(el)
    if el.level == 1 then
        return pandoc.Div(el, pandoc.Attr("", {"test"}))
    end
    return el
end

内容的提问来源于stack exchange,提问作者Fxp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 05:15:41