有没有一种简单的方法可以确定类和其他包加载了哪些包?

有没有一种简单的方法可以确定类和其他包加载了哪些包?

我的问题(或者说,严格地说,我有两个问题)是由本周新闻通讯中列出的一个问题的答案引发的,该答案表明加载该{hyperref}包是没有意义的,因为它已经被文档类或另一个包(我忘了是哪个)加载了。所以:

问题 1:有没有一种简单的方法可以确定哪些包被类和其他包加载了?我知道“阅读文档!”是显而易见的答案,但让我们面对现实吧,一些包文档长达 100 页以上。

问题2:如果我无意中加载了一个已经加载的包,这有关系吗?

答案1

您可以检查日志文件以查看包是否已加载,或者\listfiles在序言中使用它来获取已加载的所有包的格式化列表。grep packagename `kpsewich classname.cls`如果您足够熟练,您还可以检查类的源代码(例如在 Linux 和朋友下)。您可以使用以下方法检查序言中已加载的包\@ifpackageloaded{<name>}{<yes>}{<no>。请参阅测试包是否已加载了解更多信息。

一般来说,LaTeX 不会介意你请求加载已经加载的包。第二个请求会被跳过。否则,很难使用两个都需要特定第三个包的包。但是,如果同一个包被请求两次或更多次,不同的选择您将收到一个错误,因为该包无法再次加载。

我认为明确请求所有使用的包是一种非常好的做法。当然,如果您现在确定某个包是由另一个包加载的,那么您可以避免手动加载,从而节省时间和源代码空间。

答案2

A\listfiles将插入编译中使用的所有文件,日志文件通常与 TeX.tex 同名;即 TeX.log。此命令将仅列出通过documentclass和等命令添加的包usepackage,而不是\input{}

据我所知,许多包会忽略任何先前加载的文件或包,例如hyperref,如果您pdftex在中使用选项,documentclass它将忽略放置在中的该选项hypersetup

答案3

如果包由\usepackage或加载\RequirePackage,则不会再次加载。如果在第二次调用时使用第一次调用时未使用的选项加载,则会出现错误:

        Options clash for ...
        The package ... has already been loaded
         with options: ....

如果选项兼容,则第二个选项\RequirePackage 将被忽略。

答案4

如果要获取已加载软件包的列表(而不是所有已加载的文件),可以使用\ltsgetpackagenames我在 的开发版本中找到的以下命令ltxtools.sty。将其结果与 的结果进行比较\listfiles

\makeatletter
\documentclass{article}
\usepackage{catoptions}
% hyperref loads many packages; so let us use it as an example:
\usepackage{hyperref}

\robust@def*\ltsgetpackagenames{%
  \let\ltsgetpackagenames\relax
  \AtBeginDocument{%
    \begingroup
    \def\LTS@tempb{%
      \def\\{ }\@tempcnta\z@pt
      \def\LTS@tempa{}%
      \def\siso@do####1{%
        \advance\@tempcnta\@ne
        \ifnum\@tempcnta>20\relax
          \typeout{\LTS@tempa\ifcsnullTF\reserved@f{}{[\reserved@f]}}%
          \loopbreak
        \else
          \edef\LTS@tempa{\LTS@tempa####1}%
        \fi
      }%
      \expandafter\siso@@loop\expandafter{\filename@base
        \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\}%
    }%
    \typeout{^^J *** Package List ***}%
    \def\csv@do##1{%
      \filename@parse{##1}%
      \ifxFT\filename@ext\@pkgextension{}{%
        \ifcsndefTF{\filename@base}{%
          \edef\reserved@e{\expandafter\meaning
            \csname\filename@base\endcsname}%
          \xifinsetTF{\detokenize{macro:}}\reserved@e{%
            \edef\reserved@f{\expandafter\strip@prefix\reserved@e}%
          }{%
            \let\reserved@f\reserved@e
          }%
        }{%
          \def\reserved@f{}%
        }%
        \LTS@tempb
      }%
    }%
    \csv@@loop*[,]\@filelist
    \typeout{ **************^^J}%
    \endgroup
  }%
}
\@onlypreamble{\ltsgetpackagenames}

% Example:
\ltsgetpackagenames
\listfiles
\makeatother
\begin{document}
xx
\end{document} 

相关内容