我应该将哪个 Lua 环境与 LuaTeX(LuaLaTeX)一起使用?

我应该将哪个 Lua 环境与 LuaTeX(LuaLaTeX)一起使用?

Lua代码环境

不久前我开始使用 XeTeX (XeLaTeX)。之前我用的是 pdfLaTeX,但现在我对 XeLaTeX 已经很熟悉了。

现在,我想使用 LuaLaTeX 将 Lua 嵌入到一些 LaTeX 文档中。文档说明了在 TeX 中嵌入 Lua 的几种方法,但它们让我感到困惑,而不是真正解释我需要知道的有关嵌入 Lua 的知识。

\directlua{ ... },,\luacode ... \endluacode还有\begin{luacode} ... \end{luacode}lua代码包。点 ( ...) 是 Lua 代码所在的位置。

现在,我应该使用哪一个?

有没有更快捷的方法进入 Lua 环境,比如使用数学模式,我可以使用“ $”进入数学模式?

保存变量

简单说一下:当使用嵌入在 LuaLaTeX 中的 Lua 代码时,代码完成后所有变量都会丢失。现在,我可以保存返回值等,以便以后在文档中使用它们吗,例如\myvar,等等?

答案1

这里有两个问题。您应该考虑在下一篇文章中一次提出一个问题。

现在Lua代码环境。如果可以,不要使用它们。只管去做

\directlua{  require("myfile")  }

并将所有 Lua 代码放入该文件中。请参阅另一个答案获取目录列表,TeX 将搜索文件myfile.lua

如果由于某种原因你不能这样做(例如,当你只允许发送一个文件时),你应该使用环境luacode**来自的lua代码包。它具有最安全的字符 catcode。这意味着您可以这样说:

\begin{luacode*}
texio.write_nl("This is a string with\n a newline in it")
tex.print(-2, string.format( "5 %% 4 is %d ", 5 % 4))
\end{luacode*}

(您需要将-2作为 的第一个参数tex.sprint(),因为在环境关闭后%,符号(由 double 产生)%%在 TeX 中被解释为注释符号。TeX 会在环境末尾看到5 % 4 is 1并将 视为%输入的结尾。所以您需要告诉 TeX 这%是一个普通字符。您有两个选择:要么向 TeX 传递一个这样的字符串:string.format("5 \\%% 4 is ...")这样 TeX 就会5 \% 4 is ...像对待普通文本一样看到它,要么将其制作成%普通字母,这​​样 TeX 就不会将其识别为注释符号。要做到这一点,您必须更改类别代码。最简单的方法是将特殊的 catcode 表 -2 分配给tex.print()。这是一个安全的 catcode 表,没有字符具有特殊含义。)

如果需要在 Lua 代码中使用 TeX 宏,请使用luacode环境(不带*):

\begin{luacode}
    local current_page = tonumber(\thepage)
    texio.write_nl("We are on page " .. current_page)
\end{luacode}

如果需要将代码放在命令中,请使用\luaexec

\newcommand\myrepeat[2]{%
\luaexec{
  for i=1,#1 do
     tex.sprint("\luatexluaescapestring{#2}")
   end
 }}

\myrepeat{4}{Hello world}

(您不能直接在 中使用环境,但如果您确实需要环境功能,则\newcommand可以使用\luacodestar... )。需要转义输入字符,因为那样会对 Lua 字符串造成损害。\endluacodestar\luatexluaescapestring{}"

您还询问是否有诸如$...之类$的数学排版快捷方式。没有。在我看来,这不是什么大问题,因为 Lua 代码(在实践中,但 YMMV)仅在少数情况下使用(例如宏或环境),在运行文本中并不常用。主要在包中。(请参阅文档luacolor 包例如。即使您第一眼看不完全了解该软件包,您也可以看到 TeX 代码与\directlua示例中的调用(别名)的位置\LuaCol@directlua,以及 Lua 代码如何在另一个文件中与其分开。看到命令中只有很少几行 Lua 代码吗\LuaCol@directlua?我认为我们可以从这段代码中学到很多东西,因为 Heiko Oberdiek 是一位出色的软件包编写者。)

现在回答你的第二个问题保存变量。如果您没有将变量声明为本地变量,则它们可以在所有 Lua 块中访问。但您要求将 Lua 代码传递给 TeX。例如,您可以这样做:

\begin{luacode*}
tex.sprint("\setcounter{mycounter}{" .. my_lua_value .. "}")
\end{luacode*}

创建\setcounter带有您值的命令。或者您可以使用tex.countLua 接口:

\begin{luacode*}
tex.count[10] = my_lua_value
\end{luacode*}

并且您的值在 中\count10。但这有点危险,因为您必须确定使用免费计数器。

相关内容