我正在尝试了解 LaTeX 中 lua 编程的基础知识。
我在一个名为的文件中有一个简单的函数luatest.lua
:
function fact (n)
if n == 0 then
return 1
else
return n * fact(n-1)
end
end
然后我有一个通常的 .tex 文件:
\documentclass{article}
\directlua{dofile("luatest.lua")}
\newcommand{\myluafact}[1]{\directlua{function fact(#1)}}
\begin{document}
test \myluafact{5}
\end{document}
不幸的是,它无法编译。我似乎遗漏了某些tex.sprint()
地方,但遗漏在哪里呢?
答案1
调用该函数fact(#1)
时无需使用关键字function
。此外,结果需要反馈给 TeX,例如通过tex.write
:
\documentclass{article}
\directlua{dofile("luatest.lua")}
\newcommand*{\myluafact}[1]{%
\directlua{tex.write(fact(#1))}%
}
\begin{document}
test \myluafact{5}
\end{document}
改进\myluafact
:lua 函数fact
需要一个简单的整数,但 TeX 数字可以有多种不同的形状(计数器、寄存器、字符常量等)。如果#1
包装在里面\numexpr
,那么甚至可以进行算术计算:
\documentclass{article}
\directlua{dofile("luatest.lua")}
\newcommand*{\myluafact}[1]{%
\directlua{tex.write(fact(\the\numexpr(#1)\relax))}%
}
\begin{document}
test \myluafact{\value{page}+2*2}
\end{document}