![lua 脚本是否完全取代了 TeX 宏定义命令和盟友?](https://linux22.com/image/357175/lua%20%E8%84%9A%E6%9C%AC%E6%98%AF%E5%90%A6%E5%AE%8C%E5%85%A8%E5%8F%96%E4%BB%A3%E4%BA%86%20TeX%20%E5%AE%8F%E5%AE%9A%E4%B9%89%E5%91%BD%E4%BB%A4%E5%92%8C%E7%9B%9F%E5%8F%8B%EF%BC%9F.png)
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 手册。