如何使用可選參數檢查命令中的布林參數?

如何使用可選參數檢查命令中的布林參數?

我有一個帶有可選參數的命令,並且我想根據參數是否為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}

相關內容