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.count
Lua 接口:
\begin{luacode*}
tex.count[10] = my_lua_value
\end{luacode*}
并且您的值在 中\count10
。但这有点危险,因为您必须确定使用免费计数器。