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
'\apptocmd
沙xpatch
的\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]()}}%
}
{}
{}