【问题标题】:pandoc lua filter to replace tex macropandoc lua过滤器替换tex宏
【发布时间】:2019-10-16 16:25:57
【问题描述】:

我正在尝试编写一个 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

【问题讨论】:

    标签: lua pandoc


    【解决方案1】:

    这里的主要问题是 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

    【讨论】:

    • 好的,我真的很难弄清楚在 raw.format 之后写什么而不是“...”。有没有办法在 raw 上使用 gsub?
    • @user2165907 LaTeX 内容可以通过raw.text 访问。这是一个普通的 Lua 字符串,可以使用gsub 等进行操作。不要忘记我们必须返回一个 pandoc 元素,所以用pandoc.Str 包装结果。上面的代码已更新,现在包含一个工作示例。
    • 谢谢,我已经用正确的正则表达式编辑了您的建议(我们必须匹配 tex 命令,例如 \ce{SO_{4}^{2-}})。此外,这会渲染初始 tex 命令的原始内容......是否可以将其传递给不倾斜的乳胶数学环境,以便我们避免在最终 rtf 中获得 _^{} 符号? (实际上这可能必须是另一个帖子......)
    • 很好的编辑,谢谢。我认为后续问题需要一个额外的问题。看看pandoc.Mathpandoc.read
    【解决方案2】:

    你只需要转义特殊字符before而不是before和after,你还需要转义-,但不需要转义@987654323 @,所以"\\ce%{%NO3-%}%" 应该是"\\ce{NO3%-}"。可以在Patterns chapter看到需要转义的“魔法字符”列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多