除非实际 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
您不能使用--3
lua 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
环境不够强大,首选解决方案就是不要使用它们。