将二维或多维数组传递给 lua

将二维或多维数组传递给 lua

我可以写:

 \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}

相关内容