如问题描述,已知一个 clist
为
\clist_set:N \l__skyrmion_tmp_clist
{ explorer, fishrows*, eureka, admin, skyrmion }
其中第二个 item
为 fishrows
,其后面带有 star (*)
那么我要实现一个判断,函数名为 \bool_if_item_star:nTF
,同时对其封装
\NewDocumentCommand \skyrmionif { m }
{
\clist_item:Nn \l__skyrmion_tmp_clist {#1}~is~
\bool_if_item_star:nTF
{ \clist_item:Nn \l__skyrmion_tmp_clist {#1} }
{ True } { False }
}
也就是说,此时 \skyrmionif{1}
会输出 explorer is false
,\skyrmionif{2}
会输出 fishrows is true
. 需要注意的是还要保障带有 star (*) 的 item,其输出不会带有star,即 不希望 \skyrmionif{2}
输出 fishrows* is true
.
\documentclass{article}
\ExplSyntaxOn
\quark_new:N \q__skyrmion_mark
\quark_new:N \q__skyrmion_stop
\prg_new_conditional:Npnn \skyrmion_if_item_star:n #1 { TF } % 完全可展的函数
{
\str_if_eq:eeTF { \skyrmion_strip_end_star:n {#1} } { \exp_not:n {#1} }
{ \prg_return_false: } % 如果移除掉结尾 * 号之后,两个相同,说明原来没有星号
{ \prg_return_true: } % 反之,则有
}
\cs_generate_variant:Nn \skyrmion_if_item_star:nTF { e }
\cs_new:Npn \skyrmion_strip_end_star:n #1 % 完全可展的函数,用 e 展开可得到结果
{
\__skyrmion_strip_end_star:w
\prg_do_nothing: #1 \q__skyrmion_mark % 如果 #1 以 * 结尾,就用这个
#1 * \q__skyrmion_mark % 自己加上 *,如果 #1 不以 * 结尾,就会用这个
\q__skyrmion_stop
{#1} % <- 注意这个
}
\cs_new:Npn \__skyrmion_strip_end_star:w #1 *\q__skyrmion_mark #2 \q__skyrmion_stop
{
\tl_if_empty:nTF {#2} % 如果 #2 为空,说明使用是我们自己加的 *
{ \exp_not:n } % <- 这个保护的是上面带花括号的 {#1}
{ \exp_not:o {#1} \use_none:n } % <- \use_none:n 移除上面的 {#1}
}
\cs_generate_variant:Nn \skyrmion_strip_end_star:n { e }
\clist_new:N \l__skyrmion_tmp_clist
\NewDocumentCommand \skyrmionif { m }
{
\skyrmion_strip_end_star:e { \clist_item:Nn \l__skyrmion_tmp_clist {#1} }
{ ~is~ } % <- TeX 会忽略每行开头的空格,
\skyrmion_if_item_star:eTF
{ \clist_item:Nn \l__skyrmion_tmp_clist {#1} }
{ True } { False }
}
\clist_set:Nn \l__skyrmion_tmp_clist
{ explorer, fishrows*, eureka, admin, skyrmion }
\ExplSyntaxOff
\begin{document}
\skyrmionif{1}
\skyrmionif{2}
\ExplSyntaxOn \cs_generate_variant:Nn \tl_to_str:n { e } \ttfamily
\tl_to_str:e { \skyrmion_strip_end_star:n { fishrows* } } |
\tl_to_str:e { \skyrmion_strip_end_star:n { {}* } } |
\tl_to_str:e { \skyrmion_strip_end_star:n { {} } } |
\tl_to_str:e { \skyrmion_strip_end_star:n { * } } |
\ExplSyntaxOff
\end{document}