l3keys多选的复杂使用

发布于 2026-01-16 18:05:23

l3keys我想写个多选:

共有L,R两个选项,需求预期:
1.0. 输入{ mode={ L, R } },得到{ L=true, R=true }
1.1. 输入{ mode=L },得到{ L=true } (R=false可有可无,下同);
1.2. 输入{ mode=R },得到{ R=true }
希望选项输入时mode=可以省略,即:
2.0. 输入{ L, R },得到{ L=true, R=true }
2.1. 输入{ L },得到{ L=true } (R=false可有可无,下同);
2.2. 输入{ R },得到{ R=true }


又增加需求预期:
0.0. 不输入,得到{ L=true, R=true }
使用.initial:n = { L, R }会妨碍单独输入{ (mode=)L/R }的功能,应该如何解决?


再增加需求预期:
3.1. 输入{ L=false },得到{ L=false, R=true }
3.2. 输入{ R=false },得到{ L=true , R=false }
应该如何解决?


2026.01.18更新:

已解决

更新了思路:

\tl_new:N \l__l_tl
\tl_new:N \l__r_tl
\bool_new:N \l__l_bool
\bool_new:N \l__r_bool
\keys_define:nn { mymodule }
  {
    L .code:n     = { \tl_set:Ne \l__l_tl { \fp_compare_p:n {#1} } },
    L .default:n  = { true },
    R .code:n     = { \tl_set:Ne \l__r_tl { \tl_to_bool_p:n {#1} } },
    R .default:n  = { true },
  }
\keys_set:nn { mymodule } { }
\tl_if_empty:NTF \l__l_tl
  { \bool_set:Nn \l__l_bool { \bool_lazy_or_p:nn { \tl_if_empty_p:N \l__r_tl } { ! \l__r_tl } } }
  { \bool_set_eq:NN \l__l_bool \l__l_tl }
\tl_if_empty:NTF \l__r_tl
  { \bool_set:Nn \l__r_bool { \bool_lazy_or_p:nn { \tl_if_empty_p:N \l__l_tl } { ! \l__l_tl } } }
  { \bool_set_eq:NN \l__r_bool \l__r_tl }
\typeout {=====~L:~\bool_to_str:N \l__l_bool,~R:~\bool_to_str:N \l__r_bool~=====}

赋值后:
如果L为空,则取R的值:
R也为空,即均为空,应均为true,L=true
R不为空,则取反,L=!R
伪代码应为

L = \bool_lazy_or_p:nn
      { \tl_if_empty_p:N R } %若为空则L=true,且短路(不短路对empty取反会报错)
      { !R }                 %若不为空则取反

另外用了个语法糖:

\bool_set:Ne \l__L_bool { \fp_compare_p:n #1 }

interface330.13:(在fp表达式中) truefalse: Other names for 1 and +0.

查看更多

关注者
0
被浏览
201
2 个回答
飘石
飘石 2天前
这家伙很懒,什么也没写!
\cs_new:Npn \__my_bool_set:Nn #1#2
{
        \str_case:nn {#2}
        {
                {true}  {\bool_set_true:N       #1}
                {false} {\bool_set_false:N      #1}
                {}      {\bool_set_true:N       #1}
        }
}

\keys_define:nn { mymodule }{
    L .code:n = { \__my_bool_set:Nn \l__L_bool {#1}},
    R .code:n = { \__my_bool_set:Nn \l__R_bool {#1}},
    L .initial:n  = {false},
    R .initial:n  = {false},
}
Hydroxyl
Hydroxyl 3天前
这家伙很懒,什么也没写!
\bool_new:N \l__L_bool
\bool_new:N \l__R_bool
\bool_set_true:N \l__L_bool
\bool_set_true:N \l__R_bool

\keys_define:nn { mymodule }{
    L .bool_set:N = \l__L_bool,
    L .default:n  = {true},
    R .bool_set:N = \l__R_bool,
    R .default:n  = {true},
}

撰写答案

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览