tex.print 的 LuaLaTeX 输出未被解释

tex.print 的 LuaLaTeX 输出未被解释

这是我之前回答的自动创建工作表/考试的问题和解决方案。我意识到,我创建的宏是这样的

\ewcommand{\currentI}{\directlua{tex.print(math.random(1,10)) }}
\newcommand{\turnsN}{\directlua{tex.print(math.random(1,10) * 100) } }

每次使用宏时都会导致新值,因此对于创建问题和答案没有用,因为值会有所不同。

意识到这一点后,我尝试让它与 luacode/luacode* 在 [[]] 之间一起工作,但没有成功,\\例如

\begin{luacode*}
command_str = "\\newcommand{\\lengthL}{" .. (math.random(1,10)/10) .. "}\n"
print(command_str)
tex.sprint(command_str)
\end{luacode*}

输出打印在日志文件中返回我需要的字符串例如

 \newcommand{\lengthL}{0.7}

但这段代码似乎没有初始化我需要的变量,因为我收到了未定义的控制序列当我尝试使用时出现错误\lengthL。我尝试过很多不同的方法,这些方法我都可以在以前的答案中找到,但出于某种原因,我不知道为什么这不起作用。


完整的 MWE

\documentclass{article}

 \usepackage[binary-units]{siunitx}
 \usepackage{luacode}

\begin{document}

\begin{luacode*}

-- seed lua PRNG with os time
math.randomseed( os.time() )

command_str = "\\newcommand{\\lengthL}{" .. (math.random(1,10)/10) .. "}\n"
print(command_str)
tex.sprint(command_str)
\end{luacode*}

 mean circumference of \SI{\lengthL}{\metre} 

\end{document}

答案1

您已经被 LaTeX 环境形成一个组的事实所困扰,其中包括luacode(*)。 (请注意,document环境不会这样做,有人可能会认为luacode(*)也不应该这样做。)两种可能的解决方法:使用\gdef

...
command_str = "\\gdef\\lengthL{" .. (math.random(1,10)/10) .. "}\n"
...

或避免luacode*

\documentclass{article}
\usepackage{siunitx}
\newcommand*\lengthL{}
\directlua{math.randomseed(os.time())}
\edef\lengthL{%
  \directlua{tex.print(math.random(1,10)/10)}%
}

\begin{document}
mean circumference of \SI{\lengthL}{\metre}
\end{document}

相关内容