LaTeX:如何查找命令所属的包?

时间:2010-03-13 23:55:52

标签: search latex command

这是一个我无法找到答案的简单问题:

鉴于LaTeX 命令,如何找出它所属或来自的

例如,给定\qquad水平间距命令,它来自哪个包?特别麻烦,因为它不包括任何包装!

4 个答案:

答案 0 :(得分:14)

  

鉴于LaTeX命令,我如何找出它所属或来自哪个包?

咨询您的参考资料:

  1. 如果它位于TeXbook的索引中,它继承自驱动LaTeX的引擎TeX。
  2. 否则,如果它在LaTeX手册的索引中,则可能在latex.ltx或其中一个标准类文件中定义,而不是在包中。
  3. 否则,如果它位于 LaTeX Companion 的索引中,页码可能会告诉您它来自哪个包。
  4. 否则,你可以对find /usr/share/texmf -name '*.sty'的结果进行一些花哨的讨论,但要为痛苦的运动做好准备。
  5. 或者,你可以问http://stackoverflow.com。但是,一些白痴会回答问你为什么要知道......

答案 1 :(得分:10)

您可以在http://www.ctan.org/tex-archive/info/symbols/comprehensive/中搜索该信息以及更多信息。

请记住,LaTeX是TeX之上的宏语言,所有宏都由TeX组成,不需要导入。 \qquad属于该类别。

答案 2 :(得分:5)

据我所知,对此没有真正好的一般答案。但是,对于任何给定的命令,您可以尝试许多技术。在\qquad的情况下,它是基本TeX的一部分。请记住,您始终可以在交互模式下使用TeX:

$ tex '\show\qquad'
This is TeX, Version 3.141592 (Web2C 7.5.6)
> \qquad=macro:
->\hskip 2em\relax .
 \show\qquad

? x
No pages of output.

LaTeX在TeX上添加了一些宏,例如\begin

 $ tex '\show\begin'
This is TeX, Version 3.141592 (Web2C 7.5.6)
> \begin=undefined.
 \show\begin

? x
No pages of output.

,而

$ latex '\show\begin'
This is pdfTeXk, Version 3.141592-1.40.3 (Web2C 7.5.6)
 %&-line parsing enabled.
entering extended mode
LaTeX2e 
Babel  and hyphenation patterns for english, usenglishmax, dumylang, noh
yphenation, greek, monogreek, ancientgreek, ibycus, pinyin, loaded.
> \begin=macro:
#1->\@ifundefined {#1}{\def \reserved@a {\@latex@error {Environment #1 undefine
d}\@eha }}{\def \reserved@a {\def \@currenvir {#1}\edef \@currenvline {\on@line
 }\csname #1\endcsname }}\@ignorefalse \begingroup \@endpefalse \reserved@a .
 \show\begin

? x
No pages of output.

其他一切都来自包裹。如果你真的想知道一个宏来自哪个包(除了google或grepping你的texmf树),你可以检查你加载的每个包后是否定义。尝试在任何\usepackage命令之前定义它:

\let\oldusepackage\usepackage
\renewcommand\usepackage[1]{
  \oldusepackage{#1}
  \ifcsname includegraphics\endcsname
    \message{^^Jincludegraphics is defined in #1^^J}
    \let\usepackage\oldusepackage
  \fi}

然后,当您在latex文件上运行.tex时,请在输出中查找显示includegraphics is defined in graphicx的行。这不太可能,但有些狡猾的软件包可能会对\usepackage做坏事,所以这可能无法正常工作。另一种方法是在加载任何包之前简单地定义您感兴趣的命令:

\newcommand\includegraphics{}

然后,当加载定义命令的包时,您可能会收到错误消息。这实际上不如前一种方法可靠,因为许多软件包使用\def\let来定义它们的宏而不是\newcommand,绕过“已定义”检查。您也可以在每次加载之间手动插入支票:

\ifcsname includegraphics\endcsname\message{^^Jdefined after graphicx^^J}\fi

答案 3 :(得分:3)

由于缺乏声誉,我无法评论史蒂夫的答案,这对我很有帮助,但我想稍微延伸一下。

首先,在他的第二种方法(摆弄usepackage)中,没有处理usepackage具有可选参数的情况。其次,包经常通过RequirePackage由其他包加载,这使得很难找到命令定义的实际位置。所以我对史蒂夫答案的改进是:

\usepackage{xargs}
\let\oldusepackage\usepackage
\let\oldRequirePackage\RequirePackage
\renewcommandx{\usepackage}[3][1,3]{
  \oldusepackage[#1]{#2}[#3]
  \ifcsname includegraphics\endcsname
    \message{^^Jincludegraphics is defined in #2^^J}
    \let\usepackage\oldusepackage
    \let\RequirePackage\oldRequirePackage
  \fi}
\renewcommandx{\RequirePackage}[3][1,3]{
  \oldRequirePackage[#1]{#2}[#3]
  \ifcsname includegraphics\endcsname
    \message{^^Jincludegraphics is defined in #2^^J}
    \let\usepackage\oldusepackage
    \let\RequirePackage\oldRequirePackage
  \fi}

此处使用xargs包来获取usepackage右侧的异常选项(第一个和第三个参数是可选的)。

documentclass之后直接放置此内容应该告诉includegraphics在哪里定义。