在 lua 中构建 Latex/Tex 个参数

Building Latex/Tex arguments in lua

我使用 lua 做一些复杂的工作来为 Tex/LaTex 中的宏准备参数。

第一部分 这是一个愚蠢的最小示例:

\newcommand{\test}{\luaexec{tex.print("11,12")}}% aim to create 11,12
\def\compare#1,#2.{\ifthenelse{#1<#2}{less}{more}}
\string\compare11,12. : \compare11,12.\ %answer is less
\string\test : \test\ % answer is 11,12
\string\compare : \compare\test. % generate an error

最后一行产生错误。显然,Tex 没有检测到包含在 \test.

中的 ","

我怎样才能使 \test 被理解为 11 后跟 12 而不是字符串 11,12 最后用作 \compare 的正确格式的参数?

对 TeX 的工作原理存在一些误解。

您的 \compare 宏想要查找后跟逗号的内容,然后是句点后跟的内容。但是当你打电话给

\compare\test

没有找到逗号,所以 TeX 一直在寻找它,直到找到文件末尾或 \par (或空行)。请注意,TeX 从不 在查找宏的参数时扩展宏。

你可能会

\expandafter\compare\test.

前提是 \test 会立即扩展为所需格式的标记,但是不会,因为 \test 的扩展是

\luaexec{tex.print("11,12")}

逗号被大括号隐藏了,所以不算。但它仍然无济于事。

问题是一样的:当你这样做的时候

\newcommand{\test}{\luaexec{tex.print("11,12")}}

参数扩展。您可以使用 \edef 的“扩展定义”,但问题是 \luaexec 不是完全可扩展的。

如果你这样做

\edef\test{\directlua{tex.sprint("11,12")}}

然后

\expandafter\compare\test.

会起作用。