使用 LuaLaTeX 执行并显示算术运算

使用 LuaLaTeX 执行并显示算术运算

我要创建的函数接受两个数字,然后使用一些数学运算打印结果。以下是我的代码:

\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}

2 和 3 的乘积:2 × 3 = 6。

一个棘手的事情是让反斜杠转义游戏正确:LuaTeX:如何处理打印 TeX 宏的 Lua 函数.directlua在将宏传递给 Lua 之前会对其进行扩展,因此\times会造成混乱。但是\string\times,像 这样的应该可以停止该扩展的宏并没有按预期工作,因为\t是 Lua 中制表符的特殊转义。因此我们需要在此处对反斜杠进行转义。在 Lua 中,您必须输入\\times,但在 TeX 中,我们需要阻止\\被扩展,因此我们需要。这就是为什么经常建议使用包或将 Lua 函数外部化到它们自己的文件中,然后使用或加载它们的\string\\times原因之一 luacode.luadofilerequire(例如,参见如何在 LuaTeX 中执行“printline”,可以在dofile这里require找到LuaLatex:加载lua文件时`dofile`和`require`的区别)。

另一件事是您需要..连接字符串。

最后,您可能希望在数学模式下获得整个表达式,而不仅仅是某些位。

还将\directlua函数定义移到了序言中。(感谢米科感谢你的建议。

答案2

\documentclass[12pt,a4paper]{article}

\begin{document}
    \directlua{
        function prod(a,b)
            tex.print(a.. "$\string\\times$".. b.. "$=$".. a*b)
        end
    }

    The product of 2 and 3: \directlua{prod(2,3)}.
\end{document}

在此处输入图片描述

答案3

只是为了完整性,这里有一个解决方案,展示了如何(a)将 Lua 代码写入外部文件,(b)通过指令加载 Luacode \directlua{dofile("...")},以及(c)设置 LaTeX“包装器”宏(\showprod在下面的示例中调用),其功能(双关语)是调用 Lua 函数。

请注意,使用此设置,可以写\\而不是来表示单个反斜杠字符。(对于包提供的和环境\string\\也是如此。)luacodeluacode*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}

相关内容