Условные операторы в LaTeX: try/catch и «not \equal»

Условные операторы в LaTeX: try/catch и «not \equal»

У меня проблема с проверкой некоторых переменных: я предлагаю пользователю опцию в интерфейсе класса документа. Если опция не предоставлена, мой код не работает. Поэтому я хотел бы проверить, была ли предоставлена ​​опция или нет. В других средах программирования я бы сделал это с помощью 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 не решен, но я закрою проблему как «решенную» — мой код теперь работает.

Связанный контент