我正在编写一个包,用户在发出命令时可以通过声明的选项在三种类型的文档之间进行选择\usepackage
:undergraduatethesis
、technicalreport
和academicpaper
。为此,我使用xkeyval
,以便人们使用类似 的命令\usepackage[documenttype=academicpaper]{mypackage}
。
我将包组织成不同的部分,每个部分都有一种配置类型(间距、图形配置、标题等),我想将特定于文档类型的命令放在这些单独的部分中,例如:
\if{documenttype}{undergraduatethesis}
% do something
\fi
\if{documenttype}{academicpaper \OR technicalreport}
% do some other thing
\fi
我尝试过几种方法,但都失败了。不过我尝试的方法并不完全适合我的情况。
这可能吗?
谢谢!
答案1
在意识到我犯了每个人都警告过我的错误后,我自己找到了答案:放置\ProcessOptions
,或者,在我的情况下\ProcessOptionsX
,因为我正在使用该xkeyval
包。
我使用以下位 if 代码为一些变量分配值,以区分三种文档类型(为简单起见,我将它们称为A
、B
和C
):
\def\A{A} % creates macro named A (not sure if this value matters)
\def\B{B} % creates macro named B
\def\C{C} % creates macro named C
我这样做是为了稍后使用该\ifx
命令并比较两个宏。现在,使用xkeyval
包的语法来创建包选项:
\makeatletter
\define@key{fam}{documenttype}{%
\ifthenelse{\equal{#1}{A}}{% if user types: documenttype=A
\def\documenttype{A}}{% assigns value "A" to \documenttype macro
\relax % not sure if needed
}
\ifthenelse{\equal{#1}{B}}{% if user types: documenttype=B
\def\documenttype{B}}{% assigns value "B" to \documenttype macro
\relax % not sure if needed
}
\ifthenelse{\equal{#1}{C}}{% if user types: documenttype=C
\def\documenttype{C}}{% assigns value "C" to \documenttype macro
\relax % not sure if needed
}
}
\makeatother
\ProcessOptionsX<fam>\relax
太好了,现在宏有一个由用户定义的值。现在,我们可以使用\documenttype
编写仅在用户为 指定某个值时才会编译的代码。documenttype
\ifx
\ifx \documenttype \A % check if \documenttype is equal to \A
% insert commands for when user chooses A
\else % not sure if needed
\relax % not sure if needed
\fi
\ifx \documenttype \B % check if \documenttype is equal to \B
% insert commands for when user chooses B
\else % not sure if needed
\relax % not sure if needed
\fi
\ifx \documenttype \C % check if \documenttype is equal to \C
% insert commands for when user chooses C
\else % not sure if needed
\relax % not sure if needed
\fi
% exactly HERE is where I was placing \ProcessOptionsX, shame on me!!
就这样!现在我可以使用任何布尔值了!