如何查看哪个包定义了特定的命令/宏?

如何查看哪个包定义了特定的命令/宏?

我们经常会遇到某些命令/宏的多重定义。然后,我们经常会得到错误,例如: ! LaTeX Error: Command \P already defined. Or name \end... illegal,请参阅手册第 192 页。

请参阅 LaTeX 手册或 LaTeX Companion 了解解释。输入 H 可立即获得帮助。...

l.225 \newcommand{\P}{{\mathcal P}}

当我们遇到这样的错误时,有没有办法知道哪个包或文件预定义了该特定命令/宏?我说的是一般情况,而不是上面列出的“\P”的特殊情况。如果我们必须通过“grep”手动浏览所有可能的文件,那就相当麻烦了。我希望有一种方法可以查看哪个文件已经定义了产生冲突/错误的命令。

多谢!

宾夕法尼亚大学

答案1

你可以加

\show\P

到您的文档中

 \show\P
\documentclass{article}
 \show\P
\usepackage{graphics}
 \show\P
\usepackage{foo}
 \show\P
\usepackage{bar}
 \show\P
\begin{document}
 \show\P

这将使 TeX\P在每个步骤中停止并显示其定义,如果格式中已经定义,则第一个步骤将显示其定义,否则将显示未定义,直到加载定义它的包为止。(定义可能会延迟,\AtBeginDocument这就是我将最终定义放在\show该点的原因。

答案2

命令行实用程序latexdef不仅显示定义,还显示定义的位置。

例如,我想查看文档中的定义\url。可以肯定的是,默认情况下未定义以下内容:

$latexdef --find \url

\url:
undefined

$

但它的定义是hyperref

$latexdef --package hyperref --find \url
\url first defined in "/usr/local/texlive/2020/texmf-dist/tex/latex/url/url.sty".

\url:
macro:->\protect \url

\url  first defined in "/usr/local/texlive/2020/texmf-dist/tex/latex/hyperref/hyperref.sty".

\url :
macro:->\hyper@normalise \url@

$

该包由一些文档类加载:

$latexdef --class tufte-book --find \url
\url first defined in "/usr/local/texlive/2020/texmf-dist/tex/latex/url/url.sty".

\url:
macro:->\protect \url

\url  first defined in "/usr/local/texlive/2020/texmf-dist/tex/latex/hyperref/hyperref.sty".

\url :
macro:->\hyper@normalise \url@

$

也可以看看https://tex.stackexchange.com/a/17840/1362

相关内容