luacode 和 ExplSyntaxOn/Off

luacode 和 ExplSyntaxOn/Off

我正在尝试构建某种 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 放入单独的文件中,然后使用该方法在块~内访问它。expl3dofile

相关内容