如何为Pandoc Lua过滤器的Span和Div添加前置文本并设置内容加粗
Pandoc Lua过滤器优化方案
针对你遇到的问题,下面是修改后的过滤器代码,可实现添加“ANSWER: ”前缀、内容加粗,同时完整保留行内公式和代码块:
-- 基于YAML元数据`show-answers`控制答案显示/隐藏的Lua过滤器 -- 当`show-answers: True`时,显示带.answer类的Span和Div内容,否则隐藏 -- 优化:添加"ANSWER: "前缀,且内容加粗 local show_answers = nil function Pandoc (doc) show_answers = doc.meta['show-answers'] return doc end function Span (span) if span.classes:includes 'answer' then if show_answers then -- 构造加粗内容:前缀"ANSWER: " + 原Span内容 local bold_content = pandoc.Strong( pandoc.List:new{pandoc.Str("ANSWER: ")}:extend(span.content) ) -- 返回带新内容的Span,保留原属性 return pandoc.Span(bold_content, span.attr) else return {} end end end function Div (div) if div.classes:includes 'answer' then if show_answers then -- 创建开头的加粗前缀段落 local answer_header = pandoc.Para(pandoc.Strong(pandoc.Str("ANSWER: "))) local processed_content = pandoc.List:new() processed_content:insert(answer_header) -- 处理原Div内的每个块元素,保留代码块和公式,文本内容加粗 for _, block in ipairs(div.content) do if block.t == 'Para' then -- 段落内容整体加粗 processed_content:insert(pandoc.Para(pandoc.Strong(block.content))) else -- 代码块、公式等非段落元素直接保留 processed_content:insert(block) end end -- 返回带新内容的Div,保留原属性 return pandoc.Div(processed_content, div.attr) else return {} end end end return { {Pandoc = Pandoc}, {Div = Div}, {Span = Span} }
关键修改说明
- 解决类型报错:之前直接返回元素的
content属性,且添加文本时未正确构造Pandoc AST节点(如直接用字符串而非pandoc.Str对象),导致类型不匹配错误。现在通过创建标准AST节点(Span、Div、Strong、Para等)构建内容,避免类型冲突。 - 保留特殊内容:处理Div时,仅对段落文本应用加粗,代码块、公式等块元素直接保留原样,不会丢失原有内容。
- 实现需求功能:
- 行内答案(Span):将前缀与原内容一起包裹在加粗节点中,整体作为Span的内容。
- 块级答案(Div):先添加单独的加粗前缀段落,再处理原内容中的每个块元素,确保文本加粗的同时保留特殊元素。
测试你的用例后,生成的内容会在答案开头显示加粗的“ANSWER: ”,且原有的行内公式、代码块都能正常保留并显示。
内容的提问来源于stack exchange,提问作者mikebader
相关产品推荐
相关产品推荐

