这里的主要问题是 pandoc 如何处理这些 mhchem sn-ps:默认情况下,pandoc 会丢弃所有无法解析的 LaTeX 代码。示例:
$ printf 'Nitrate (\\ce{NO3-})' | pandoc --from latex -t native
[Para [Str "Nitrate",Space,Str "()"]]
我们希望保留这些 sn-ps,我们可以使用 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
}
}
这将删除 tex 命令并在其中呈现原始代码。
为了匹配最初的例子:
return {
{
RawInline = function (raw)
local formula = raw.text:match '\\ce{NO3%-}'
if raw.format == 'latex' and formula then
return pandoc.Str('NO3')
end
end
}
}
最后,pandoc命令是:
pandoc --from latex+raw_tex -s myfile.tex --lua-filter myfilter.lua -o myfile.rtf
@PaulKulchenko 指出,用于匹配的模式并不完全正确。请参阅 Lua 参考手册的"Patterns" section。