我正在学习 lualatex,因为它能够使用 lua 并使得更复杂的文档更容易。
我正在使用该文档来运行一些介绍性示例。https://www.unirioja.es/cu/jvarona/downloads/numerical-methods-luatex.pdf
我有两个问题。
是否可以从 Luatex 中使用的 Lua 代码调用从网络上下载的外部 Lua 库?
我们可以在与 TeX 文件本身不同的文件中编写长段的 lua 代码吗?考虑最后的 Lorentez 吸引子示例,它可以在我的计算机上编译并运行良好。但生成吸引子的 lua 代码相当长。我有没有办法把这个 lua 代码写在外部文件中?下面给出了一个 latex 编译错误,我试图使用
\input{scrap.lua}
\documentclass{article} \usepackage{luacode} \usepackage{pgfplots} \usepackage{tikz} \begin{luacode*} \input{scrap.lua} \end{luacode*} \newcommand\addLUADEDplot[3][]{% \directlua{print_LorAttrWithEulerMethod(#2,#3,[[#1]])}% } \begin{document} \begin{tikzpicture} \begin{axis} % SYNTAX: Solution of the Lorenz system % with step h=0.02 sampled at 1000 points. \addLUADEDplot[color=red,smooth]{0.02}{1000}; \addLUADEDplot[color=green,smooth]{0.02}{1000}; \addLUADEDplot[color=blue,smooth]{0.02}{1000}; \addLUADEDplot[color=cyan,smooth]{0.02}{1000}; \addLUADEDplot[color=magenta,smooth]{0.02}{1000}; \addLUADEDplot[color=yellow,smooth]{0.02}{1000}; \end{axis} \end{tikzpicture} \end{document}
外部文件 scrap.lua 如下所示
-- Differential equation of the Lorenz attractor
function f(x,y,z)
local sigma = 3
local rho = 26.5
local beta = 1
return {sigma*(y-x), -x*z + rho*x - y, x*y - beta*z}
end
-- Code to write PGFplots data as coordinates
function print_LorAttrWithEulerMethod(h,npoints,option)
-- The initial point (x0,y0,z0)
local x0 = 0.0
local y0 = 1.0
local z0 = 0.0
-- we add a random number between -0.25 and 0.25
local x = x0 + (math.random()-0.5)/2
local y = y0 + (math.random()-0.5)/2
local z = z0 + (math.random()-0.5)/2
if option~=[[]] then
tex.sprint("\\addplot3["..option.."] coordinates{")
else
tex.sprint("\\addplot3 coordinates{")
end
-- we dismiss the first 100 points to go into the attractor
for i=1, 100 do
m = f(x,y,z)
x = x + h * m[1]
y = y + h * m[2]
z = z + h * m[3]
end
for i=1, npoints do
m = f(x,y,z)
x = x + h * m[1]
y = y + h * m[2]
z = z + h * m[3]
tex.sprint("("..x..","..y..","..z..")")
end
tex.sprint("}")
end
我得到的错误是
ex))) !LuaTeX 错误 [\directlua]:1: '\' 附近有意外符号。 \luacode@dbg@exec ...code@maybe@printdbg {#1} #1 } l.8 \end{luacode*}
?
答案1
最好的方法是将外部文件变成一个模块。这意味着,你要确保所有变量都是local
,最后返回一个导出所有用户可访问函数的表。例如,f(x,y,z)
不会在外面使用,所以我不会导出它。如你所见,我也可以用不同的名称导出函数。
-- Differential equation of the Lorenz attractor
local function f(x,y,z)
local sigma = 3
local rho = 26.5
local beta = 1
return {sigma*(y-x), -x*z + rho*x - y, x*y - beta*z}
end
-- Code to write PGFplots data as coordinates
local function print_LorAttrWithEulerMethod(h,npoints,option)
-- The initial point (x0,y0,z0)
local x0 = 0.0
local y0 = 1.0
local z0 = 0.0
-- we add a random number between -0.25 and 0.25
local x = x0 + (math.random()-0.5)/2
local y = y0 + (math.random()-0.5)/2
local z = z0 + (math.random()-0.5)/2
if option~=[[]] then
tex.sprint("\\addplot3["..option.."] coordinates{")
else
tex.sprint("\\addplot3 coordinates{")
end
-- we dismiss the first 100 points to go into the attractor
for i=1, 100 do
local m = f(x,y,z)
x = x + h * m[1]
y = y + h * m[2]
z = z + h * m[3]
end
for i=1, npoints do
local m = f(x,y,z)
x = x + h * m[1]
y = y + h * m[2]
z = z + h * m[3]
tex.sprint("("..x..","..y..","..z..")")
end
tex.sprint("}")
end
return { LorenzAttractor = print_LorAttrWithEulerMethod }
将 Lua 代码放在单独的文件中的一个优点是您不必担心 catcode。因此您luacode
根本不需要该包。您创建的模块scrap.lua
可以像任何常规 Lua 模块一样加载。通常您可以像
local scrap = require("scrap")
但这在 LuaTeX 中不起作用,因为scrap
变量只在它所提及的块中是本地的\directlua
,因此不能在其他块中使用。因此,你必须创建一个全局变量scrap
来封装模块
\directlua{scrap = require("scrap")}
完整文件如下:
\documentclass{article}
\usepackage{pgfplots}
\usepackage{tikz}
\directlua{scrap = require("scrap")}
\newcommand\addLUADEDplot[3][]{%
\directlua{scrap.LorenzAttractor(#2,#3,[[#1]])}%
}
\begin{document}
\begin{tikzpicture}
\begin{axis}
% SYNTAX: Solution of the Lorenz system
% with step h=0.02 sampled at 1000 points.
\addLUADEDplot[color=red,smooth]{0.02}{1000};
\addLUADEDplot[color=green,smooth]{0.02}{1000};
\addLUADEDplot[color=blue,smooth]{0.02}{1000};
\addLUADEDplot[color=cyan,smooth]{0.02}{1000};
\addLUADEDplot[color=magenta,smooth]{0.02}{1000};
\addLUADEDplot[color=yellow,smooth]{0.02}{1000};
\end{axis}
\end{tikzpicture}
\end{document}