lua 脚本是否完全取代了 TeX 宏定义命令和盟友?

lua 脚本是否完全取代了 TeX 宏定义命令和盟友?

LuaTeX 中的脚本是否lua完全消除了使用 TeX 宏定义命令\def\gdef\edef的需要\xdef

那么\exapndafter,,,和呢?\noexpand\protected\long\relax

答案1

可以直接从 lua 端访问 luatex 的排版功能,而无需使用 tex 宏,例如

http://wiki.luatex.org/index.php/TeX_without_TeX

然而这并不使用 TeX 宏扩展根本例如,您可以(并且人们已经)安排通过 Lua 绑定直接从某个数据库中提取文本,并直接构造排版节点,就像正常 tex 工作流程所生成的那样。

因此,由于 Lua 不使用 tex 宏扩展,询问它是否可以替换单独的宏相关命令(例如 def 或 expandafter)是没有意义的。

答案2

不,Lua 不会取代 TeX 的宏扩展语言。 LuaTeX 实现了一个token库,该库在 TeX 宏和 Lua 之间提供了一些非常有限的互操作性。例如,您可以提前扫描标记,从而模拟\hskip不接受参数但扫描维度的基元的行为。

\def\scanandprintskip{%
  \directlua{
    local d = token.scan_dimen()
    tex.sprint(d)
  }%
}

\dimen0=10pt
\scanandprintskip 12pt
\scanandprintskip \dimen0
\scanandprintskip garbage % ! Missing number, treated as zero.

\bye

您还可以设置控制序列的替换文本,但不能访问参数规范,即以这种方式定义的控制序列不接受参数。

\directlua{token.set_macro("hello", "World!")}

\hello % prints World!

\bye

但据我所知,除了将其作为字符串作为函数参数传递之外,没有其他方法可以从 Lua 访问控制序列的替换文本。

\def\hello{World!}

\directlua{tex.sprint([[\hello]])}

\bye

请记住,\directlua始终执行完整的 edef 类型扩展,但是可以使用例如来抑制它\unexpanded

有关详细信息,请参阅部分token图书馆”在里面LuaTeX 手册

相关内容