我推测这些问题是相关的。
\documentclass[a4paper]{article}
\begin{document}
\message{\edef\foo{Foo}\foo}
% gives
%! Undefined control sequence.
%l.5 \message{\edef\foo
% {Foo}\foo
\newcommand\testing[2][foo]{#1 = #2}
\testing[Foo]{Bar} % works
\testing{bar} % works
\directlua{\testing[Foo]{Bar}}
% or
\directlua{\testing{bar}}
% gives
%! Use of \\testing doesn't match its definition.
%\kernel@ifnextchar ...rved@d =#1\def \reserved@a {
% #2}\def \reserved@b {#3}\f...
%
%l.16 \directlua{\testing
% [Foo]{Bar}}
\end{document}
还有许多其他版本。 \defs 和 \edefs 在编写宏时很有用。我不知道可选参数的官方文档在哪里(我只有 TeXbook 和 Lamport 的书,这本书的出版日期比这两本书晚),但我在网上阅读的可选参数说明并没有提到生成的宏只能在代码的某些部分使用。
请有人解释一下发生了什么,并告诉我在哪里可以找到完整的详细信息:特别是哪些东西可以放入 \directlua 中,哪些东西不能放入,以及哪些其他 TeX/LaTeX 命令以这种方式运行。我正在编写大量宏以放入 \directlua 中,不想再被抓住!
答案1
标记必须扩展为有效的 Lua 块。
观察其实际作用的最简单方法是使用\write
具有类似行为但写入终端而不是 Lua 解释器的程序,这样您就可以看到它在做什么。
\documentclass{article}
\begin{document}
\def\aaa{\bbb}
\def\bbb{x={1,2,\ccc}}
\def\ccc{3}
\immediate\write20{\aaa}
\def\ccc{4}
\immediate\write20{\aaa}
\immediate\write20{\def\ccc{3}\aaa}
\end{document}
产生终端输出
x={1,2,3}
x={1,2,4}
\def 4{3}x={1,2,4}
所以正如您所看到的,前两种形式是可以的,并且可以产生有效的 Lua。
但在仅扩展的上下文中,不可扩展的标记(如)\def
是无效的,并且不会发生赋值,因此\def\ccc{3}
不会定义\ccc
为 3。\def
保持为\def
,\ccc
恰好扩展到4
此处(如果它没有被定义,它会给出错误,如您在问题中所示),然后由不可扩展的标记组成,因此写入为自身。如果您使用而不是 ,则{3}
生成的输出将不是有效的 Lua 。\directlua
\write
通过 定义的所有宏\def
都是可扩展的,并且 TeX 基元(例如\def
或 )\if
根据定义是可扩展或不可扩展的(TeXBook 指定了每个基元是否可扩展)。(或者当然可以参阅 luatex 手册以了解其他 luatex 基元)。