我目前正在维护一个模板,该模板用于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 代码不喜欢这个字符,但我没有找到任何关于这一点的提及(或如何绕过它)。dofile
require
@
所以我的问题是:如何使用 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}