Pandoc 在 LaTeX+raw_tex 和 Lua 过滤器之后,对元素重新运行 LaTeX 过滤器

我一直在编写一个自定义的 LaTeX 读取器 Lua 过滤器,将一堆 LaTeX 源代码转换为 Pandoc Markdown,这将成为我几个文档的新源代码。我像下面这样运行常见过滤器。

pandoc file.tex \
  -f latex+raw_tex \
  -t markdown \
  -o file.md \
  --lua-filter myfilter.lua

这个过滤器非常好用。我已经能够将几个自定义 LaTeX 环境转换为 Div 等等。

然而,当我有标准的 LaTeX 嵌套 自定义环境中时,过滤器输出会保持不变,未被转换。例如。

\begin{custom_environment}
\begin{itemize}
\item foo
\item bar
\end{itemize}
\end{custom_environment}

自定义环境被我的过滤器很好地处理了,但内部的 itemizetabular 等未被处理,正如您所期望的那样。

有没有一种方式,可以使用标准的 latex 扩展名(即过滤器)处理自定义环境的内容?我假设这将是从 Lua 过滤器调用的。

我正在尝试避免的一个想法是将内容写入临时文件并在其上运行另一个 pandoc。我希望有更好的方法,因为这似乎是一个非常普遍的情况。谢谢!

点赞
用户2691113
用户2691113

我发现最好的解决方案是使用 pandoc.read 函数: https://pandoc.org/lua-filters.html#helper-functions

我使用它的方法如下:

internal_div = pandoc.Div(
    pandoc.read(
        contents_of_custom_environment,
        'latex'
    ).blocks,
    'div_label'
)

现在 internal_div 包含自定义环境处理后的 latex 内容。请注意,contents_of_custom_environment 只是一个字符串。

我尝试使用 walk_blockwalk_inline 函数,但无法像这样完全使它们工作。如果有更好的解决方案,欢迎回答。

2021-02-22 01:35:12