¿Cómo crear un nuevo comando con una cadena formateada?

¿Cómo crear un nuevo comando con una cadena formateada?

Cuando intento crear un nuevo comando que contiene una cadena formateada, aparece un error:

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

Por favor, ayúdame a corregir mi error. Este es el código de mi 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}

Respuesta1

\luaexecintenta cambiar los códigos cat, de modo que pueda usarlos %literalmente en su argumento, pero esto no funciona dentro de una macro: cuando se define la macro, \luaexecsolo se guarda y no se ejecuta, por lo que los códigos cat no cambian todavía. Entonces, %en la cadena lua comienza un comentario TeX y la línea restante se descarta mucho antes de que se ejecute la macro.

Tl;dr: No lo use \luaexecdentro de una macro.

En su lugar, puedes mover todas las cosas de Lua a una función y solo llamar a la función desde la 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}

Además, siempre preferiría las tokenfunciones de escaneo en lugar de usar argumentos como expresiones literales 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}

Esto mejora la integración en el ecosistema TeX porque permite utilizar las mismas expresiones aritméticas que en otros comandos TeX en lugar de utilizar las reglas de Lua. Por ejemplo, se pueden utilizar contadores TeX en lugar de números literales.

información relacionada