我正在尝试编写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
答案 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。