请看以下示例:
\documentclass{scrartcl}
\usepackage{filecontents}
\begin{filecontents}{my1.sty}
\RequirePackage{xcolor}
\RequirePackage{catoptions}
\end{filecontents}
\begin{filecontents}{my2.sty}
\RequirePackage{xcolor}
\end{filecontents}
\usepackage[cmyk]{xcolor}
\usepackage{my1}
\usepackage{my2}
\begin{document}
\rule{2cm}{2cm}
\end{document}
catoptions
如果在它后面有一个某处,似乎会导致选项冲突。如果我在它之前\RequirePackage{xcolor}
加载,一切都会正常,但我不能确保这种情况不会发生。my2
my1
my1
是我的包的占位符menukeys
,my2
是任何其他需要的包的占位符xcolor
。
答案1
确实存在选择冲突彩色代码中的包。很容易看出,在两轮(实际上是三轮)加载中彩色。错误帮助如下:
? h
The package 'xcolor' has already been loaded with options:
[cmyk].
There has now been an attempt to load it with no options.
Adding the global options:
'cmyk'
to your \documentclass declaration may fix this.
这期权重新定义 LaTeX 命令\@onefilewithoptions
来捕获这种情况。如果你不想要它,那么我必须给你发一个补丁。然后我将在期权使严格选项检查成为可选项。但是,我不太愿意这么做。这是因为 LaTeX 的以下定义不够稳健:当#2
为空时,什么也不会发生(LaTeX\@for
无法处理空列表)。
\def\@if@pti@ns#1#2{%
\let\reserved@a\@firstoftwo
\@for\reserved@b:=#2\do{%
\expandafter\in@\expandafter{\expandafter,\reserved@b,}{,#1,}%
\ifin@\else\let\reserved@a\@secondoftwo\fi}%
\reserved@a
}
答案2
可以使用catoptions
'etoolbox
来延迟加载\AtEndPreamble
,但这在现实世界中不起作用,因为我需要catoptions
中的某些功能my1
(即menukeys
)
\documentclass{scrartcl}
\usepackage{filecontents}
\begin{filecontents}{my1.sty}
\RequirePackage{etoolbox}
\RequirePackage{xcolor}
\AtEndPreamble{\RequirePackage{catoptions}}
\end{filecontents}
\begin{filecontents}{my2.sty}
\RequirePackage{xcolor}
\end{filecontents}
\usepackage[cmyk]{xcolor}
%\usepackage{my2}
\usepackage{my1}
\usepackage{my2}
\begin{document}
\rule{2cm}{2cm}
\end{document}