xstringから値を割り当てる

xstringから値を割り当てる

\noinsuit私は、[0, 13] の整数とスーツを示す文字の 2 つのパラメータを取るコマンドへのユーザー入力の基本的な検証を記述しようとしています。

\noinsuit{1}{C}つまり、が有効で、 と\noinsuit{Q}{C}の両方が無効であることを期待しています。これはうまく機能していますが、最初の文字が整数かどうかをテストするために's を\noinsuit{1}{Q}使用する際に問題が発生しています。次の MWE は値を正しく出力しますが、テスト行のコメントを解除すると、xstring\StrLeft{#1}{1}

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

? 

印刷された出力は

ここに画像の説明を入力してください

関連情報