LuaLaTeX 入门:directlua 的基本使用

LuaLaTeX 入门:directlua 的基本使用

我正在尝试了解 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}

相关内容