
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, \IfStrEqCase
fromDas xstring
Paketund 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:
- Das ist besonders peinlich, da ich geantwortet habeWas ist die beste/richtige Methode, um ein Argument für ein Makro zu testen?verwenden
\IfStrEqCase
und dieser Code funktioniert einwandfrei. Denken Sie daher nicht, dass es sich um ein Versionsproblem handelt.
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=1
Wenn 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@testcase
wird durch abgegrenzt \@xs@nil
und 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 xstring
sollte ein Test für \ifblank
anstelle von verwendet werden \ifempty
.
Antwort2
Hier ein Workaround: Definieren Sie es neu, \IfStrEqCase
sodass 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}