我正在制作一个基于 lualatex 的类,它将是 lua 库的薄包装器。我想使用该luakeys
包来处理 lua 中的选项,并希望避免声明选项。我的问题有两个方面:
- 我可以允许我正在编写的包接受任意选项吗?
- 我如何在 lua 中以字符串形式检索选项?
梅威瑟:
\ProvidesPackage{MWE}
\RequirePackage{luapackageloader}
\RequirePackage{luacode}
\DeclareOption*{} % I think this is sufficient to allow arbitrary options..
\ProcessOptions\relax
\begin{luacode*}
texio.write_nl('VVVVVVVVVVVVVVVV')
texio.write_nl(token.get_macro('@nameuse{[email protected]}')) -- isn't this
texio.write_nl(token.get_macro('@classoptionslist')) -- isnt this
local luakeys = require('luakeys')
local kv = luakeys.parse(token.get_macro('???')) --is there a command, or way I can get the raw options
-- that were passed to this package as a str ?
texio.write_nl('VVVVVVVVVVVVVVVV')
luakeys.print(kv)
\end{luacode*}
答案1
您想要访问的原始选项的宏是\@raw@opt@<file>.<ext>
。为了防止 LaTeX 对未知选项抛出错误,您应该执行\let\@unprocessedoptions\relax
。
这就是你想要的:
\ProvidesPackage{MWE}
\RequirePackage{luapackageloader}
\RequirePackage{luacode}
\begin{luacode*}
local luakeys = require('luakeys')
local kv= luakeys.parse(token.get_macro('@raw@[email protected]'))
luakeys.print(kv)
\end{luacode*}
\AtEndOfPackage{\let\@unprocessedoptions\relax}% don't throw errors for option
\endinput
并使用此驱动程序文件:
\RequirePackage[my=opt, opt=key]{MWE}
\stop
您将在终端输出中看到以下内容:
{
['opt'] = 'key',
['my'] = 'opt',
}
\edef
警告:由于 LaTeX 历史上处理选项的方式,你的选项仍然需要在一次任务中存活下来而不会被破坏。