如何将 xkeyval 键与 Lua 代码集成

如何将 xkeyval 键与 Lua 代码集成

我目前正在维护一个模板,该模板用于directlua根据 中定义为命令键的多个参数来计算值keyval。目前,它可以正确编译。但是,当我尝试调整它时,我得到了难以解决的神秘错误。

该模板非常复杂,这使得创建连贯的 MWE 变得困难,但这是我的尝试:

\documentclass{report}
\usepackage{xkeyval}
\usepackage{luacode}

\define@cmdkey{X}{y}[Z]{}
\begin{document}
  \setkeys*{X}{y="p"} 
  \directlua{
  if \cmdKV@X@y == "P" then
    var=1
  end
  }
\end{document}

我尝试了该包的一些变体,并使用和luacode从另一个文件导入脚本,总是出现指向文件末尾某处的错误。我怀疑 Lua 代码不喜欢这个字符,但我没有找到任何关于这一点的提及(或如何绕过它)。dofilerequire@

所以我的问题是:如何使用 Lua 脚本评估命令键值?


更新 10.05.18:如前所述,原始模板非常复杂,很难提取出完全准确的 MWE。不过,这个应该比原来的好一点:

\documentclass{report}
\usepackage{xkeyval}
\usepackage{luacode}

\makeatletter
\define@cmdkey{X}{y}[Z]{}

\newcommand{\mycommand}[1]{
   \setkeys*{X}{#1}

   \directlua{
     if \cmdKV@X@y == "P" then
       var=1
     else
       var=2
     end
     token.set_macro("amacro", var)
  }
  \amacro
}
\makeatother

\begin{document}
  \mycommand{y=P} 

\end{document}

如果我将其替换\cmdKV@X@y为更正常的命令(即类似 的命令\mymacro),它会正常工作并正确计算。但是,就目前情况而言,它表现得好像缺少了某些东西,堆栈跟踪指向其他地方(在文档中向下)。

答案1

您的代码存在多个问题:

  • 缺失\makeatletter-\makeatother
  • 密钥管理使用错误(定义中的系列和密钥名称与其用途不匹配)

以下代码是一个工作示例。将大写字母改为小写字母,您将看到一个 TeX 页面。

\documentclass{report}
\usepackage{xkeyval}
\usepackage{luacode}

\makeatletter
\define@cmdkey{ECVSS}{X}[Z]{}
\makeatother
\begin{document}
    \makeatletter
  \setkeys*{ECVSS}{X="P"} 
  \directlua{
  if \cmdKV@ECVSS@X == "p" then
    var=1
    tex.print("1")
  end
  }
  \makeatother
\end{document}

相关内容