背景

背景

背景

想要定义一个可以被其他宏重复使用的基本 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)]%
}

也可以看看

相关内容