如果我打电话:
\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]
\csname
baz
gnu,gnat
gnu,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