\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