我要创建的函数接受两个数字,然后使用一些数学运算打印结果。以下是我的代码:
\documentclass[12pt,a4paper]{article}
\begin{document}
\directlua{
function prod(a,b)
tex.print(a "$\times$" b "$=$" a*c)
end
}
The product of 2 and 3: \directlua{prod(2,3)}.
\end{document}
我无法让它正确打印整个报表。如何解决?
答案1
\documentclass[12pt,a4paper]{article}
\directlua{
function prod(a,b)
tex.print("$" .. a .. "\string\\times" .. b .. "=" .. a*b .. "$")
end
}
\begin{document}
The product of 2 and 3: \directlua{prod(2,3)}.
\end{document}
一个棘手的事情是让反斜杠转义游戏正确:LuaTeX:如何处理打印 TeX 宏的 Lua 函数.directlua
在将宏传递给 Lua 之前会对其进行扩展,因此\times
会造成混乱。但是\string\times
,像 这样的应该可以停止该扩展的宏并没有按预期工作,因为\t
是 Lua 中制表符的特殊转义。因此我们需要在此处对反斜杠进行转义。在 Lua 中,您必须输入\\times
,但在 TeX 中,我们需要阻止\\
被扩展,因此我们需要。这就是为什么经常建议使用包或将 Lua 函数外部化到它们自己的文件中,然后使用或加载它们的\string\\times
原因之一 luacode
.lua
dofile
require
(例如,参见如何在 LuaTeX 中执行“printline”,可以在dofile
这里require
找到LuaLatex:加载lua文件时`dofile`和`require`的区别)。
另一件事是您需要..
连接字符串。
最后,您可能希望在数学模式下获得整个表达式,而不仅仅是某些位。
还将\directlua
函数定义移到了序言中。(感谢米科感谢你的建议。
答案2
答案3
只是为了完整性,这里有一个解决方案,展示了如何(a)将 Lua 代码写入外部文件,(b)通过指令加载 Luacode \directlua{dofile("...")}
,以及(c)设置 LaTeX“包装器”宏(\showprod
在下面的示例中调用),其功能(双关语)是调用 Lua 函数。
请注意,使用此设置,可以写\\
而不是来表示单个反斜杠字符。(对于包提供的和环境\string\\
也是如此。)luacode
luacode*
luacode
\RequirePackage{filecontents}
\begin{filecontents*}{show_prod.lua}
function show_prod ( a , b )
tex.sprint ( "$"..a.."\\times"..b.."="..a*b.."$" )
end
\end{filecontents*}
\documentclass{article}
%% Load Lua code from external file and define a LaTeX "wrapper" macro
\directlua{dofile("show_prod.lua")}
\newcommand\showprod[2]{\directlua{show_prod(#1,#2)}}
\begin{document}
The product of 2 and 3: \showprod{2}{3}.
\end{document}