Как создать новую команду с отформатированной строкой?

Как создать новую команду с отформатированной строкой?

При попытке создать новую команду, содержащую отформатированную строку, возникает ошибка:

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

Пожалуйста, помогите мне исправить мою ошибку. Это код из моего документа:

\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}

решение1

\luaexecпытается изменить catcodes, так что вы можете использовать %буквально в его аргументе, но это не работает внутри макроса: когда макрос определен, \luaexecон только сохраняется, но не выполняется, поэтому catcodes пока не изменяются. Таким образом, %в строке lua начинается комментарий TeX, а оставшаяся строка отбрасывается задолго до того, как макрос будет выполнен.

Tl;dr: Не используйте \luaexecвнутри макроса.

Вместо этого вы можете переместить все содержимое 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(%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}

Кроме того, я бы всегда предпочел использовать tokenфункции сканирования вместо использования аргументов в качестве буквальных выражений 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}

Это улучшает интеграцию в экосистему TeX, поскольку позволяет использовать те же арифметические выражения, что и в других командах TeX, вместо правил Lua. Например, счетчики TeX могут использоваться вместо числовых литералов.

Связанный контент