sty 文件中的 luacode 问题

sty 文件中的 luacode 问题

我正在尝试在 sty 文件中使用 lua 包含 gcd 函数。以下是 euclide.sty 的代码:

\RequirePackage{ifluatex,luacode,luatextra}
\ifluatex
    \begin{luacode}
        function euclide(a,b)
            if a < b then a,b = b,a end
            r = a-math.floor(a/b)*b
            if r == 0 then tex.print(b) else euclide(b,r) end
        end
    \end{luacode}
    \newcommand{\euclide}[2]{\luaexec{euclide(#1,#2)}}
\fi

以下是 texfile 代码:

\documentclass[10pt,oneside]{article}
\usepackage{euclide}

\begin{document}
\euclide{435}{630}
\end{document}

lualatex 编译出现错误:

Runaway argument?
! File ended while scanning use of \luacode@grab@lines.
<inserted text>
\par
l.4 

I suspect you have forgotten a `}', causing me
to read past where you wanted me to stop.
I'll try to recover; but if the error is serious,
you'd better type `E' or `X' now and fix your file.


! LaTeX Error: Missing \begin{document}.

有人能告诉我我的代码有什么问题吗?(此代码在主 tex 文件中运行良好,但在 sty 文件中运行不正常)谢谢,MB。

答案1

如果前面的空格\end{luacode}是制表符,我可以重现该问题。环境是一个特殊环境,因为它会更改类别代码以更逐字地读取其内容。因此,结束检测不是通过通常的宏扩展来完成的,而是通过在新行的开头luacode搜索字符串来完成的(此处使用 catcode 10 会忽略空格)。\end{luacode}

修复:用空格替换制表符(取决于编辑器,可能有此选项。)

顺便说一句:这有点不一致:首先加载需要 LuaTeX 的包(luacodeluaextra),然后将代码包装在中\ifluatex。如果包在使用和不使用 LuaTeX 的情况下都能正常工作:

\RequirePackage{ifluatex}
\ifluatex
  \RequirePackage{luacode,luaextra}
  \begin{luacode}
  ...
  \end{luacode}
  ...
\else
  ...
\fi

或者测试 LuaTeX,如果需要 LuaTeX,则抛出错误:

\RequirePackage{ifluatex}
\ifluatex
\else
  \PackageError{euclide}{LuaTeX is required}\@ehd
  \newcommand*{\euclide}[2]{%
    % dummy definition
  }%
  \expandafter\endinput % abort early
\fi

\RequirePackage{luacode,luaextra}
\begin{luacode}
...
\end{luacode}

相关内容