如何将 tex 命令中的多个参数传递给 lua 函数,同时对其进行转义
或者我该如何修改
(进口)
\usepackage{luacode}
\newcommand{\example}[1]{
\directlua{
function debug(...)
local arr = {...}
for i, v in pairs(arr) do
print(v)
end
end
debug(#1)
}
}
使得
\example{\notDefined, aNilValue, 5}
产生标准输出
\notDefined
aNilValue
5
而不是扔
- 未定义控制序列(乳胶错误)
- 或者由于变量
aNilValue
未定义,因此不打印任何内容
我尝试过使用\luastring{\unexpanded{...}}
,\docsvlist
但总是收到失控的参数
编辑
明确地说,所有传递的参数都应该是字符串,因此local arr = {...}
在示例中应该相等{"\\notDefined", "aNilValue", "5"}
答案1
它可以更多地关注空格,但这会使整个列表成为一个 lua 字符串,然后在逗号上拆分,因此每个项目都被解释为一个字符串。
\newcommand{\example}[1]{%
\directlua{
function debug(s)
for v in string.gmatch(s,'[^,]*') do
print(v)
end
end
debug("\luaescapestring{\detokenize{#1}}",",")
}%
}
\typeout{}
\example{\notDefined, aNilValue, 5}
\stop
产生终端输出
\notDefined
aNilValue
5
答案2
此解决方案使用 LaTeX3 的逗号分隔列表。的参数\example
将写入日志文件。
\documentclass{article}
\usepackage{expl3}
\directlua{
function debug(...)
local arr = {...}
for i, v in pairs(arr) do
texio.write_nl(v)
end
end
}
\ExplSyntaxOn
\newcommand{\example}[1]{
% construct comma separated list
\clist_set:Nn \l_tmpa_clist {#1}
% construct lua string for each component
% and store them in a sequence
\seq_clear:N \l_tmpa_seq
\clist_map_inline:Nn \l_tmpa_clist {
\str_set:Nn \l_tmpa_str {##1}
\seq_put_right:Nx \l_tmpa_seq {"\luaescapestring{\l_tmpa_str}"}
}
\directlua{debug(\seq_use:Nn \l_tmpa_seq {,})}
}
\ExplSyntaxOff
\begin{document}
\example{\notDefined, aNilValue, 5}
\end{document}