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 的大问题还没有得到解答,但我将把这个问题关闭为“已解决”——我的代码现在可以工作了

相关内容