\IfStrEqCase 最後一個可選參數有問題

\IfStrEqCase 最後一個可選參數有問題

自從我問一個令人尷尬的問題以來已經有一段時間了,我很確定這是另一個問題:下面的程式碼嘗試使用\IfStrEqCasefromxstring包裹並得出結果:

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}

相關內容