如何使用格式化字串建立新指令?

如何使用格式化字串建立新指令?

當我嘗試建立包含格式化字串的新命令時,出現錯誤:

\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 計數器可以用來取代數字文字。

相關內容