
自從我問一個令人尷尬的問題以來已經有一段時間了,我很確定這是另一個問題:下面的程式碼嘗試使用\IfStrEqCase
fromxstring
包裹並得出結果:
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}