Como criar um novo comando com string formatada?

Como criar um novo comando com string formatada?

Quando tento criar um novo comando que contém uma string formatada, recebo um erro:

\directlua]:1: unfinished string near <eof>.

Por favor, ajude-me a corrigir meu erro. Este é o código do meu documento:

\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}

Responder1

\luaexectenta alterar os catcodes, de forma que você possa usar %literalmente em seu argumento, mas isso não funciona dentro de uma macro: Quando a macro é definida, ela \luaexecsó é salva e não executada, então os catcodes ainda não mudam. Portanto, %a string lua inicia um comentário do TeX e a linha restante é descartada muito antes de a macro ser executada.

dr: Não use \luaexecdentro de uma macro.

Em vez disso, você pode mover todo o material Lua para uma função e chamar a função apenas a partir da macro:

\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}

Além disso, eu sempre preferiria as tokenfunções de varredura em vez de usar argumentos como expressões literais de 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}

Isso melhora a integração ao ecossistema TeX porque permite usar as mesmas expressões aritméticas de outros comandos TeX em vez de usar as regras Lua. Por exemplo, contadores TeX podem ser usados ​​em vez de números literais.

informação relacionada