以下 MWE在序言中定义了一个涉及hyperref
's的宏,效果非常好:\url
\documentclass{article}
\usepackage{hyperref}
%
\newcommand\testmacro{\url{http://macro.org}}
%
\newsavebox{\testbox}
%
\begin{document}
\testmacro
\savebox{\testbox}{\url{http://boxes.org}}
\usebox{\testbox}
\end{document}
但是,一旦框定义\savebox{\testbox}{\url{http://boxes.org}}
在序言中移动,就会出现以下错误消息:
! Undefined control sequence.
\hyper@linkurl ...tionraw >>}\relax \Hy@colorlink
\@urlcolor #1Hy@xspace@en...
因此我的问题是:为什么hyperref
's\url
可以在宏内的序言中使用,但不能在框内使用?
答案1
宏定义不是执行在定义点,你可以去
\newcommand\foo{\any old \rubbish }
只要{}
match up\foo
已定义,并且 就行。如果您稍后尝试使用 ,可能会出现错误\foo
,但此时不会出现错误,并且如果\any
和\rubbish
在您使用时已定义,\foo
则不会出现错误。
相反,框在保存时会进行排版(这可能会扩展宏)
\savebox\mybox{\any old \rubbish }
由于无法将材料排版到框中,因此此时将会产生未定义的命令错误。