\IfStrEqCase tiene problemas con el último parámetro opcional

\IfStrEqCase tiene problemas con el último parámetro opcional

Ha pasado un tiempo desde que hice una pregunta embarazosa y estoy bastante seguro de que esta es otra de ellas: este código a continuación intenta usar \IfStrEqCasedesdeel xstringpaquetey da como resultado:

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

para el caso en el que ninguno de los casos coincide, pero no sé 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}

Respuesta1

La macro interna que comprueba los casos es \@xs@testcase. Usando \tracingmacros=1su 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 la primera prueba; puedes ver el espacio en blanco resultante del final de línea después {Found Case A}. Esto no es un problema, porque este espacio no será considerado en la próxima prueba:

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

¿Ves el problema? El tercer argumento \@xs@testcaseestá delimitado por \@xs@nily, en este caso, un espacio en blanco es tan bueno como un argumento como cualquier lista de tokens. TeX ignora los espacios sólo cuando buscano delimitadoargumentos.

Agregue %al final de las líneas, si usa ese tipo de estilo de entrada.

Probablemente xstringdebería usar una prueba para \ifblanken lugar de \ifempty.

Respuesta2

Aquí una solución alternativa: redefina \IfStrEqCasepara que siempre incluya un caso coincidente. El mismo enfoque también 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}

información relacionada