使用 lualatex 创建宏

使用 lualatex 创建宏

我以前使用过以下方法并且很有效:

\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 块内创建宏

我尝试了luacodesans and 和 '*' 以及tex.sprint

我尝试过tex.tprint,但我必须深入研究有关该内容的文档。

我的问题是:

  1. 过去两个月有什么变化吗?
  2. 如何做与以下相同的事情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

如果您只需要将值导出为宏,即没有签名的宏,那么您也可以使用tokenLuaTeX 库。与 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

相关内容