catoptions 导致选项与 xcolor 发生冲突

catoptions 导致选项与 xcolor 发生冲突

请看以下示例:

\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}加载,一切都会正常,但我不能确保这种情况不会发生。my2my1

my1是我的包的占位符menukeysmy2是任何其他需要的包的占位符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}

相关内容