如何检测 \PassOptionsToPackage 是否已被调用?

如何检测 \PassOptionsToPackage 是否已被调用?

如果我打电话:

\PassOptionsToPackage{backend=biber,style=numeric,backref=false}{biblatex}

% And later someone else call again
\PassOptionsToPackage{style=abnt,backend=biber}{biblatex}

会发生什么?

我能否检测其他人是否已经调用过\PassOptionsToPackage并且不覆盖他们的定义?

答案1

的定义\PassOptionsToPackage

% latex.ltx, line 7784:
\def\PassOptionsToPackage{\@pass@ptions\@pkgextension}

我们可以看看\@pass@ptions

% latex.ltx, line 7778:
\def\@pass@ptions#1#2#3{%
  \expandafter\xdef\csname opt@#3.#1\endcsname{%
    \@ifundefined{opt@#3.#1}\@empty
      {\csname opt@#3.#1\endcsname,}%
    \zap@space#2 \@empty}}

假设我们调用\PassOptionsToPackage{baz}{foo}。如果(只能由 组成)未定义,则将其定义为扩展为。如果它已经定义,比如说,那么它将被重新定义为扩展为\[email protected]\csnamebazgnu,gnatgnu,gnat,baz

后一种情况可能发生在\PassOptionsToPackage{...}{foo}已经调用或包已经加载的情况下。第二种情况\PassOptionsToPackage{baz}{foo}不执行任何操作。

如您所见,新选项集与现有选项集相链接。然后,程序包在加载时便会负责在它们之间穿梭。

这也应该回答你关于检测的问题:你可以使用

\ifcsname [email protected]\endcsname
  <options have already been passed or the package has already been loaded>
\else
  <no options have been passed yet>
\fi

相关内容