在Lua中构建Latex/Tex参数。

我使用lua制作一些复杂的任务来准备Tex / LaTex宏的参数。

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

\newcommand{\test}{\luaexec{tex.print("11,12")}}% 目标为创建11,12
\def\compare#1,#2.{\ifthenelse{#1<#2}{less}{more}}
\string\compare11,12. : \compare11,12.\\ % 答案为 "less"
\string\test : \test\\ % 答案为 11,12
\string\compare : \compare\test. % 生成错误

最后一行会产生错误。显然,TeX没有检测到包含在\test中的“,”。

如何使\test被理解为11后跟逗号,然后是12,而不是字符串11,12,并最终用作正确形成的\compare 参数?

点赞
用户923955
用户923955

有几个关于 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.

将可以工作。

2015-05-05 21:16:01