
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
\luaexec
intenta 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, \luaexec
solo 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 \luaexec
dentro 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 token
funciones 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.