这是我之前回答的自动创建工作表/考试的问题和解决方案。我意识到,我创建的宏是这样的
\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}