
Beim Versuch, einen neuen Befehl zu erstellen, der eine formatierte Zeichenfolge enthält, wird folgende Fehlermeldung angezeigt:
\directlua]:1: unfinished string near <eof>.
Bitte helfen Sie mir, meinen Fehler zu beheben. Dies ist der Code aus meinem Dokument:
\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}
Antwort1
\luaexec
versucht, die Catcodes so zu ändern, dass man sie %
wörtlich in ihrem Argument verwenden kann, aber das funktioniert nicht innerhalb eines Makros: Wenn das Makro definiert ist, \luaexec
wird es nur gespeichert und nicht ausgeführt, sodass sich die Catcodes noch nicht ändern. Daher beginnt der %
in der Lua-Zeichenfolge ein TeX-Kommentar und die verbleibende Zeile wird verworfen, lange bevor das Makro überhaupt ausgeführt wird.
Tl;dr: Nicht \luaexec
innerhalb eines Makros verwenden.
Stattdessen können Sie den gesamten Lua-Kram in eine Funktion verschieben und die Funktion nur vom Makro aus aufrufen:
\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}
Darüber hinaus würde ich immer die token
Scanfunktionen der Verwendung von Argumenten als wörtliche Lua-Ausdrücke vorziehen:
\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}
Dies verbessert die Integration in das TeX-Ökosystem, da es die Verwendung derselben arithmetischen Ausdrücke wie in anderen TeX-Befehlen ermöglicht, anstatt die Lua-Regeln zu verwenden. Beispielsweise können TeX-Zähler anstelle von Zahlenliteralen verwendet werden.