背景
想要定义一个可以被其他宏重复使用的基本 URL。
问题
使用\goto
宏需要完全扩展的 URL。
最小工作示例
以下代码说明了该问题:
\setupinteraction[state=start]
\def\WPhomepagebase{http://tex.stackexchange.com/questions/}
\def\WPpagequestion{\WPhomepagebase{}201545}
%\def\WPpagequestion{http://tex.stackexchange.com/questions/201545}
\def\href#1#2{%
\goto{#1}[url(#2)]%
}
\starttext
\href{TeX StackExchange}{\WPpagequestion}
\stoptext
如果代码改成如下形式:
%\def\WPhomepagebase{http://tex.stackexchange.com/questions/}
%\def\WPpagequestion{\WPhomepagebase{}201545}
\def\WPpagequestion{http://tex.stackexchange.com/questions/201545}
然后文档就会产生正确的超链接。
问题
如何在自定义宏中使用\goto
,如示例代码所示,使得 URL 可以包含其他宏?
答案1
对于以下每种情况,删除多余的括号:
\def\WPpagequestion{\WPhomepagebase 201545}
以防止这些括号包含在 URL 中。
纯 TeX
解决这个问题的 Plain TeX 方法是:
\def\href#1#2{%
\begingroup\def\x{\endgroup\goto{#1}[url(}%
\expandafter\x#2)]%
}
或者更激烈的做法:
\def\href#1#2{%
\begingroup\edef\x{\endgroup\noexpand\goto{#1}[url(#2)]}\x
}
其中\noexpand
,可能是多余的,因为 if\goto
是受保护的宏。
ConTeXt 扩展宏
根据评论,在 ConTeXt 中,\expanded
可以使用宏:
\define[2]\href{%
\expanded{%
\goto{#1}[url(#2)]%
}%
}
ConTeXt edef 宏
这可以进一步简化\edef
:
\def\WPhomepagebase{https://tex.stackexchange.com/questions/}
\edef\WPpagequestion{\WPhomepagebase 201545}
\define[2]\href{%
\goto{#1}[url(#2)]%
}