我遇到了一些变量检查问题:我在文档类的界面中为用户提供了一个选项。如果没有提供该选项,我的代码就会失败。因此,我想检查是否提供了该选项。在其他编程环境中,我会使用 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 的大问题还没有得到解答,但我将把这个问题关闭为“已解决”——我的代码现在可以工作了