使用Pandoc将Latex转化为HTML,如何在转化中包含Lua脚本的输出?

我正在使用pandoc将LaTeX转换为HTML。但是,我在latex文件中包含了一个lua脚本(它从JSON文件中提取一些数据并将数据格式化为LaTeX)。当我转换为HTML时,脚本没有被执行,而是作为lua出现在输出中。

是否有一种方法可以获得纯latex输出来进行转换或在转换过程中运行脚本?

点赞
用户2425163
用户2425163

不幸的是,答案是“是的,但实际上是:不行”。

我的意思是你_可以_运行Lua代码,但是它很可能包含针对Luatex特定的代码,因此在pandoc中不起作用。

让我们看一个例子:

\documentclass{article}
\usepackage{luacode}
\begin{document}
You are runnig:
\begin{luacode}
tex.print(_VERSION)
\end{luacode}
\end{document}

当通过lualatex运行该脚本时,将报告用于执行代码的Lua版本(目前为“Lua 5.3”)。tex.print命令由lualatex提供。

为了看看pandoc如何处理这个问题,我们可以使用 pandoc --to=native将其转换为pandoc的内部格式。Pandoc不知道luacode环境,所以将其视为普通文本。

[Para [Str "You",Space,Str "are",Space,Str "runnig:"]
,Div ("",["luacode"],[])
 [Para [Str "tex.print(_VERSION)"]]]

我们看到该块变成了一个具有类luacode的div。可以运行一个Lua过滤器并执行其内容:

-- file: run-luacode.lua
function Div(d)
  local code = pandoc.utils.stringify(d)
  load(code)()
end

使用此代码:

pandoc my-test.latex --to=html --lua-filter=run-luacode.lua

会导致错误,因为在pandoc的Lua中未定义tex.print

Error running filter run-luacode.lua:
[string "tex.print(_VERSION)"]:1: attempt to index a nil value (global 'tex')
stack traceback:
        [string "tex.print(_VERSION)"]:1: in main chunk
        run-luacode.lua:3: in function 'Div'

当然,我们可以在pandoc过滤器中定义tex.print。例如,设置

tex = {['print'] = print}

至少会将结果打印到控制台。你可以设计一种机制,将其实际转换为pandoc的内部文档格式。有关详细信息,请参见https://pandoc.org/lua-filters.html

调用带有--from=latex+raw_tex的pandoc也可能是有益的,因为它使pandoc在 RawBlock元素中直接保留未知的luacode环境。这可能在过滤器中更容易处理。

2021-04-10 21:58:36