我总是将所有包紧跟在文档类之后,然后设置信息(\hypersetup
例如)和对我的文档的自定义(例如,页眉和页脚自定义)以及在文档中使用的宏。
是否存在您想要在加载包之前加载代码的情况?
这回答了指出,为了清楚起见,您可能希望在包之后立即设置信息,以减少您必须执行的文档量(例如,我应该移动\hypersetup
到紧随其后\usepackage{hyperref}
,但在任何跟在它后面的包之前,achemso
或者cleverref
或其他什么)
我以为所有的包都必须先加载,但在某些情况下,你需要在它们之前加载代码,例如 你需要设置 \author
、、\title
以及\date
在加载titling
包之前。
那么,在加载包之前编写一些代码在哪些情况下从技术上来说更好(或必须)呢?我说的从技术上来说更好,是指对编译器产生影响,而不仅仅是对后来阅读代码的人产生影响。
答案1
在加载包之前需要一些代码的一种情况是防止名称冲突。举个小例子:假设您正在使用 AMS 文档类之一,并且想要使用来自dingbat
包,说\leftpointright
;然后你尝试
\documentclass{amsart}
\usepackage{dingbat}
\begin{document}
\leftpointright
\end{document}
并收到以下错误
! LaTeX Error: Command \checkmark already defined.
Or name \end... illegal, see p.192 of the manual.
问题在于,amsfonts
AMS 类内部加载的包定义了该命令,\checkmark
而dingbat
包也定义了该命令,从而产生了名称冲突。一种可能的解决方案是使用savesym
包,重命名冲突的符号,然后加载 dingbat 包:\savesymbol{XXX}
将符号从 重命名为\XXX
从而\origXXX
防止名称冲突:
\documentclass{amsart}
\usepackage{savesym}
\savesymbol{checkmark}
\usepackage{dingbat}
\begin{document}
\leftpointright
\end{document}
Scott Pakin 广泛使用了这种技术来构建综合 LaTeX 符号列表。
savesym
出于好奇,与该包关联的文件是,savesym.sty
但该包显示
\ProvidesPackage{savesymbol}[2003/06/01v1.1 Saves and restores symbols]
因此您在使用该包时会收到一个(无害的)警告:
LaTeX Warning: You have requested package `savesym',
but the package provides `savesymbol'.
答案2
这biblatex
包使用\parindent
来初始化\bibhang
控制参考书目条目的悬挂缩进的长度。如果您希望\parindent
和\bibhang
匹配,则对 的任何更改\parindent
都应在加载 之前进行biblatex
。
\documentclass{article}
\setlength{\parindent}{2.25em}
\usepackage[style=authoryear]{biblatex}
\newcommand*{\sometext}{Lorem ipsum dolor sit amet, consectetuer
adipiscing elit. Ut purus elit, vestibulum ut, placerat ac,
adipiscing vitae, felis. Curabitur dictum gravida mauris. Nam arcu
libero, nonummy eget, consectetuer id, vulputate a, magna.}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@misc{A01,
author = {Author, A.},
year = {2001},
title = {Alpha},
addendum ={\sometext}
}
\end{filecontents}
\addbibresource{\jobname.bib}
\nocite{*}
\begin{document}
\sometext
\printbibliography
\end{document}