Основная проблема здесь заключается в том, как 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
}
}
, что приведет к удалению команды 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.