\IfStrEqCase 的最后一个可选参数有问题

\IfStrEqCase 的最后一个可选参数有问题

我已经很久没有问过令人尴尬的问题了,我确信这又是一个:下面的代码尝试\IfStrEqCase使用包裹xstring结果是:

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

对于所有情况均不匹配的情况,但我不知道为什么。

笔记:

代码:

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

答案1

检查案例的内部宏是\@xs@testcase。使用\tracingmacros=1您的原始输入,我们发现:

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

对于第一个测试,您可以看到 后面​​的行尾空格{Found Case A}。这不是问题,因为下一个测试将不再考虑这个空格:

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

你看到问题了吗? 的第三个参数\@xs@testcase由分隔符分隔\@xs@nil,在这种情况下,空格与任何标记列表一样可以作为参数。 TeX 仅在查找以下项时忽略空格:未限定參數。

%如果您使用那种输入样式,请在行尾添加。

可能xstring应该使用测试\ifblank而不是\ifempty

答案2

这里有一个解决方法:重新定义\IfStrEqCase,使其始终包含匹配的大小写。同样的方法也适用于 \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}

相关内容