我使用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没有发现&#34;,&#34;包含在\ test。
我怎样才能将\ test理解为11后跟,后跟12而不是字符串11,12,最后用作\ compare的正确形成的参数?
答案 0 :(得分:3)
对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.
会起作用。