фильтр pandoc lua для замены макроса tex - PullRequest
2 голосов
/ 31 мая 2019

Я пытаюсь написать фильтр pandoc lua, чтобы заменить команду \ ce {} из латексного пакета mhchem.

Это то, что я пробовал на примере \ce{NO3-}, но это не такwork и выводит пробел в выходной файл 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 ]

1 голос
/ 31 мая 2019

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

1 голос
/ 31 мая 2019

Вам нужно только экранировать специальные символы до их, а не до и после , и вам также нужно экранировать -, но не нужно экранировать {}, поэтому "\\ce%{%NO3-%}%" должно быть "\\ce{NO3%-}". Вы можете увидеть список «магических персонажей», которых нужно экранировать, в главе Patterns .

...