为什么最好将常用包和用户定义的命令放在一个.sty
文件中,而不是放在普通.tex
文件中?
答案1
首先:绝不用于\include
加载包含个人定义和要使用的包的文件。
因此,选择是在\input
和之间\usepackage
;对于第一个,最好使用.tex
文件的扩展名,对于第二个,.sty
这是强制性的。
后一种解决方案的优点是什么?有很多。例如,你可以定义选项这可以改变宏的行为或有选择地加载它的部分内容(见下面的示例)。
在.sty
文件中@
被视为字母,因此不需要\makeatletter
或\makeatother
命令来访问“私有宏”,这对于复杂的宏来说通常是这种情况。
如果您不需要选项也不需要访问私有宏,则使用加载您的定义和包\input{mymacros}
完全等同于\usepackage{mymacros}
(前提是文件mymacros.tex
在第一种情况下和mymacros.sty
第二种情况下)。
正如 Andrew Stacey 所注意到的,使用文件还有一个优点.sty
:它不会被加载两次,即使在文档中调用两次(可能是从其他加载的文件或包中调用)。这很重要,因为\newcommand
第二次加载会引发错误(其他定义可能会导致无限循环)。
例子:
假设您有一个宏,当draft
在行中启用该选项时,它必须改变其行为\documentclass
;例如,它应该有一个在文本中强调的参数,并且也写在草稿的边距中。
\ProvidesPackage{mymacros}
\newif\if@myfiledraft
\DeclareOption{draft}{\@myfiledrafttrue}
\ProcessOptions\relax
\if@myfiledraft
\newcommand{\myterm}[1]{\emph{#1}\marginpar{TERM: #1}}
\else
\newcommand{\myterm}[1]{\emph{#1}}
\fi
\endinput
如果文档确实
\documentclass[draft]{article}
\usepackage{mymacros}
\begin{document}
\myterm{foo}
\end{document}
那么页边空白处会写上“TERM: foo”。如果draft
删除,则同一来源只会在文本中强调“foo”。
答案2
您可以将“库”代码放入.tex
文件中并使用\input
而不是\usepackage
,但为了提供包选项,您必须定义一些变量。这看起来更糟,而且您可能会犯更多错误。
答案3
从非常实际的角度来看,一个小问题:某些工具,如图2pdf允许指定要加载的软件包列表。这是通过 完成的\usepackage
,因此.sty
结尾需要进行个人调整。