宏包重复加载的问题
很多人(多指新手)喜欢复制粘贴别人的代码,也不管代码中的设置是干什么的,也不懂加载的宏包是干什么的,所以经常复制粘贴就出现重复加载宏包的问题。以xcolor
包为例,原则上加载宏包只需要在导言区输入一次\usepackage{xcolor}
即可,如果需要加载xcolor
的可选项就输入\usepackage[option1,option2]{xcolor}
。但是有的人使用过程中就喜欢重复加载,多半是百度到啥就复制了啥。一般而言,重复加载是没有问题的,用\usepackage
的方式加载的宏包有一个好处是重复加载的时候只有第一次加载有效,后面的重复加载会被忽略。但是这么说其实是有前提的,就是第二次加载的可选项不得超出第一加载的可选项。举例来说1
2
3
4
5
6\documentclass{ctexart}
\usepackage{xcolor}
\usepackage{xcolor}
\begin{document}
\color{red!40}这是百分之40的红色。
\end{document}
和1
2
3
4
5
6\documentclass{ctexart}
\usepackage[dvipsnames,usenames]{xcolor}
\usepackage[dvipsnames]{xcolor}
\begin{document}
\color{Maroon}这是褐红色。
\end{document}
都是没问题的,第二次加载的选项不超过第一次加载的选项,因此第二次加载都会被忽略,仅第一次加载有效。但是1
2
3
4
5
6\documentclass{ctexart}
\usepackage[dvipsnames]{xcolor}
\usepackage[dvipsnames,usenames]{xcolor}
\begin{document}
\color{Maroon}这是褐红色。
\end{document}
就会报错option clash for package xcolor
,因为第二次加载比第一次多了选项usenames
,从而报错了xcolor
宏包选项冲突。总之,如果加载宏包最好不要重复加载,一次性把需要的选项都加载进来,避免后续冲突。
利用\documentclass
传递宏包选项
正常情况下,宏包选项支持由\documentclass
的可选项进行传递,比如1
2
3
4
5
6
7
8
9
10
11
12
13\documentclass[dvipsnames,usenames,leqno,listings]{ctexart}
\usepackage[x11names]{xcolor}
\usepackage[sumlimits]{amsmath}
\usepackage{tcolorbox}
\begin{document}
{\color{Maroon}这是褐红色。}
\begin{equation}
\text{公式编号在左}
\end{equation}
\begin{tcblisting}{}
tcolorbox的摘录环境
\end{tcblisting}
\end{document}
就分别将选项dvipsnames,usenames
传递给xcolor
包,将选项leqno
传递给amsmath
包,将选项listings
传递给tcolorbox
包,并且即使我们在后续加载xcolor
包的时候增加了可选项x11names
,也不会产生冲突。但是注意1
2
3
4
5
6\documentclass[dvipsnames,usenames]{ctexart}
\usepackage[x11names]{xcolor}
\usepackage[divpnames,usenames]{xcolor}
\begin{document}
\color{Maroon}这是褐红色。
\end{document}
是会产生冲突的,总之避免重复加载同一个宏包,除非你知道如何解决冲突。