共有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 }interface3 30.13:(在fp表达式中) true false: Other names for 1 and +0.
\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},
}
感谢回复!
但这个默认值是
L=false, R=false;理想情况是:
true;另外用了个语法糖:
interface330.13:(在fp表达式中)truefalse: Other names for 1 and +0.