如何使用可选参数检查命令中的布尔参数?

如何使用可选参数检查命令中的布尔参数?

我有一个带有可选参数的命令,我想根据参数是否为true或来执行一些代码false(我确信此命令将始终具有一些可转换为布尔值的参数,因为它将是一个私有命令,而不是用户命令)。 使用我的代码时出现此错误:

! Missing number, treated as zero.
<to be read again> 
                   t
l.8     \test{
              }
?

感谢大家的帮助。

\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\newcommand{\test}[1][true]{
\bool_if:NTF{#1}{\message{true}}{\message{false}}
}
\test{}
\ExplSyntaxOff
\end{document}

答案1

首先,请注意\bool_if:N(TF)需要一个标记(-type N)作为参数,因此\bool_if:NTF {true} {T}{F}在语法上是无效的。您需要n-type 参数:\bool_if:nTF {true} {T}{F}。但是这也不起作用,因为expl3的布尔函数不理解文字truefalse,因此您需要帮助它理解您的意思。

例如,您可以使用它\str_case:nnF来根据多个预定义的情况检查输入参数,如果没有匹配项,则通过分支退出F,然后\bool_if:n(TF)进行解析:

\documentclass{article}
\usepackage{xparse}
\begin{document}
\ExplSyntaxOn
\NewDocumentCommand \test { O{true} }
  {
    \bool_if:nTF
      {
        \str_case:nnF {#1}
          { % Known cases
            { true  } { \c_true_bool  }
            { T     } { \c_true_bool  }
            { 1     } { \c_true_bool  }
            %
            { false } { \c_false_bool }
            { F     } { \c_false_bool }
            { 0     } { \c_false_bool }
          }
          {#1} % Otherwise
      }
      { \iow_term:n {true} }
      { \iow_term:n {false} }
  }
%
\test % no argument
\test[true]  \test[1] \test[T] \test[\c_true_bool]  % true input
\test[false] \test[0] \test[F] \test[\c_false_bool] % false input
\test[\int_compare_p:n { 2+2>4 } && !\c_false_bool] % expressions
%
\ExplSyntaxOff
\end{document}

它将打印:

true
true
true
true
true
false
false
false
false
false

请注意,这并不能防止任意错误的输入,它只涵盖了一些额外的情况,因此您将无法使用任何事物作为输入。此外,文字truefalse仅当单独使用时才会被识别。也就是说,\test[true]\test[false]按预期工作,但\test[!true]不会,因为!true无法被识别\str_case:nn(TF),文字true然后直接转到\bool_if:n(TF),然后像以前一样失败。

此外,如果它是一个私有使用的命令,并且您可以保证它有一个参数,那么没有必要将参数设为可选,因为它只会减慢处理速度。

答案2

您没有提供太多有关命令应执行的操作的详细信息。但通常最好在参数中使用 key val 语法并用它们设置真正的布尔值,而不是使用参数“true”和“false”然后对它们进行字符串比较:

\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\keys_define:nn { alek }
 {
   dothis .bool_set:N = \l__alex_dothis_bool
 }

\newcommand{\test}[1][]
 {
  \keys_set:nn {alek}{dothis=true,#1} 
  \bool_if:NTF\l__alex_dothis_bool
   {true}
   {false}
 }
\ExplSyntaxOff

\test{}

\test[dothis]

\test[dothis=false]

\test[]
\end{document}

相关内容