如何直接在 LuaTeX 块内创建宏(重新)定义?
例如,
\directlua{tex.print("\\mymacro{test}")}
相当于
\mymacro{test}
在 TeX 中?
答案1
虽然其他解释是正确的,但我强烈建议使用另一种方法。\directlua
除了调用另一个文件外,不要在 中编写任何代码。请参阅我的长篇回答https://tex.stackexchange.com/a/33102/243
这样,您就可以tex.print("\\mymacro{test}")
在 Lua 文件中写入内容,而 TeX 不会看到它,因此您不需要保护字符串。
答案2
如果我正确理解了你和你的例子,你想 (1) 在 TeX 中自己定义一个宏;(2) 从 LuaTeX 生成一些包含对宏的调用的 TeX 代码;(3) 你想扩展 (评估) 该 TeX 代码。像这样吗?(ConTeXt 代码。)
% Define the macro we're going to use
\def\betweenXY#1%
{ X#1Y }
% Either print the backslash directly (don't forget to escape it!) (options 1 and 3)
% or use the fact that any macro you define ends up in the `context` (option 2)
% namespace in LuaTeX
\startluacode
tex.print('\\betweenXY{jolly}') % option 1
context.betweenXY('swagman') % option 2
\stopluacode
\directlua{tex.print('\\betweenXY{swagman}')} % option 3
答案3
布鲁诺回答了这个问题,但是这里是更正后的代码:
\def\mymacro#1{--#1--}
\directlua{tex.print("\noexpand\\mymacro{test}")}
Lua 代码将以作为参数\mymacro
进行调用。test
下面的代码
\def\mymacro#1{-#1}
\mymacro{test}
相当于
\directlua{tex.print("\noexpand\\def\noexpand\\mymacro\#1{-\#1-}")} % Same as using \def\mymacro#1{-#1-} in TeX
\directlua{tex.print("\noexpand\\mymacro{test}")} % Same as using \mymacro{test} in TeX
似乎必须在所有 TeX 宏上使用 \noexpand 来阻止 TeX 解释它们(基本上将它们用作文本字符串。如果不这样做,TeX 将在上面的字符串中看到 \def 并尝试定义一个宏,而不是将 \def 传递给 tex.print 函数。