我想要一个带有布尔标志的命令。该标志应该在条件语句中使用。
我很想有这样的东西:
\command -> false
\command[flag=false] -> false
\command[flag] -> true
\command[flag=true] -> true
在定义中我会有一个像这样的开关:
\iftrue{#flag} true \else false \fi
答案1
使用高级的键值接口,如下expl3
:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\command}{O{}}
{
\keys_set:nn { brainstone/command }
{
flag=false, % initialize to false
#1
}
%
\bool_if:NTF \l_brainstone_command_flag_bool
{
The ~ flag ~ is ~ set ~ to ~ true
}
{
The ~ flag ~ is ~ set ~ to ~ false
}
}
\keys_define:nn { brainstone/command }
{
flag .bool_set:N = \l_brainstone_command_flag_bool,
flag .default:n = true,
}
\ExplSyntaxOff
\begin{document}
\command \ $\to$ false
\command[flag=false] $\to$ false
\command[flag] $\to$ true
\command[flag=true] $\to$ true
\end{document}
该标志将保留在当前范围内。
答案2
expkv
与expkv-def
前端一起使用的另一种解决方案。
此解决方案使用组来保持 key=value 参数的效果在本地。如果由于其他原因无法使用组,您也可以在-call 中flag=false
进行评估之前进行设置。#1
\ekvset
\documentclass{article}
\usepackage{expkv-def}
\ekvdefinekeys{brainstone}
{
boolTF flag = \brainstoneFlag
}
\NewDocumentCommand\brainstone{O{}}
{%
\begingroup % group keeping the changes local
\ekvset{brainstone}{#1}%
The flag is set to \brainstoneFlag{true}{false}.%
\endgroup
}
\begin{document}
\brainstone
\brainstone[flag=false]
\brainstone[flag]
\brainstone[flag=true]
\end{document}