我应该如何从 lualatex 启动包含在 lua 变量中的 lua 程序?

我应该如何从 lualatex 启动包含在 lua 变量中的 lua 程序?

我将内容存储在 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}

相关内容