使用布尔标志定义命令/宏

使用布尔标志定义命令/宏

我想要一个带有布尔标志的命令。该标志应该在条件语句中使用。

我很想有这样的东西:

\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

expkvexpkv-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}

在此处输入图片描述

相关内容