
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
이것은 임의로 잘못된 입력을 방어하는 것이 아니라 몇 가지 추가 사례를 다룰 뿐이므로 사용할 수 없습니다.아무것입력으로. 또한 리터럴 true
및 false
는 단독으로 사용되는 경우에만 인식됩니다. 즉, 예상대로 작동하지만 \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}