如何在 lualatex 中使用来自外部文件的 lua 代码?

如何在 lualatex 中使用来自外部文件的 lua 代码?

我正在学习 lualatex,因为它能够使用 lua 并使得更复杂的文档更容易。

我正在使用该文档来运行一些介绍性示例。https://www.unirioja.es/cu/jvarona/downloads/numerical-methods-luatex.pdf

我有两个问题。

  1. 是否可以从 Luatex 中使用的 Lua 代码调用从网络上下载的外部 Lua 库?

  2. 我们可以在与 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}

在此处输入图片描述

相关内容