问题来自:https://ask.latexstudio.net/ask/question/17468.html
如问题描述,已知一个 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 } %
}
\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~ } % \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}
全新 LaTeX 知识库,入门资料,免费知识代码:
https://www.latexstudio.net/LearnLaTeX/
精心制作免费视频教程:
https://space.bilibili.com/209746320