在 Lua 块内创建宏

在 Lua 块内创建宏

如何直接在 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 函数。

相关内容