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