从 Lua 传递并运行 TeX 宏

从 Lua 传递并运行 TeX 宏
\starttext

\startluacode
    userdata = userdata or {}

    function userdata.simple(c)
        context("\\%s{%s}{%s}",c,1,4)
        context.par()
        context[c](1,4)
    end
\stopluacode

\define[1]\tolua{\ctxlua{userdata.simple("#1")}}

\define[2]\simple{-#1#2-}

\simple{22}{55}

% This is what I have to do, because the below causes an error:
\tolua{simple}

% This is what I'd prefer, because the above feels like a confusing mix of Lua and TeX:
\tolua{\simple}

\stoptext

这里我们将 TeX 宏 ( \simple) 传递到 Lua,然后从 Lua 调用它。它有效,但目标是写入\tolua{\simple}而不是\tolua{simple}。我认为我收到的错误与 TeX 宏被扩展有关。

答案1

要将宏从 TeX 传递到 Lua,必须遵循一个常见的习惯用法:

\directlua{whatever("\luaescapestring{\unexpanded{#1}}")}

在 ConTeXt 中,有些东西有不同的名称,所以这个习语应该是

\ctxlua{whatever("\luaescapestring{\normalunexpanded{#1}}")}

这样你的代码就可以顺利运行。

\starttext

\startluacode
    userdata = userdata or {}

    function userdata.simple(c)
        context("%s{%s}{%s}",c,1,4)
    end
\stopluacode

\define[1]\tolua{\ctxlua{userdata.simple("\luaescapestring{\normalunexpanded{#1}}")}}

\define[2]\simple{-#1#2-}

\simple{22}{55}

\tolua{\simple}

\stoptext

答案2

因此,我遇到的错误与在块内扩展\tolua{\simple}无关,而只是因为in触发了无效的 Lua 转义序列。这不是我所期望的错误 - 我以为我必须使用。但这就是需要做的一切:\simple\ctxlua\s"\simple"\noexpand

\starttext

\startluacode
    userdata = userdata or {}

    function userdata.simple(c)
        context("%s{%s}{%s}",c,1,4)
    end
\stopluacode

\define[1]\tolua{\ctxlua{userdata.simple([==[#1]==])}}

\define[2]\simple{-#1#2-}

\simple{22}{55}

\tolua{\simple}

\stoptext

相关内容