У меня проблема с проверкой некоторых переменных: я предлагаю пользователю опцию в интерфейсе класса документа. Если опция не предоставлена, мой код не работает. Поэтому я хотел бы проверить, была ли предоставлена опция или нет. В других средах программирования я бы сделал это с помощью TRY/CATCH "!=" не равно. Как это сделать в LaTeX?
Минимальный пример выглядит так:
1) класс документа minimalExample.cls
:
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{FAIRControlledDocument}[2017/07/03 minimalExample]
\LoadClass[a4paper,11pt]{report}
\RequirePackage{ifthen}
\RequirePackage{xkeyval}
\providecommand{\theVariable}[1]{\@empty}
\DeclareOptionX{docoption}{%
\def\theVariable{#1}%
}
\ProcessOptionsX
% pre-defined document types
\ifdefined\theVariable
\ifthenelse{\equal{\theVariable}{a} \OR \equal{\theVariable}{b}}{%
\providecommand\fcd@type@xx{some text}%
}{}
\fi
2) работа minimalExample.tex
:
\documentclass[docoption=a]{minimalExample}
\begin{document}
test
\end{document}
3) сбой minimalExample.tex
:
\documentclass[]{minimalExample}
\begin{document}
test
\end{document}
Я хотел бы проверить, \theVariable
имеет ли переменная значение, если оно не указано, и обойти код сбоя, если нет. Есть идеи?
решение1
Просто удалите \providecommand{\theVariable}
строку: вы ведь потом проверяете, существует ли она \ifdefined
, не так ли?
Однако, если вам позже понадобится проверить, равно ли оно \@empty
, то сделайте так:
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{FAIRControlledDocument}[2017/07/03 minimalExample]
\LoadClass[a4paper,11pt]{report}
\RequirePackage{ifthen}
\RequirePackage{xkeyval}
\newcommand*{\theVariable}{}
\DeclareOptionX{docoption}{%
\def\theVariable{#1}%
}
\ProcessOptionsX
% pre-defined document types
\ifthenelse{\equal{\theVariable}{a} \OR \equal{\theVariable}{b}}{%
\providecommand\fcd@type@xx{some text}%
}{}
Обратите внимание \newcommand*
, что вместо \providecommand
(и без аргументов); обратите внимание также, что я определяю его \theVariable
как пустое по умолчанию, поэтому проверка
\ifx\theVariable\@empty
будет успешным. Этого не произойдет, если вы сделаете \newcommand*{\theVariable}{\@empty}
, потому что в этом случае текст замены \theVariable
не пуст: ящик, содержащий пустой ящик, не пуст, не так ли?
решение2
Ответ на это довольно прост. Ваше определение по умолчанию \theVariable
требует аргумента, а то, которое вы определяете, если опция используется, не требует, поэтому у вас есть два разных определения в зависимости от использования опции. Код дает сбой, потому что вы не предоставляете аргумент, \theVariable
в то время как он запрашивает его.
Чтобы исправить это, просто используйте \providecommand*{\theVariable}{\@empty}
. Обратите внимание, что я добавил , *
потому что вам не нужно \theVariable
быть длинным, так как он не принимает аргументы в любом случае.
Итак, ваш .cls должен выглядеть так:
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{FAIRControlledDocument}[2017/07/03 minimalExample]
\LoadClass[a4paper,11pt]{report}
\RequirePackage{ifthen}
\RequirePackage{xkeyval}
\providecommand*{\theVariable}{\@empty}
\DeclareOptionX{docoption}{%
\def\theVariable{#1}%
}
\ProcessOptionsX\relax
% pre-defined document types
\ifdefined\theVariable
\ifthenelse{\equal{\theVariable}{a} \OR \equal{\theVariable}{b}}{%
\providecommand\fcd@type@xx{some text}%
}{}
\fi
решение3
Я попробовал подходы egreg и Skillmon, но не смог запустить код. Наконец, мне удалось решить мою настоящую проблему следующим определением класса:
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{FAIRControlledDocument}[2017/07/03 minimalExample]
\LoadClass[a4paper,11pt]{report}
\RequirePackage{ifthen}
\RequirePackage{xkeyval}
%\providecommand{\theVariable}[1]{\@empty} <-- Do not defined this variable
\DeclareOptionX{docoption}{%
\def\theVariable{#1}%
}
\ProcessOptionsX
% pre-defined document types
\ifdefined\theVariable
\ifthenelse{\equal{\theVariable}{a} \OR \equal{\theVariable}{b}}{%
\providecommand\fcd@type@xx{some text}%
}{}
\else
\def\documentLanguage{xx} <-- set some special value for later use
\fi
Тем не менее, мой более важный вопрос о try/catch не решен, но я закрою проблему как «решенную» — мой код теперь работает.