![获取包选项作为 lua 字符串,并允许任意包选项](https://linux22.com/image/439697/%E8%8E%B7%E5%8F%96%E5%8C%85%E9%80%89%E9%A1%B9%E4%BD%9C%E4%B8%BA%20lua%20%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%8C%E5%B9%B6%E5%85%81%E8%AE%B8%E4%BB%BB%E6%84%8F%E5%8C%85%E9%80%89%E9%A1%B9.png)
我正在制作一个基于 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 历史上处理选项的方式,你的选项仍然需要在一次任务中存活下来而不会被破坏。