我们在排错的时候,经常希望知道出错的宏是在哪里定义的,然后通过比对定义和现有情况判断错误原因。

LeoLiu 在 TeX.SX 给出了一个利用 filehook 宏包实现的方法,效果拔群!当然,方法有些讨巧。

代码:

 1 \documentclass{article}
 2 \usepackage{filehook,currfile}
 3 \newwrite\finder
 4 \immediate\openout\finder=\jobname.fnd
 5 
 6 \def\searchmacro#1{
 7   \AtBeginOfFiles{\ifdefined#1
 8       \expandafter\def\csname \currfilename:found\endcsname{}%
 9     \fi}
10   \AtEndOfFiles{\ifdefined#1
11       \unless\ifcsname \currfilename:found\endcsname
12         \immediate\write\finder{found in '\currfilename'}%
13     \fi\fi}}
14 
15 \searchmacro\url
16 
17 \usepackage{hyperref}
18 \begin{document}
19 dummy
20 \end{document}

 

编译后,在 \jobname.fnd 里我们能找到

found in 'url.sty'
found in 'hyperref.sty'

也就是说,\url 是在 url.sty 里定义的,而 url.sty 被 hyperref.sty 调用。


We would be glad to know where a certain macro is defined, when we are debugging. LeoLiu provided a method by using the package filehook, on the website TeX.SX. It’s really great!

The code is somewhat tricky:

 1 \documentclass{article}
 2 \usepackage{filehook,currfile}
 3 \newwrite\finder
 4 \immediate\openout\finder=\jobname.fnd
 5 
 6 \def\searchmacro#1{
 7   \AtBeginOfFiles{\ifdefined#1
 8       \expandafter\def\csname \currfilename:found\endcsname{}%
 9     \fi}
10   \AtEndOfFiles{\ifdefined#1
11       \unless\ifcsname \currfilename:found\endcsname
12         \immediate\write\finder{found in '\currfilename'}%
13     \fi\fi}}
14 
15 \searchmacro\url
16 
17 \usepackage{hyperref}
18 \begin{document}
19 dummy
20 \end{document}

 

After compiling, we will get

found in 'url.sty'
found in 'hyperref.sty'

in \jobname.fnd. That is to say, \url is defined in url.sty, which is inputed byhyperref.sty.

选自:http://liam0205.me/LaTeX-How-to-find-out-where-a-macro-is-defined/