
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 \IfStrEqCase
desdeel xstring
paquetey 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:
- Esto es especialmente vergonzoso como respondí.¿Cuál es la forma mejor/correcta de probar un argumento para una macro?usando
\IfStrEqCase
y ese código funciona bien. Por lo tanto, no crea que es un problema de versión.
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=1
su 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@testcase
está delimitado por \@xs@nil
y, 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 xstring
debería usar una prueba para \ifblank
en lugar de \ifempty
.
Respuesta2
Aquí una solución alternativa: redefina \IfStrEqCase
para 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}