
フォーマットされた文字列を含む新しいコマンドを作成しようとすると、エラーが発生します。
\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}
これにより、Lua ルールを使用する代わりに、他の TeX コマンドと同じ算術式を使用できるようになるため、TeX エコシステムへの統合が向上します。たとえば、数値リテラルの代わりに TeX カウンターを使用できます。