我可以写:
\def\myarray{{Nrs,1,2,3}}
然后我可以调用lua:
\luadirect{myfunc(\myarray)}
并访问数组/表中的值。
对于多维的,该怎么做?
我最初想在 Tex 中定义一个多维数组,但我在 Google 上搜索了所有 PDF 文档,甚至没有找到数组的定义。所以现在我决定我唯一的选择是:
\def\myarray_a{{name,1,2,3}}
\def\myarray_b{{name_b,1,4,5}}
\luadirect{myfunct(\myarra_a,\myarray_b)
这应该可以正常工作,但是我仍然想知道是否还有其他方法。
我想将 X m 数组从 lualatex 传递到 lua。
我谷歌了一下,找到了在 Latex 中定义数组的地方:
\def\myarr{{1,2,3}}
我以前用过,但我不知道如何传递 anxm 数组。所以我问了一下,然后也做了实验。
这是一个 MWE:
\documentclass{article}
\usepackage{luacode,luatextra}
\begin{luacode*}
function atest(arrs)
tex.print('type of parameter received: '..type(arrs)..'; containing: \\par')
for i,v in ipairs(arrs) do
tex.print('i='..i..', type='..type(v)..', name='..v.name..', v[1]'..v[1]..'\\par')
v[1]=v[1]*2;
end
end
\end{luacode*}
\begin{document}
\def\flowa{{
{name="Arr1",1,2,3},
{name="Arr2",4,5,6}
}}
\hrulefill
\textbf{\underline{The values:}}\
\flowa\
\textbf{\underline{As seen by lua:}}\
\luadirect{atest(\flowa)}
\hrulefill
\textbf{\underline{Passing by reference (no changes):}}\
\flowa
\end{document}
得出的结果为:
但如图所示,它是按值传递的。
答案1
我最初的反应是:
\def\myarray{{{name,1,2,3}, {name_b,1,4,5}}}
但从您对问题的编辑来看,这实际上并没有帮助您。
此定义确实传递了一个二维数组,但它使用具体值(“文字”)来实现。因此,每次使用 都\myarray
与 的其他使用完全无关\myarray
,因此没有一个更改是永久性的。
如果要传递可重用的二维数组,则必须使用 lua 变量(下面的代码)。这不是 luatex 接口中的特殊之处,而是标准编程:除非有可以实际传递的东西,否则不能通过引用传递是(解除)引用。
\documentclass{article}
\usepackage{luacode,luatextra}
\begin{luacode*}
function atest(arrs)
tex.print('type of parameter received: '..type(arrs)..'; containing: \\par')
for i,v in ipairs(arrs) do
tex.print('i='..i..', type='..type(v)..', name='..v.name..', v[1]'..v[1]..'\\par')
end
end
function achange(arrs)
for i,v in ipairs(arrs) do
v[1]=v[1]*2;
end
end
\end{luacode*}
\begin{document}
\begin{luacode*}
flowa = {{name="Arr1",1,2,3},
{name="Arr2",4,5,6}}
\end{luacode*}
\hrulefill
\textbf{\underline{The values:}}\\
\luadirect{atest(flowa)}
\textbf{\underline{As seen by lua:}}\\
\luadirect{achange(flowa)}
\luadirect{atest(flowa)}
\hrulefill
\textbf{\underline{Passing by reference (no changes):}}\\
\luadirect{atest(flowa)}
\end{document}