\IfStrEqCase tendo problema com o último parâmetro opcional

\IfStrEqCase tendo problema com o último parâmetro opcional

Já faz um tempo que não faço uma pergunta embaraçosa e tenho quase certeza de que esta é mais uma delas: Este código abaixo tenta usar \IfStrEqCasefromo xstringpacotee resulta em:

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

para o caso em que nenhum dos casos corresponde, mas não sei por quê.

Notas:

Código:

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

Responder1

A macro interna que verifica os casos é \@xs@testcase. Usando \tracingmacros=1sua entrada original, encontramos:

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

para o primeiro teste; você pode ver o espaço em branco resultante do final da linha após {Found Case A}. Isso não é problema, pois esse espaço não será considerado na próxima prova:

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

Você vê o problema? O terceiro argumento para \@xs@testcaseé delimitado por \@xs@nile, neste caso, um espaço em branco é tão bom como argumento quanto qualquer lista de tokens. TeX desconsidera espaços apenas quando procuraindelimitadoargumentos.

Adicione %no final das linhas, se você usar esse tipo de estilo de entrada.

Provavelmente xstringdeveria usar um teste para \ifblankem vez de \ifempty.

Responder2

Aqui está uma solução alternativa: redefina \IfStrEqCasepara que sempre inclua um caso correspondente. A mesma abordagem também funciona para \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}

informação relacionada