当我尝试创建包含格式化字符串的新命令时,出现错误:
\directlua]:1: unfinished string near <eof>.
请帮我修复我的错误。这是我的文档中的代码:
\documentclass{article}
\usepackage{luacode}
\pagestyle{empty}
\thispagestyle{empty}
\newcommand\formula[4]{
\luaexec{
tex.print("test")
for a=#1,#2 do
for b=#1,#2 do
tex.print(string.format("\luatexluaescapestring{#3}".."(%s+%s)^2=%s^2+2*%s*%s+%s^2=%s".."\luatexluaescapestring{#4}",a,b,a,a,b,b,(a+b)^2))
end
end
}}
\begin{document}
\formula{-5}{5}{\[}{\]}
\end{document}
答案1
\luaexec
尝试更改 catcodes,以便您可以%
在其参数中直接使用,但这在宏中不起作用:定义宏时,\luaexec
仅保存而不执行,因此 catcodes 尚未更改。因此,%
lua 字符串中的 TeX 注释开始,其余行在宏执行之前就被丢弃。
Tl;dr:请勿\luaexec
在宏内部使用。
相反,您可以将所有 Lua 内容移到一个函数中,然后仅从宏中调用该函数:
\documentclass{article}
\usepackage{luacode,amsmath}
\pagestyle{empty}
\thispagestyle{empty}
\begin{luacode*}
function myfunc(start, finish, prefix, suffix)
tex.print("test")
for a=start,finish do
for b=start,finish do
tex.print(string.format("%s(%s+%s)^2=%s^2+2*%s*%s+%s^2=%s%s",prefix,a,b,a,a,b,b,(a+b)^2,suffix))
end
end
end
\end{luacode*}
\newcommand\formula[4]{\directlua{myfunc(#1,#2,"\luaescapestring{\unexpanded{#3}}","\luaescapestring{\unexpanded{#4}}")}}
\begin{document}
\formula{-5}{5}{\[}{\]}
\end{document}
此外,我始终更喜欢使用token
扫描函数,而不是使用参数作为文字 Lua 表达式:
\documentclass{article}
\usepackage{luacode,amsmath}
\pagestyle{empty}
\thispagestyle{empty}
\begin{luacode*}
function myfunc(start, finish, prefix, suffix)
tex.print("test")
for a=start,finish do
for b=start,finish do
tex.print(string.format("%s(%i+%i)^2=%i^2+2*%i*%i+%i^2=%i%s",prefix,a,b,a,a,b,b,(a+b)^2,suffix))
end
end
end
\end{luacode*}
\newcommand\formula[4]{%
\directlua{myfunc(token.scan_int(), token.scan_int(),token.scan_string(),token.scan_string())}
\numexpr#1\relax
\numexpr#2\relax
{\unexpanded{#3}}
{\unexpanded{#4}}}
\begin{document}
\formula{-5}{5}{\[}{\]}
\end{document}
这提高了与 TeX 生态系统的集成度,因为它允许使用与其他 TeX 命令相同的算术表达式,而不是使用 Lua 规则。例如,可以使用 TeX 计数器代替数字文字。