\directlua0{} 与 \directlua{} 有何区别

\directlua0{} 与 \directlua{} 有何区别

标题就是问题所在。根据 LuaTeX 手册,\directlua{code}命令和代码之间可能有一个 16 位数字,我\directlua0{code}到处都看到过。但我没有看到任何关于该数字的解释。

我没有代码问题。只是询问信息。

答案1

这是一个调试功能,如果您有很多调用,可以使用它\directlua来更轻松地找出错误来自何处。ID 用于查找名称,然后将其用作函数的名称,例如在堆栈跟踪中出现的名称。

举个例子:

\documentclass{article}
\directlua{
  error'Oh no, this failed.'
}
\stop

失败并显示以下消息

[\directlua]:1: Oh no, this failed.
stack traceback:
  [C]: in function 'error'
  [\directlua]:1: in main chunk.

这里给出了来源,如果您的文档中[\directlua]:1:有很多调用,这可能不是很有帮助。\directlua

相反,你可以为 Lua 段指定一个名称:

\documentclass{article}
\directlua{ lua.setluaname(1, "=[foobar]") }
\directlua1{
  error'Oh no, this failed.'
}
\stop

现在你得到错误

[foobar]:1: Oh no, this failed.
stack traceback:
  [C]: in function 'error'
  [foobar]:1: in main chunk.

因此,如果foobar您有一个更具描述性的字符串(例如包含调用的包名称\directlua),那么您将更容易找出问题的原因。当然,这需要您使用一个唯一的数字,在 LaTeX 中,您可以使用 分配一个\newluachunkname

如果您只想在几个地方使用一个名称,那么获得相同效果的更直接的方法是使用name关键字内联指定名称:

\documentclass{article}
\directlua name {=[foobar]} {
  error'Oh no, this failed.'
}
\stop

这将再次产生:

[foobar]:1: Oh no, this failed.
stack traceback:
  [C]: in function 'error'
  [foobar]:1: in main chunk.

因为\directlua这通常没什么用,因为直接错误也会显示 TeX 行号,这有助于进行调用,但如果您定义函数并传递它们,它仍然很有用。因为\latelua它往往更有用,因为 TeX 提供的行号没有那么有用。

最后,\directlua0您在某些软件包中看到的是无用的。理论上,它使用 ID 为 0 的注册名称进行此\directlua调用,但由于使用此名称的调用随处可见,而且没有人设置过,所以lua.setluaname(0, '...')这没什么区别。使用未分配名称的号码与一开始就未指定号码相同。

相关内容