这是一个我无法找到答案的简单问题:
鉴于LaTeX 命令,如何找出它所属或来自的包?
例如,给定\qquad
水平间距命令,它来自哪个包?特别麻烦,因为它不包括任何包装!
答案 0 :(得分:14)
鉴于LaTeX命令,我如何找出它所属或来自哪个包?
咨询您的参考资料:
latex.ltx
或其中一个标准类文件中定义,而不是在包中。find /usr/share/texmf -name '*.sty'
的结果进行一些花哨的讨论,但要为痛苦的运动做好准备。答案 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
在哪里定义。