有\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>
}