我将内容存储在 lua 变量中并在 lualatex 文档中使用它们。我知道如何将该内容插入 TeX 流中,在宏中,但我不知道如何启动 lua 变量中包含的 lua 程序。
\documentclass{article}
\usepackage{luatextra} % pour LuaLaTex
\begin{document}
\newcommand{\amacro}[1]{*#1*}
\luaexec{
a=1
atext='stupid text'
apgm='a=a+1' % the content is a program
}
\luaexec{tex.print(atext)} % contents in the TeX flow : works
\amacro{\luaexec{tex.print(atext)}} % contents used in a macro : works
\luaexec{\luaexec{tex.print(apgm)}} % contents used as a program : fails
\luaexec{tex.print(a)}
\end{document}
我该如何启动存储在lua变量apgm中的lua程序?
答案1
您可以使用load()
Lua 中的函数并加载存储在其中的代码,apgm
而无需将其抛到 TeX 并返回。
\documentclass{article}
\usepackage{luacode}
\begin{document}
\newcommand{\amacro}[1]{bla#1bla}
\newcommand{\lprint}[1]{\directlua{tex.print(#1)}}
\newcommand{\leval}[1]{\directlua{assert(load(#1))()}}
\luaexec{
a=1
atext='stupid text'
apgm='a=a+1' % the content is a program
}
\lprint{atext} % contents in the TeX flow : works
\amacro{\lprint{atext}} % contents used in a macro : works
\lprint{a} % prints 1
\leval{apgm} % contents used as a program
\lprint{a} % prints 2
\end{document}
请注意,\leval
宏只会加载并立即执行存储在 Lua 变量中的代码。如果加载的代码出现语法错误,Assert 会很有帮助。如果没有它,错误消息就会变得太晦涩难懂。
答案2
用例看起来有点奇怪,你没有定义\luaexec
或者\lprint
但我认为你想要这样的东西:
\documentclass{article}
\begin{document}
\newcommand{\amacro}[1]{bla#1bla}
\directlua{
a=1
atext='stupid text'
apgm='a=a+1' % the content is a program
}
\directlua{tex.print(atext)} % contents in the TeX flow : works
\amacro{\directlua{tex.print(atext)}} % contents used in a macro : works
\directlua{tex.print(a)} % a is 1
\directlua{\directlua{tex.print(apgm)}} % nested lua eval why??????
\directlua{tex.print(a)} % a is 2
\end{document}
您可以使用 Sergei 的答案中的 as 来避免转到 tex 并返回load()
,但是保存程序片段的自然 Lua 数据类型是一个函数而不是字符串。
无需任何嵌套评估即可获得以下相同的输出。
\documentclass{article}
\begin{document}
\newcommand{\amacro}[1]{bla#1bla}
\directlua{
a=1
atext='stupid text'
function apgm () a=a+1 end % the content is a program
}
\directlua{tex.print(atext)} % contents in the TeX flow : works
\amacro{\directlua{tex.print(atext)}} % contents used in a macro : works
\directlua{tex.print(a)} % a is 1
\directlua{apgm()} %
\directlua{tex.print(a)} % a is 2
\end{document}