我正在尝试在 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 的包(luacode
和luaextra
),然后将代码包装在中\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}