
형식화된 문자열이 포함된 새 명령을 생성하려고 하면 오류가 발생합니다.
\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
%
문자 그대로 인수에서 사용할 수 있도록 catcode를 변경하려고 시도 하지만 매크로 내에서는 작동하지 않습니다. 매크로가 정의되면 \luaexec
저장만 되고 실행되지 않으므로 catcode는 아직 변경되지 않습니다. 따라서 %
lua 문자열은 TeX 주석을 시작하고 나머지 줄은 매크로가 실행되기 오래 전에 삭제됩니다.
요약: \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 카운터를 사용할 수 있습니다.