LuaLaTeX:将列表作为宏参数传递给 lua,但不被视为表

LuaLaTeX:将列表作为宏参数传递给 lua,但不被视为表

我尝试将列表传递给lua参数LaTeX但无法将其解释为表格lua

如果"#1"我得到:a,b,c,d,e – n 1 –,一个条目的表

如果#1我有 :n 5 –??

即使\unexpanded这样也不是更好...

\documentclass{beamer}
\usepackage{luacode,xparse}

\NewDocumentCommand{\NbRange}{%
        m           % liste des variables
        }{%

    \directlua{
        for i,k in pairs( table.pack( "#1" ) )
        do
        tex.print (i,k,"--")
        end
    }

} % -- Fin NbRange


\begin{document}

\NbRange{a,b,c,d,e}

hello word

\end{document}

答案1

这里有几个问题。

  1. table.pack()需要逗号分隔的值列表,而不是字符串。因此,适当的语法是不带引号,即:table.pack(#1)
  2. 使用上述语法,Lua 将收到:table.pack(a,b,c,d,e)在您的示例中,但这不是值列表,而是变量列表。确实是未定义的变量。因此,您必须在调用时引用每个单独的字符,\NbRange\NbRange("a", "b", "c", "d", "e")或使用 lua 代码拆分字符串并生成值列表。
  3. 的结果table.pack()将是一个 lua 表,其中“a”存储在索引 1 处,“b”存储在索引 2 处,等等。但此表还将有一个名为“n”的字段,其中包含该表中元素的数量。这解释了为什么您n 5在输出中得到(ni5k)。其余字符不会出现在您的输出中,因为如上所述,它们不是值,而是nil变量。由于您不想打印该n字段,因此应该使用ipairs而不是pairsipairs仅迭代具有整数键的元素。
  4. 最后,如果要打印索引 ( i),则必须将其转换为字符串。否则i将打印 的“二进制”值,因此,例如,如果i1,结果将是当前字体中代码为 1 的字符(相当于 TeX \char"1

修复所有这些问题后,代码如下:

\documentclass{beamer}
\usepackage{luacode,xparse}

\NewDocumentCommand{\NbRange}{%
        m           % liste des variables
        }{%

    \directlua{
        for i,k in ipairs( table.pack( #1 ) )
        do
        tex.print (tostring(i),k,"--")
        end
    }

} % -- Fin NbRange


\begin{document}

\NbRange{"a","b","c","d","e"}

hello word

\end{document}

结果如下:

结果

相关内容