Pandoc Lua过滤器替换tex宏

时间:2019-05-31 02:37:52

标签: lua pandoc

我正在尝试编写pandoc lua过滤器以替换乳胶软件包mhchem中的\ ce {}命令。

这是我在\ce{NO3-}示例中尝试过的方法,但是它不起作用,并且在rtf输出文件中呈现空白:

return {
  {
    Str = function (elem)
      if elem.text == "\\ce%{%NO3-%}%" then
        return {pandoc.Str "NO3"}
      else
        return elem
      end
    end,
  }
}

我的pandoc命令是:

pandoc -s myfile.tex --lua-filter myfilter.lua -o myfile.rtf

2 个答案:

答案 0 :(得分:1)

您只需要转义特殊字符之前而不是之前和之后,并且您还需要转义-,但是不需要转义{},因此"\\ce%{%NO3-%}%"应该是"\\ce{NO3%-}"。您可以在Patterns chapter中看到需要转义的“魔术字符”列表。

答案 1 :(得分:0)

这里的主要问题是pandoc如何处理这些mhchem代码片段:默认情况下,pandoc删除所有无法解析的LaTeX代码。示例:

$ printf 'Nitrate (\\ce{NO3-})' | pandoc --from latex -t native
[Para [Str "Nitrate",Space,Str "()"]]

我们想保留这些片段,我们可以使用raw_tex扩展名:

$ printf 'Nitrate (\\ce{NO3-})' | pandoc --from latex+raw_tex -t native
[Para [Str "Nitrate",Space,Str "(",RawInline (Format "latex") "\\ce{NO3-}",Str ")"]]

现在我们有机会匹配此文本。如我们所见,我们需要匹配RawInline元素而不是Str:

return {
  {
    RawInline = function (raw)
      local formula = raw.text:match '\\ce{([^}]+)}'
      if raw.format == 'latex' and formula then
        return pandoc.Str(formula)
      end
    end
  }
}

用于匹配的模式不太正确,如@PaulKulchenko指出的那样。请参阅Lua参考手册的"Patterns" section