如何将 Lua 代码转储到格式化文件中?

如何将 Lua 代码转储到格式化文件中?

从这种格式:

%% 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您必须保存字节码并使用\everyjobTeX 原语在每次运行时激活它。(我对版本进行了轻微修改,.dtx因为那里还有其他与该问题无关的细节。)


作为参考,你可以使用类似下面的命令访问上述内容

\long\def\pdfstrcmp#1#2{%
     \directlua{strcmp("\luaescapestring{#1}","\luaescapestring{#2}" )}%
}

(该pdfstrcmds包称之为\pdf@strcmp,因为与原始函数相比,它需要额外的扩展,因此如果使用不同的名称则更“安全”。在 LaTeX3 加载代码中,不必担心这一点,因为我们不会直接公开这一点,因此我们采取了略有不同的方法。)

相关内容