![如何查看哪个包定义了特定的命令/宏?](https://linux22.com/image/292933/%E5%A6%82%E4%BD%95%E6%9F%A5%E7%9C%8B%E5%93%AA%E4%B8%AA%E5%8C%85%E5%AE%9A%E4%B9%89%E4%BA%86%E7%89%B9%E5%AE%9A%E7%9A%84%E5%91%BD%E4%BB%A4%2F%E5%AE%8F%EF%BC%9F.png)
我们经常会遇到某些命令/宏的多重定义。然后,我们经常会得到错误,例如: ! 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@
$