expl3 布尔值开关:是否有 \bool_case:Nnn?

expl3 布尔值开关:是否有 \bool_case:Nnn?

\int_case:Nnn,,,但我找不到类似的\tl_case:Nnn东西。\str_case:Nnn\bool_case:Nnn

我知道我可以写:

\bool_if:NT \l__<mymodule>_<nameA>_bool { ... }
\bool_if:NT \l__<mymodule>_<nameB>_bool { ... }
\bool_if:NT \l__<mymodule>_<nameC>_bool { ... }
\bool_if:NT \l__<mymodule>_<nameD>_bool { ... }

达到同样的效果,甚至

\bool_if:NTF \l__<mymodule>_<nameA>_bool 
{
   <some code>
}
{
    \bool_if:NTF \l__<mydoclue>_<nameB>_bool
    {
        <some code>
    }
    {
        <continue nesting w/ default value in last *F*> 
    }
}

但是第一个例子评估了所有的布尔值,如果所有布尔值都失败了,就没有干净的方法来获得默认值。第二个例子真的很笨重,难以阅读,而且很难改变,例如,如果你后来决定应该以不同的顺序测试布尔值。

是否存在我还没想到的替代方案?

答案1

改编来自的代码\tl_case:Nnn,我得到以下内容:

\documentclass{minimal}
\usepackage{expl3, xparse}

\ExplSyntaxOn

\cs_new:Npn \bool_case:nn #1#2
  {
    \tex_romannumeral:D
      \__bool_case:w #1 \c_true_bool {#2} \q_recursion_stop
  }
\cs_new:Npn \__bool_case:w #1#2
  {
    \bool_if:nTF { #1 }
      { \__bool_case_end:nw {#2} }
      { \__bool_case:w }
  }
\cs_new_eq:NN \__bool_case_end:nw \__prg_case_end:nw

\bool_gset_false:N \g_tmpa_bool
\bool_gset_true:N \g_tmpb_bool

\NewDocumentCommand \testboolcase {} {
    \bool_case:nn {
        \g_tmpa_bool { false;~ can't~ happen }
        \g_tmpb_bool { true;~ should~ happen }
      }
      { else;~ can't~ happen }
  }

\NewDocumentCommand \testboolcaseelse {} {
    \bool_case:nn {
        \g_tmpa_bool { false;~ can't~ happen }
        { !\g_tmpb_bool } { false;~ can't~ happen }
      }
      { else;~ should~ happen }
  }

\ExplSyntaxOff

\begin{document}
\testboolcase

\testboolcaseelse
\end{document}

请注意,某些布尔表达式有效,但诸如此类则{ 1 = 2 }无效。

答案2

我想我正在寻找类似的东西

\bool_new:N \l_ae_a_bool
\bool_new:N \l_ae_b_bool
\bool_new:N \l_ae_c_bool
\bool_new:N \l_ae_d_bool

<intermediary code>

\bool_new:N \l_ae_continue_bool
\bool_set_false:N \l_ae_continue_bool
\bool_if:NTF \l_ae_a_bool 
  { 
    <code-a> 
    \bool_set_false:N \l_ae_continue_bool %% here for just good measure!
  } 
  { 
     \bool_set_true:N \l_ae_continue_bool 
  }
\bool_if:NT \l_ae_continue_bool
  {
    \bool_if:NTF \l_ae_b_bool 
      {
        <code-b> 
        \bool_set_false:N \l_ae_continue_bool
      } 
      { 
        \bool_set_true:N \l_ae_continue_bool 
      }
  }
\bool_if:NT \l_ae_continue_bool
  {
    \bool_if:NTF \l_ae_c_bool 
      {
        <code-c> 
        \bool_set_false:N \l_ae_continue_bool
      } 
      { 
        \bool_set_true:N \l_ae_continue_bool 
      }
  }
\bool_if:NT \l_ae_continue_bool
  {
    \bool_if:NTF \l_ae_d_bool 
      {
        <code-d> 
        \bool_set_false:N \l_ae_continue_bool
      } 
      { 
        \bool_set_true:N \l_ae_continue_bool 
      }
  }
\bool_if:NF \l_ae_continue_bool
  {
    <default code>
  }

相关内容