Zuweisen eines Wertes aus xstring

Zuweisen eines Wertes aus xstring

Ich versuche, eine grundlegende Validierung der Benutzereingabe für einen Befehl zu schreiben \noinsuit, der zwei Parameter annimmt, eine Ganzzahl im Bereich [0, 13] und einen Buchstaben, der die Farbe angibt.

Ich erwarte also, \noinsuit{1}{C}dass es gültig ist und dass sowohl \noinsuit{Q}{C}als auch \noinsuit{1}{Q}ungültig ist. Das funktioniert gut, aber ich habe ein Problem damit, xstring's zu verwenden \StrLeft{#1}{1}, um zu testen, ob das erste Zeichen eine Ganzzahl ist. Das folgende MWE druckt seinen Wert korrekt, aber wenn ich die Testzeile auskommentiere, wirft es

! Undefined control sequence.
\xs_StrLeft__ ...ef \xs_arg_ii {#2}\edef \xs_call 
                                                  {\noexpand \xs_testopt {\n...

Ich vermute, es liegt ein Problem mit der Erweiterung vor.

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

Antwort1

Sie können nicht \StrLeftinnerhalb des Arguments verwenden \IfInteger. Sie übergeben die Anweisungen zum Erstellen einer Zeichenfolge und nicht die Zeichenfolge.

Mach lieber

  \StrLeft{#1}{1}[\test]
  \IfInteger{\test}
    {\renewcommand{\singpl}{cards}}
    {\PackageError{BridgeStyle : \noinsuit}{Invalid integer (#1)}{}}%

Andererseits erhalten Sie mehr Kontrolle durch die Verwendung 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}  

Die Konsolenausgabe ist

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

? 

Die gedruckte Ausgabe ist

Bildbeschreibung hier eingeben

verwandte Informationen