
제가 당황스러운 질문을 한 지 꽤 시간이 지났고 이것이 그 중 또 다른 질문이라고 확신합니다. 아래 코드는 다음 \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}