
恥ずかしい質問をするのは久しぶりですが、これもまた恥ずかしい質問の一つだと思います。以下のコードは\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<-
問題がお分かりですか? の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}