我已经很久没有问过令人尴尬的问题了,我确信这又是一个:下面的代码尝试\IfStrEqCase
使用包裹xstring
结果是:
Runaway argument?
{document} \par \par \par \documentclass {article} \usepackage {pgfpl\ETC.
! File ended while scanning use of \@xs@testcase.
对于所有情况均不匹配的情况,但我不知道为什么。
笔记:
- 这尤其让我尴尬,因为我回答测试宏参数的最佳/正确方法是什么?使用
\IfStrEqCase
,代码运行正常。因此,不要认为这是版本问题。
代码:
\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}