\IfStrEqCase hat ein Problem mit dem letzten optionalen Parameter

\IfStrEqCase hat ein Problem mit dem letzten optionalen Parameter

Es ist schon eine Weile her, seit ich eine peinliche Frage gestellt habe, und ich bin mir ziemlich sicher, dass dies wieder eine davon ist: Der folgende Code versucht, \IfStrEqCasefromDas xstringPaketund führt zu:

Runaway argument? 
{document} \par \par \par \documentclass {article} \usepackage {pgfpl\ETC.
! File ended while scanning use of \@xs@testcase.

für den Fall, dass keiner der Fälle übereinstimmt, aber ich weiß nicht, warum.

Anmerkungen:

Code:

\documentclass{article}
\usepackage{xstring}

%\newcommand{\CaseVar}{case A}% This works
%\newcommand{\CaseVar}{case B}%  This works
\newcommand{\CaseVar}{case C}% This does NOT!!!

\begin{document}
    \IfStrEqCase{\CaseVar}{%
        {case A}{Found Case A}
        {case B}{Found Case B}
    }[Oppsss, unknown case '\CaseVar'.]
\end{document}

Antwort1

Das interne Makro, das die Fälle überprüft, ist \@xs@testcase. \tracingmacros=1Wenn wir Ihre ursprüngliche Eingabe verwenden, erhalten wir:

\@xs@testcase #1#2#3\@xs@nil ->\@xs@reserved@E {\CaseVar }{#1}{#2}{\@xs@ifempty
 {#3}{Oppsss, unknown case '\CaseVar '.}{\@xs@testcase #3\@xs@nil }}
#1<-case A
#2<-Found Case A
#3<- {case B}{Found Case B} 

für den ersten Test; Sie können das Leerzeichen sehen, das durch das Zeilenende nach entsteht {Found Case A}. Dies ist kein Problem, da dieses Leerzeichen beim nächsten Test nicht berücksichtigt wird:

\@xs@testcase #1#2#3\@xs@nil ->\@xs@reserved@E {\CaseVar }{#1}{#2}{\@xs@ifempty
 {#3}{Oppsss, unknown case '\CaseVar '.}{\@xs@testcase #3\@xs@nil }}
#1<-case B
#2<-Found Case B
#3<- 

Sehen Sie das Problem? Das dritte Argument \@xs@testcasewird durch abgegrenzt \@xs@nilund in diesem Fall ist ein Leerzeichen genauso gut wie ein Argument wie jede Liste von Tokens. TeX ignoriert Leerzeichen nur bei der Suche nachunbegrenztArgumente.

Fügen Sie es %am Ende der Zeilen hinzu, wenn Sie diesen Eingabestil verwenden.

Wahrscheinlich xstringsollte ein Test für \ifblankanstelle von verwendet werden \ifempty.

Antwort2

Hier ein Workaround: Definieren Sie es neu, \IfStrEqCasesodass immer ein passender Fall berücksichtigt wird. Derselbe Ansatz funktioniert auch für \IfEqCase.

\documentclass{article}
\usepackage{xstring}

%\newcommand{\CaseVar}{case A}% This works
%\newcommand{\CaseVar}{case B}%  This works
\newcommand{\CaseVar}{case C}% Prints "Unknown case 'case C'."

% redefine \IfStrEqCase
\let\XstringIfStrEqCase\IfStrEqCase
\renewcommand\IfStrEqCase[2]{%
    \XstringIfStrEqCase{#1}{%
        #2%
        {#1}{Unknown case '#1'.}%
    }%
}

\begin{document}
    \IfStrEqCase{\CaseVar}{%
        {case A}{Found Case A}
        {case B}{Found Case B}
    }
\end{document}

verwandte Informationen