我们在排错的时候,经常希望知道出错的宏是在哪里定义的,然后通过比对定义和现有情况判断错误原因。
LeoLiu 在 TeX.SX 给出了一个利用 filehook 宏包实现的方法,效果拔群!当然,方法有些讨巧。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \documentclass {article}\usepackage {filehook,currfile}\newwrite \finder \immediate \openout \finder =\jobname .fnd\def \searchmacro #1 { \AtBeginOfFiles {\ifdefined #1 \expandafter \def \csname \currfilename :found\endcsname {} \fi } \AtEndOfFiles {\ifdefined #1 \unless \ifcsname \currfilename :found\endcsname \immediate \write \finder {found in '\currfilename '} \fi \fi }} \searchmacro \url \usepackage {hyperref}\begin {document}dummy \end {document}
编译后,在 \jobname.fnd 里我们能找到
1 2 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \documentclass {article}\usepackage {filehook,currfile}\newwrite \finder \immediate \openout \finder =\jobname .fnd\def \searchmacro #1 { \AtBeginOfFiles {\ifdefined #1 \expandafter \def \csname \currfilename :found\endcsname {} \fi } \AtEndOfFiles {\ifdefined #1 \unless \ifcsname \currfilename :found\endcsname \immediate \write \finder {found in '\currfilename '} \fi \fi }} \searchmacro \url \usepackage {hyperref}\begin {document}dummy \end {document}
After compiling, we will get
1 2 found in 'url.sty' found in 'hyperref.sty'
in \jobname.fnd. That is to say, \url is defined in url.sty, which is inputed by hyperref.sty.