如何使用格式化字符串创建新命令?

如何使用格式化字符串创建新命令?

当我尝试创建包含格式化字符串的新命令时,出现错误:

\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 计数器代替数字文字。

相关内容