20 如何根据 expl3 的 clist 中某个 item 是否后面带有 star (*) 进行 True 和 False 分支输出?

发布于 2024-10-28 16:40:11

如问题描述,已知一个 clist

\clist_set:N \l__skyrmion_tmp_clist
  { explorer, fishrows*, eureka, admin, skyrmion }

其中第二个 itemfishrows,其后面带有 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.

查看更多

关注者
0
被浏览
307
雾月
雾月 2024-10-28
这家伙很懒,什么也没写!
\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}
1 个回答

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览