从这种格式:
%% testformat.ini
\input plain
\directlua {tex.enableprimitives('', tex.extraprimitives())}
\directlua {
testFunction = function ()
tex.print("This was print by Lua's testFunction.\par")
end
}
%% \directlua {testFunction()}
%% \bye
\dump
我使用 创建了一个 testformat.fmt $ luatex -ini testformat.ini
,但是当尝试将它与以下测试文件一起使用时:
%% test-testformat.tex
\directlua{testFunction()}
\bye
全局定义的函数 testFunction 丢失:
$ luatex -fmt testFormat.fmt test-testformat.tex
This is LuaTeX, Version beta-0.70.1-2011120612
(./test-testformat.tex
! LuaTeX error <\directlua >:1: attempt to call global 'testFunction' (a nil va
lue)
stack traceback:
<\directlua >:1: in main chunk.
l.2 \directlua{testFunction()}
?
我是否应该在 Lua 中做另一个技巧,或者它根本无法被转储,而我必须使用类似的东西\everyjob{\directlua{dofile("testformat.lua")}}
?
答案1
对于 LaTeX3l3bootstrap
模块,我们希望启用\pdfstrcmp
与 LuaTeX 使用 Lua 代码相同的功能。为了将其构建为格式,我们希望避免.lua
每次运行时都必须读取文件。Taco Hoekwater 建议使用lua.bytecode
。我们将其用作:
\directlua
{
lua.bytecode[1] = function ()
function strcmp (A, B)
if A == B then
tex.write("0")
elseif A < B then
tex.write("-1")
else
tex.write("1")
end
end
end
lua.bytecode[1]()
}
\everyjob\expandafter
{\the\everyjob\directlua{lua.bytecode[1]()}}
IE您必须保存字节码并使用\everyjob
TeX 原语在每次运行时激活它。(我对版本进行了轻微修改,.dtx
因为那里还有其他与该问题无关的细节。)
作为参考,你可以使用类似下面的命令访问上述内容
\long\def\pdfstrcmp#1#2{%
\directlua{strcmp("\luaescapestring{#1}","\luaescapestring{#2}" )}%
}
(该pdfstrcmds
包称之为\pdf@strcmp
,因为与原始函数相比,它需要额外的扩展,因此如果使用不同的名称则更“安全”。在 LaTeX3 加载代码中,不必担心这一点,因为我们不会直接公开这一点,因此我们采取了略有不同的方法。)