以下是代码。它利用了以下链接中的 matrix.lua 文件。
https://github.com/davidm/lua-matrix/blob/master/lua/matrix.lua
\documentclass{article}
\usepackage{luacode}
\begin{document}
\begin{luacode*}
local matrix = require "matrix"
function add(m,n)
return tex.sprint(matrix.latex(matrix.add(m,n)))
end
function subtract(m,n)
return tex.sprint(matrix.latex(matrix.sub(m,n)))
end
\end{luacode*}
\newcommand{\matrixadd}[2]{\directlua{add(#1,#2)}}
\newcommand{\matrixsubtract}[2]{\directlua{subtract(#1,#2)}}
\def\m{{{1,2,3},{4,5,6},{7,8,9}}}
\def\n{{{2,4,6},{8,10,12},{14,16,20}}}
\matrixadd{\m}{\n}\\
\matrixsubtract{\m}{\n}\\
\matrixsubtract{\matrixadd{\m}{\n}}{\m}
\end{document}
这些函数单独调用时效果很好。但是像最后一行代码那样嵌套则不起作用。我也知道我使用函数 matrix.latex 的原因。我认为这是获得打印输出的唯一方法。有没有其他方法可以做到这一点?
注意:文件 matrix.lua 中的 matrix.latex 函数存在一些问题。它会在矩阵的每一行开头和最后一行的最后一个条目中打印一些不必要的字符。我已经修复了它。但对于这个问题,它可以忽略不计。
答案1
如果你将add
函数更改为
function add(m,n)
print(matrix.latex(matrix.add(m,n)))
return tex.sprint(matrix.latex(matrix.add(m,n)))
end
你会看到问题,你输出了错误的字符串。
终端打印将显示
$\left( \begin{array}{ccc}
3 & 6 & 9 \\
12 & 15 & 18 \\
21 & 24 & 29
\end{array} \right)$
但这不适合你的嵌套调用:你应该输出字符串
{
{3 , 6 , 9},
{12 ,15 , 18},
{21 , 24 , 29}
}
类似这样,除了矩阵库乳胶打印出于某种原因添加了欧米茄
{{1,2,3},{4,5,6}}
基本思想是在生成乳胶数组时的最终调用之外的所有阶段生成 Lua 输入语法。
\documentclass{article}
\usepackage{luacode}
\begin{document}
\begin{luacode*}
local matrix = require "matrix"
function add(m,n)
tex.sprint(matrixprint(matrix.add(m,n)))
end
function subtract(m,n)
tex.sprint(matrixprint(matrix.sub(m,n)))
end
function latex(m)
tex.sprint(matrix.latex(m))
end
function matrixprint (m)
local s=""
if(type(m) == 'table') then
s = s .. "{"
for ii,kk in ipairs(m) do
if ii ~= 1 then
s = s .. ","
end
s = s .. matrixprint(kk)
end
s = s .. "}"
else
s= tostring(m)
end
return s
end
\end{luacode*}
\newcommand\latexmatrix[1]{\directlua{latex(#1)}}
\newcommand{\matrixadd}[2]{\directlua{add(#1,#2)}}
\newcommand{\matrixsubtract}[2]{\directlua{subtract(#1,#2)}}
\def\m{{{1,2,3},{4,5,6},{7,8,9}}}
\def\n{{{2,4,6},{8,10,12},{14,16,20}}}
\latexmatrix{\m}
+
\latexmatrix{\n}
=
\latexmatrix{\matrixadd{\m}{\n}}
\latexmatrix{\m}
-
\latexmatrix{\n}
=
\latexmatrix{\matrixsubtract{\m}{\n}}
\latexmatrix{\matrixadd{\m}{\n}}
-
\latexmatrix{\m}
=
\latexmatrix{\matrixsubtract{\matrixadd{\m}{\n}}{\m}}
\end{document}