参见下面的代码,前两个例子没有问题,而最后一个却出现了错误。
可能的原因是\seq_if_in:NnTF
不可扩展。
但是我想检查参数,如果参数不包含在某个序列中,则打印一些错误消息,同时使命令能够在其中使用\int_eval:n
或嵌套。
有什么办法吗?
\documentclass{article}
\usepackage{xparse}
\begin{document}
\ExplSyntaxOn
\seq_set_from_clist:Nn \l_tmpa_seq { 1, 2, 3 }
\cs_new:Nn \__add_one_or_two:n
{
\seq_if_in:NnTF \l_tmpa_seq { #1 }
{ \int_eval:n { #1 + 1} }
{ \int_eval:n { #1 + 2} }
}
% example 1, fine
\__add_one_or_two:n { 3 }
% example 2, fine
\__add_one_or_two:n { 4 }
% example 3
\int_eval:n { 2 + \__add_one_or_two:n { 5 } }
\ExplSyntaxOff
\end{document}
答案1
\seq_if_in:Nn(TF)
不可扩展,因为序列中的标记可能具有不同的 catcode:
\exp_args:NNx \seq_set_from_clist:Nn \l_tmpa_seq { \token_to_str:N : }
\seq_show:N \l_tmpa_seq
\seq_if_in:NnTF \l_tmpa_seq { : }
{ \show\T } { \show\F }
并且您无法(合理地)对其进行扩展测试。
另一方面,房产清单有关键的总是变成字符串,因此\prop_if_in:Nn(TF)
可以扩展。如果你可以更改数据类型,则可以滥用属性列表作为无 catcode 序列,从而允许扩展查询:
\documentclass{article}
\usepackage{xparse}
\begin{document}
\ExplSyntaxOn
\prop_set_from_keyval:Nn \l_tmpa_prop
{ % v empty values
1 = ,
2 = ,
3 =
}
\cs_new:Nn \__add_one_or_two:n
{
\prop_if_in:NnTF \l_tmpa_prop { #1 }
{ \int_eval:n { #1 + 1} }
{ \int_eval:n { #1 + 2} }
}
% example 1, fine
\__add_one_or_two:n { 3 }
% example 2, fine
\__add_one_or_two:n { 4 }
% example 3
\int_eval:n { 2 + \__add_one_or_two:n { 5 } }
\ExplSyntaxOff
\end{document}