【问题标题】:declaring arbitrary variables for pandoc conversion using YAML metadata block使用 YAML 元数据块为 pandoc 转换声明任意变量
【发布时间】:2018-11-17 21:11:40
【问题描述】:

我最近才发现 Pandoc,所以我仍然习惯了它的许多功能。它看起来像是一个非常有用的工具,我很高兴能找到它的一些应用程序。我一直在查阅用户指南,虽然有 a section on what I'd like to know,但我似乎无法获得所需的输出。我不确定我是否正确阅读了该条目。

简单地说,我在.markdown 中有一个文档,它充当模板。通过这个模板,我想生成其他几个文档(可能是.odt.docx)。除了我想更改的几条信息之外,这些文档将大部分相同。我想知道的是,是否可以通过在文档顶部的 YAML 元数据中声明一个变量来更改这些信息。

例如,假设我的 .markdown 模板中有以下内容:

---
key-one: "value-one"
key-two: "value-two"
key-three: "value-three"
---
# DocumentTitle
## DocumentSubtitle

This line contains the first value, called $key-one$

This line contains the second value, called $key-two$

This line contains the third value, called $key-three$

有没有办法让 pandoc 用 YAML 元数据中声明的信息替换“占位符”,即key-onekey-two 等?这将导致:

This line contains the first value, called value-one
This line contains the second value, called value-two
This line contains the third value, called value-three

在用户指南上,它说:

如果未设置变量,pandoc 将在文档的元数据中查找键 - 可以使用 YAML 元数据块或使用 --metadata 选项进行设置。

从我在用户指南中可以找到的内容来看,我似乎无法在元数据中任意声明值。我找到了一些关于 Pandoc templates 的信息,但我不确定如何编辑这些(或创建自定义)以获得所需的输出。

如果有任何不清楚的地方,请告诉我,我会尽量说得更具体。提前致谢。

【问题讨论】:

    标签: yaml pandoc odt


    【解决方案1】:

    Pandoc 模板仅包含文档正文周围的页眉/页脚等,它们放置在您在模板中看到$body$ 的位置。因此模板不能用于替换文档正文中的变量。

    为此,您可以使用this pandoc filter,将其保存为meta-vars.lua

    local vars = {}
    
    function get_vars (meta)
      for k, v in pairs(meta) do
        if v.t == 'MetaInlines' then
          vars["$" .. k .. "$"] = {table.unpack(v)}
        end
      end
    end
    
    function replace (el)
      if vars[el.text] then
        return pandoc.Span(vars[el.text])
      else
        return el
      end
    end
    
    return {{Meta = get_vars}, {Str = replace}}
    

    并使用pandoc input.md --lua-filter meta-vars.lua 调用它

    【讨论】:

    • 太好了,非常感谢 - 非常感谢!正是我想要的。目前,它替换单个变量,而不是包含在同一 <p> 标记中的多个变量。转换为 HTML 表明 pandoc.Span 仅将 final 变量包装在 span 标记中。这不是一个大问题,但也许可以调整以上内容以改变这种行为......无论如何,再次感谢!
    • 很高兴为您提供帮助!嗯..“同一

      标签中包含多个变量”是什么意思?在元数据中,还是在正文中?变量名中不应包含空格...

    • 对不起,我的错误 - 我认为导致问题的只是我认为的格式错误。如果我将markdown文件中的占位符放在一行中,那么它似乎可以解决问题。我现在遇到的问题是span 标签会自动在其后添加一个空格,这是有道理的,除非您之后直接需要一些标点符号。像\$author\$, \$editor\$, and \$publisher\$ 这样的变量字符串将产生带有逗号分隔的字符串“author , editor , and publisher”。抱歉,如果这没有多大意义 - 很难在评论中解释。
    • @jbowman 我想我明白发生了什么:占位符需要是单独的字符串,即用空格或其他元素分隔。尝试使用空跨度作为分隔符,如下所示:\$author\$[]{}, \$editor\$[]{},Here 是解决此问题的实验性过滤器。
    • @tarleb 好的,谢谢 - 我一定会看看!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 2014-05-16
    相关资源
    最近更新 更多