Lua 计算失败,结果为负数

Lua 计算失败,结果为负数

除非实际 b 为负,否则宏都会运行。为什么?

\documentclass[a4paper,12pt]{article}
\usepackage[upright]{fourier}
\usepackage[no-math]{fontspec}
\usepackage{luacode,luatextra,luaotfload}
\begin{document}
\newcommand\racine[3]{%
\luaexec{
local d=math.pow(#2,2)-4*#1*#3
local r_1
local r_2
local r
if d>0 then
r_1=(-#2-math.sqrt(d))/2*#1
r_2=(-#2+math.sqrt(d))/2*#1
tex.print("The discriminant is\\ " .. d .. ".\\par")
tex.print("The first root is\\ " .. r_1 .. ".\\par")
tex.print("The second root is\\ " .. r_2 .. ".\\par")
elseif d==0 then
r=-#2/2*#1
tex.print("The discriminant is\\ " .. d .. ".\\par")
tex.print("The double root is\\ " .. r .. ".\\par")
elseif d < 0 then
tex.print("The discriminant is\\ " .. d .. ".\\par")
tex.print("There are no real solutions.") 
end
}}

\racine{10}{-3}{5}
\end{document}

错误信息是:

! LuaTeX error [string "\directlua "]:1: unexpected symbol near <eof>.
\luacode@dbg@exec ...code@maybe@printdbg {#1} #1 }

l.28 \racine{10}{-3}{5}

?

如果可能的话,我希望解决方案能够写成分数。

答案1

您不能使用--3lua 3,您需要这样做-(-3)

\documentclass[a4paper,12pt]{article}
\usepackage[upright]{fourier}
\usepackage[no-math]{fontspec}
\usepackage{luacode,luatextra,luaotfload}
\begin{document}
\newcommand\racine[3]{%
\luaexec{
local d=math.pow(#2,2)-4*#1*#3
local r_1
local r_2
local r
if d>0 then
r_1=(-(#2)-math.sqrt(d))/2*(#1)
r_2=(-(#2)+math.sqrt(d))/2*(#1)
tex.print("The discriminant is\\ " .. d .. ".\\par")
tex.print("The first root is\\ " .. r_1 .. ".\\par")
tex.print("The second root is\\ " .. r_2 .. ".\\par")
elseif d==0 then
r=-(#2)/2*(#1)
tex.print("The discriminant is\\ " .. d .. ".\\par")
tex.print("The double root is\\ " .. r .. ".\\par")
elseif d < 0 then
tex.print("The discriminant is\\ " .. d .. ".\\par")
tex.print("There are no real solutions.") 
end
}}

\racine{10}{-3}{5}
\end{document}

答案2

David 已经回答了为什么会收到错误消息。我的回答更像是对此的扩展评论。错误的原因(#1等开始在 lua 代码中按字面处理)是 ConTeXt 中首选的样式是将 Lua 代码与 TeX 定义分开的原因之一。例如,在 ConTeXt 中,我会将上述代码编码为

\startluacode
  function commands.racine(a,b,c)
    local d= b*b - 4*a*c
    context("The discriminant is %f \\crlf", d )
    if d>0 then
        local r_1=(-b-math.sqrt(d))/(2*a)
        local r_2=(-b+math.sqrt(d))/(2*a)
        context("The first root is %f \\crlf "  , r_1 )
        context("The second root is %f \\crlf" , r_2 )
    elseif d==0 then
        local r = -b/(2*a)
        context("The double root is %f \\crlf", r)
    else
      context("There are no real solutions.\\crlf") 
    end
    context("\\par")
  end
\stopluacode

\define[3]\racine{\ctxcommand{racine(#1, #2, #3)}}

\starttext
\racine{10}{-3}{5}
\stoptext

其工作符合预期。

顺便说一下,LaTeX 没有与 ConTeXtluacode环境真正等同的环境。LaTeXluacode环境不够强大,首选解决方案就是不要使用它们。

相关内容