Wie erstelle ich einen neuen Befehl mit formatierter Zeichenfolge?

Wie erstelle ich einen neuen Befehl mit formatierter Zeichenfolge?

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

\luaexecversucht, 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, \luaexecwird 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 \luaexecinnerhalb 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 tokenScanfunktionen 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.

verwandte Informationen