\noinsuit
나는 두 개의 매개변수, 즉 [0, 13]의 정수와 슈트를 나타내는 문자를 취하는 명령에 대한 사용자 입력의 기본적인 유효성 검사를 작성하려고 합니다 .
그래서 나는 \noinsuit{1}{C}
유효하고 둘 다 유효할 것으로 \noinsuit{Q}{C}
기대 \noinsuit{1}{Q}
합니다. 잘 작동하지만 xstring
's를 사용하여 \StrLeft{#1}{1}
첫 번째 문자가 정수인지 테스트하는 데 문제가 있습니다 . 다음 MWE는 해당 값을 올바르게 인쇄하지만 테스트 줄의 주석 처리를 제거하면 오류가 발생합니다.
! Undefined control sequence.
\xs_StrLeft__ ...ef \xs_arg_ii {#2}\edef \xs_call
{\noexpand \xs_testopt {\n...
확장에 문제가 있는 것 같아요.
\documentclass{article}
\usepackage{xparse}
\usepackage{xstring}
\newcommand{\singpl}{bad}
\newcommand{\test}{bad}
\NewDocumentCommand\noinsuit{mm}{%
\renewcommand{\test}{\StrLeft{#1}{1}}
% \IfInteger{\test}{\renewcommand{\singpl}{cards}}{[\PackageError{BridgeStyle : \noinsuit}{Invalid integer (#1)}{}]}%
\IfEqCase{#1}{%
{1}{\renewcommand{\singpl}{card}}%
}
\IfEqCase{#2}{%
{C}{#1 \singpl{}\quad\test in Clubs}%
{D}{#1 \singpl{} in Diamonds}%
{H}{#1 \singpl{} in Hearts}%
{S}{#1 \singpl{} in Spades}%
}[\PackageError{BridgeStyle : \noinsuit}{Unknown suit (#2)}{}]%
}%
\begin{document}
\noinsuit{1}{C}
\noinsuit{2}{C}
% \noinsuit{Q}{H}
% \noinsuit{3}{Q}
\end{document}
답변1
\StrLeft
에 대한 인수 내부에서는 사용할 수 없습니다 \IfInteger
. 문자열이 아닌 문자열을 작성하라는 지침을 전달하고 있습니다.
차라리
\StrLeft{#1}{1}[\test]
\IfInteger{\test}
{\renewcommand{\singpl}{cards}}
{\PackageError{BridgeStyle : \noinsuit}{Invalid integer (#1)}{}}%
반면에 를 사용하면 더 많은 제어를 얻을 수 있습니다 expl3
.
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand\noinsuit{mm}
{
\bridgestyle_noinsuit_checknumber:nn { #1 } { #2 }
}
\cs_new_protected:Nn \bridgestyle_noinsuit_checknumber:nn
{
\regex_match:nnTF { \A [0-9]{1,2} \Z } { #1 }
{% we have one or two digits
\int_compare:nTF { #1 <= 13 }
{% the integer is between 0 and 13
\bridgestyle_noinsuit_checksuit:nn { #1 } { #2 }
}
{% error
\bridgestyle_noinsuit_invalid:nn { integer } { #1 }
}
}
{% invalid input for the integer
\bridgestyle_noinsuit_invalid:nn { integer } { #1 }
}
}
\cs_new_protected:Nn \bridgestyle_noinsuit_checksuit:nn
{
\regex_match:nnTF { \A [CDHS] \Z } { #2 }
{% valid suit
#1~card\int_compare:nF { #1=1 } {s}~in~\bridgestyle_suit:n { #2 }
}
{% invalid suit
\bridgestyle_noinsuit_invalid:nn { suit } { #2 }
}
}
\cs_new:Nn \bridgestyle_suit:n
{
\str_case:nn { #1 }
{
{C}{Clubs}
{D}{Diamonds}
{H}{Hearts}
{S}{Spades}
}
}
\cs_new_protected:Nn \bridgestyle_noinsuit_invalid:nn
{
\PackageError{bridgestyle}{(\string\noinsuit)~invalid~#1~(#2)}{}
}
\ExplSyntaxOff
\begin{document}
\noinsuit{0}{D}
\noinsuit{1}{C}
\noinsuit{2}{C}
\noinsuit{Q}{H}
\noinsuit{3}{Q}
\noinsuit{14}{H}
\end{document}
콘솔 출력은
! Package bridgestyle Error: (\noinsuit) invalid integer (Q).
See the bridgestyle package documentation for explanation.
Type H <return> for immediate help.
...
l.65 \noinsuit{Q}{H}
?
! Package bridgestyle Error: (\noinsuit) invalid suit (Q).
See the bridgestyle package documentation for explanation.
Type H <return> for immediate help.
...
l.67 \noinsuit{3}{Q}
?
! Package bridgestyle Error: (\noinsuit) invalid integer (14).
See the bridgestyle package documentation for explanation.
Type H <return> for immediate help.
...
l.69 \noinsuit{14}{H}
?
인쇄된 출력물은