
オプションの引数を持つコマンドがあり、引数が または であるかどうかに応じて何らかのコードを実行したいと考えています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}
expl3
true
false
たとえば、\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}