我以前使用过以下方法并且很有效:
\documentclass{minimal}
\usepackage{luacode,luatextra}
\begin{document}
\begin{luacode*}
MyVal=123
tex.print("\\def\\MyVal{"..MyVal.."}")
\end{luacode*}
MyVal=\MyVal
\end{document}
并且运行良好。
今天我不得不使用相同的源文件,现在这段代码不再定义可以调用的宏lualatex
,即我现在收到Undefined command
消息。
我读了以下内容: 我应该将哪个 Lua 环境与 LuaTeX(LuaLaTeX)一起使用? 和 在 Lua 块内创建宏
我尝试了luacode
sans and 和 '*' 以及tex.sprint
。
我尝试过tex.tprint
,但我必须深入研究有关该内容的文档。
我的问题是:
- 过去两个月有什么变化吗?
如何做与以下相同的事情
lualatex
:\def{Myval}{100}
我也添加\noexpand
并更改\\
为\
,但无济于事。
答案1
该luacode*
环境与其他 LaTeX 环境一样形成一个组。因此,如果您想使用此方法并具有值“escape”,则需要使用\gdef
\documentclass{article}
\usepackage{luacode,luatextra}
\begin{document}
\begin{luacode*}
MyVal=123
tex.print("\\gdef\\MyVal{"..MyVal.."}")
\end{luacode*}
MyVal=\MyVal
\end{document}
正如所观察到的我应该将哪个 Lua 环境与 LuaTeX(LuaLaTeX)一起使用?,最好的方案是使用单独的文件,并在不分组的情况下加载它,ETC。
\RequirePackage{filecontents}
\begin{filecontents*}{\jobname.lua}
MyVal=123
tex.print("\\def\\MyVal{"..MyVal.."}")
\end{filecontents*}
\documentclass{article}
\begin{document}
\directlua{require("\jobname.lua")}
MyVal=\MyVal
\end{document}
答案2
如果您只需要将值导出为宏,即没有签名的宏,那么您也可以使用token
LuaTeX 库。与 Joseph 的回答相同:因为luacode*
是分组,所以您必须添加"global"
说明符。
\documentclass{article}
\usepackage{luacode}
\begin{luacode*}
MyVal = 123
token.set_macro("MyVal",MyVal,"global")
\end{luacode*}
\begin{document}
\MyVal
\end{document}
在 ConTeXt MkIV 中,你不需要将控制序列声明为全局的,因为这里\startluacode ... \stopluacode
是不是分组。
\startluacode
MyVal = 123
token.set_macro("MyVal",MyVal)
\stopluacode
\starttext
\MyVal
\stoptext