我正在尝试构建某种 lua 矩阵模块的接口。我解决了几个问题,并找到了一些我觉得可以修改以使其正常工作的东西。预计在某个时候需要 expl3 函数,我将宏包装进去,\ExplSyntaxOn
并\ExplSyntaxOff
期待着一场彻底的 catcode 灾难。相反,我得到了一个与“全局”和“零值”相关的错误。我非常笨拙地处理这个问题,所以我没有工具来理解为什么我做的事情是错误的。在下面的代码中,包装函数会吐出一个矩阵,但是,当取消注释一\ExplSyntaxOn/Off
对时,就会发生上述错误。如果需要,matrix.lua
可以在此处找到该文件:
https://raw.github.com/davidm/lua-matrix/master/lua/matrix.lua
\documentclass{article}
\usepackage{xparse}
\usepackage{luacode}
\usepackage{fontspec}
%\ExplSyntaxOn
\directlua{dofile("matrix.lua")}
%\ExplSyntaxOn
\NewDocumentCommand{\matrixop}{}
{
\luaexec{
local matrix = require 'matrix'
m1 = matrix{{8,4,1},{6,8,3}}
m2 = matrix{{-8,1,3},{5,2,1}}
m3 = matrix.add(m1,m2)
a=matrix.latex(m3,c)
tex.print(a)
}
}
%\ExplSyntaxOff
\begin{document}
\matrixop{}
\end{document}
答案1
在expl3
代码环境中,空格会被忽略。如果您直接嵌入 Lua 代码,这将导致问题,除非您将所需的空格替换为~
或重置空格字符的 catcode。但是,文件中的 Lua 代码没有问题,因为它从未被 TeX 标记:
\documentclass{article}
\usepackage{xparse}
\usepackage{luacode}
\usepackage{fontspec}
\ExplSyntaxOn
\directlua{dofile("matrix.lua")}
\ExplSyntaxOff
\NewDocumentCommand{\matrixop}{}
{%
\luaexec{%
local matrix = require 'matrix'
m1 = matrix{{8,4,1},{6,8,3}}
m2 = matrix{{-8,1,3},{5,2,1}}
m3 = matrix.add(m1,m2)
a=matrix.latex(m3,c)
tex.print(a)
}%
}
\begin{document}
\matrixop{}
\end{document}
和 Lua 的“最佳实践”指南都expl3
旨在将实现与使用点分开。对于 Lua 代码,这意味着将 Lua 放在单独的文件中,并dofile
仅使用或函数名称对其进行操作。在expl3
模型中,诸如 的文档命令\matrixop
不应包含“有效负载”,而应简单地传递适当的内部命令,然后再次进行良好的材料分离。因此,我建议您不要乱用或 catcode,而应该将 Lua 放入单独的文件中,然后使用该方法在块~
内访问它。expl3
dofile