为什么 hyperref 的 \url 可以在宏内的序言中使用,但不能在框内使用?

为什么 hyperref 的 \url 可以在宏内的序言中使用,但不能在框内使用?

以下 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 }

由于无法将材料排版到框中,因此此时将会产生未定义的命令错误。

相关内容