为什么使用.sty 文件?

为什么使用.sty 文件?

为什么最好将常用包和用户定义的命令放在一个.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结尾需要进行个人调整。

相关内容