선택적 인수가 있는 명령에서 부울 인수를 확인하는 방법은 무엇입니까?

선택적 인수가 있는 명령에서 부울 인수를 확인하는 방법은 무엇입니까?

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)단일 토큰( N-type)을 인수로 예상하므로 \bool_if:NTF {true} {T}{F}구문상 유효하지 않습니다. -type 인수가 필요합니다 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

이것은 임의로 잘못된 입력을 방어하는 것이 아니라 몇 가지 추가 사례를 다룰 뿐이므로 사용할 수 없습니다.아무것입력으로. 또한 리터럴 truefalse는 단독으로 사용되는 경우에만 인식됩니다. 즉, 예상대로 작동하지만 \test[true]에서 인식 되지 않기 때문에 작동하지 않으며 리터럴은 로 직접 이동하여 이전과 같이 실패합니다.\test[false]\test[!true]!true\str_case:nn(TF)true\bool_if:n(TF)

또한 인수가 있음을 보장할 수 있는 개인용 명령인 경우 인수를 선택적으로 만들 필요가 없습니다. 처리 속도가 느려질 뿐입니다.

답변2

명령이 수행해야 하는 작업에 대해 자세히 설명하지 않았습니다. 그러나 "true" 및 "false" 인수를 사용하고 이에 대해 문자열 비교를 수행하는 대신 일반적으로 인수에 key val 구문을 사용하고 이를 사용하여 실제 부울을 설정하는 것이 더 좋습니다.

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

관련 정보