オプション引数を持つコマンドでブール引数をチェックするにはどうすればよいですか?

オプション引数を持つコマンドでブール引数をチェックするにはどうすればよいですか?

オプションの引数を持つコマンドがあり、引数が または であるかどうかに応じて何らかのコードを実行したいと考えています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) を期待しているため、構文的に無効であることに注意してください。 -type 引数 が必要です: 。ただし、 のブール関数はリテラルと を理解しないため、これも機能しません。そのため、 が意味することを理解できるようにする必要があります。N\bool_if:NTF {true} {T}{F}n\bool_if:nTF {true} {T}{F}expl3truefalse

たとえば、\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

これは、任意の不正な入力から保護するものではなく、いくつかの追加のケースをカバーするだけなので、何でもを入力として使用します。また、リテラルtrueと は、false単独で使用した場合にのみ認識されます。つまり、\test[true]と は\test[false]期待どおりに機能しますが、は\test[!true]機能しません。これは、!trueが によって認識されず\str_case:nn(TF)、リテラルtrueが に直接渡され\bool_if:n(TF)、前と同じように失敗するためです。

また、引数を持つことが保証されているプラ​​イベート使用のコマンドの場合は、処理が遅くなるだけなので、引数をオプションにするのは意味がありません。

答え2

コマンドが何をすべきかについて、あまり詳しく説明されていません。しかし、引数「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}

関連情報