我有以下代码
\documentclass{article}
\usepackage{luacode}
\begin{document}
\begin{luacode*}
local matrix = require "matrix"
local complex = require "complex"
function cmatrix(n)
return matrix(n):replace(complex)
end
function det(m)
tex.sprint(matrix.det(cmatrix(m)))
end
\end{luacode*}
\newcommand{\matrixdet}[1]{\directlua{det(#1)}}
\matrixdet{{{1,2,3},{4,5,6},{"7+8i",8,10}}}
\end{document}
这里我使用了以下链接中的 matrix.lua 和 complex.lua。
https://github.com/davidm/lua-matrix/blob/master/lua/matrix.lua
https://github.com/davidm/lua-matrix/blob/master/lua/complex.lua
预期答案是 -3-24i。但是它给出的答案是 -3-24。字符 i 未被打印。这在 lua 本身中运行良好。但这似乎是 lualatex 中的一个错误。如何解决?任何帮助都将不胜感激。
答案1
似乎在解释复数方面存在问题tex.sprint
。作为解决方案,您可以在打印之前将其转换为字符串:
\documentclass{article}
\usepackage{luacode}
\begin{document}
\begin{luacode*}
local matrix = require "matrix"
local complex = require "complex"
function cmatrix(n)
return matrix(n):replace(complex)
end
function det(m)
tex.sprint(tostring(matrix.det(cmatrix(m))))
end
\end{luacode*}
\newcommand{\matrixdet}[1]{\directlua{det(#1)}}
\matrixdet{{{1,2,3},{4,5,6},{"7+8i",8,10}}}
\end{document}
答案2
与 Luaprint
函数不同,Lua 函数会隐式地应用于tostring
其参数,tex.sprint
如果其参数是表,则定义为分别打印表的每个条目。复数是一个包含实部和虚部的两项表,其中自定义tostring
函数会添加i
。
因此print(matrix.det(cmatrix(m)))
调用tostring
并打印,-3-24i
但tex.sprint
将普通数字tostring
分别应用于表中的每个元素,-3
然后打印。如果在调用之前-24
明确应用 ,则将使用为复数表指定的函数,从而再次产生。tostring
tex.sprint
"-3-24i"