【问题标题】:Building Latex/Tex arguments in lua在 lua 中构建 Latex/Tex 参数
【发布时间】:2015-05-04 08:32:23
【问题描述】:

我使用 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 的正确格式参数?

【问题讨论】:

    标签: lua latex tex


    【解决方案1】:

    对于 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.
    

    会起作用的。

    【讨论】:

    • 感谢 egreg 指出我的两个错误,我会这样总结: - 因为 Tex 在寻找参数时不展开,我必须使用 \expandafter 来获得所需的展开(这里展开的 \test) - 由于 \luaexec 不可扩展,我需要使用可扩展的 \directlua 我猜 edef 是完全扩展 \test 所必需的,因为 \expandafter 只扩展一次。为了检查我是否理解得很好,我也可以使用几个 \expandafter 和一个普通的 \def,对吗?有了这些修改,它工作正常!谢谢 !我会尝试将此转移到真实案例中。
    • 指出困难:误导点是 \testA 定义为 \def\test{\directlua{tex.sprint("11,12")}} 和 \testB 定义为 \edef \test{\directlua{tex.sprint("11,12")}} 在宏中使用 \testA 和 \testB 时给出相同的结果,因为它们是无限扩展的。在宏中,它是不一样的,因为没有扩展。当用 \expandafter 展开时,因为只有一个展开,所以差异仍然存在。可以通过使用 \meaning\testA 和 \meaning\testB 使差异可见。
    • @user1771398 是的,很好的分析。 \expandafter 的问题是你必须准确地知道你需要多少扩展步骤。例如,\def\test{\directlua{...}} 需要两个,但其他构造可能需要三个或更多。
    猜你喜欢
    • 2019-12-11
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多