
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
\luaexec
tenta 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 \luaexec
só é 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 \luaexec
dentro 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 token
funçõ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.