将代码附加到 \directlua 原语

将代码附加到 \directlua 原语

LuaTeX 提供了原语\directlua,该原语在 1.6.1 节中有详细描述。LuaTeX 参考手册。基本上,这个原语运行 Lua 代码。它的语法是:

\directlua ⟨general text⟩
\directlua name ⟨general text⟩ ⟨general text⟩
\directlua ⟨16-bit number⟩ ⟨general text⟩

由于一些需要花很长时间解释的原因,我想每次\directlua使用时都运行一些自定义(TeX)代码正常\directlua工作。此自定义代码将仅使用传递的参数之一:Lua 代码;传递给原语的所有其他参数将被忽略。

我的第一个尝试是使用以另一个名称\let保存\directlua,然后\directlua使用覆盖\def。然而,这结果有问题,因为似乎不可能用 模拟\directlua的语法\def。话虽如此,至少可以说我不是很熟练。

然后我尝试etoolbox'\apptocmdxpatch\xapptocmd

\apptocmd{\directlua}{%
    % my custom code%
}
{}
{\typeout{could not append to \noexpand\directlua}\stop}

\xapptocmd{\directlua}{%
    % my custom code%
}
{}
{\typeout{could not append to \noexpand\directlua}\stop}

…但两次都失败了。

是否有可能做我想做的事情,即变成\directlua具有与 LuaTeX 完全相同语法的东西\directlua,并将其参数转发给 LuaTeX 的\directlua运行一些利用某些参数的代码?


对于任何感兴趣的人:我想要做的是将传递给\directlua字节码槽的 Lua 代码保存起来。我相信,即使在使用 Lua 代码的情况下,这也应该允许转储格式(目前,这是有问题的)。基本上,这个想法是:

% before the patch
% We save the plain \directlua so as to not run into a loop later
\let\plaindirectlua\directlua

% As said, this patch doesn't apply, but you get the idea
\apptocmd{\directlua}{%
    \newluabytecode\mybytecode%
    \plaindirectlua{lua.bytecode[\the\mybytecode]=function()#1 end}%
    \global\everyjob\expandafter{\the\everyjob\plaindirectlua{lua.bytecode[\the\mybytecode]()}}%
}
{}
{}

相关内容