我正在尝试编写一个 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,
}
}
Run Code Online (Sandbox Code Playgroud)
我的 pandoc 命令是:
pandoc -s myfile.tex --lua-filter myfilter.lua -o myfile.rtf
Run Code Online (Sandbox Code Playgroud)
这里的主要问题是 pandoc 如何处理这些 mhchem 片段:默认情况下,pandoc 会删除所有无法解析的 LaTeX 代码。例子:
$ printf 'Nitrate (\\ce{NO3-})' | pandoc --from latex -t native
[Para [Str "Nitrate",Space,Str "()"]]
Run Code Online (Sandbox Code Playgroud)
我们想要保留这些片段,我们可以通过使用raw_tex扩展来保留这些片段:
$ printf 'Nitrate (\\ce{NO3-})' | pandoc --from latex+raw_tex -t native
[Para [Str "Nitrate",Space,Str "(",RawInline (Format "latex") "\\ce{NO3-}",Str ")"]]
Run Code Online (Sandbox Code Playgroud)
现在我们有机会匹配这个文本。正如我们所看到的,我们需要匹配 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
}
}
Run Code Online (Sandbox Code Playgroud)
这将删除 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
}
}
Run Code Online (Sandbox Code Playgroud)
最后,pandoc命令是:
pandoc --from latex+raw_tex -s myfile.tex --lua-filter myfilter.lua -o myfile.rtf
Run Code Online (Sandbox Code Playgroud)
正如@PaulKulchenko 指出的那样,用于匹配的模式不太正确。请参阅Lua 参考手册的“模式”部分。