
Прошло уже некоторое время с тех пор, как я задавал неловкий вопрос, и я почти уверен, что это еще один из них: Этот код ниже пытается использовать \IfStrEqCase
fromпакет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}