如何将 \newcommand 用于 \href?

如何将 \newcommand 用于 \href?

我想以标准方式格式化文档中的维基百科条目:

\href{http://en.wikipedia.org/wiki/Foo}{Foo}

所以我考虑使用\newcommand*

\documentclass{article}
\usepackage{ifthen}
\usepackage{hyperref}
\newcommand*{\WWW}[2]{\href{http://en.wikipedia.org/wiki/#2}%
  \ifthenelse{\equal{#1}{}}{{#2}}{{#1}}%
}
\begin{document}
\WWW{Foo}
\end{document}

此命令应设置链接到 Wikipedia 文章的文本Foo,并且可以输入特殊标题。但是这不起作用。您能看出这里出了什么问题吗?

答案1

您有两个问题。第一个问题是,您忘记指定\WWW接受可选参数,而您需要该参数,[2][]而不仅仅是[2](第二个[]问题指定了空默认值);第二个问题是,您需要对 进行分组\ifthenelse,但不需要对其参数进行分组。(我认为问题在于,当\ifthenelse扩展时,它不会引入组,因此会抓取错误的标记。)此外,就“仅代表我的观点”而言,如果这仅适用于维基百科链接,我可能会改为调用它\wiki。无论如何,将它们放在一起会产生

\documentclass{article}
\usepackage{ifthen}
\usepackage{hyperref}
\newcommand*{\wiki}[2][]{\href{http://en.wikipedia.org/wiki/#2}%
                              {\ifthenelse{\equal{#1}{}}{#2}{#1}}}
\begin{document}
  The Wikipedia article about \wiki[the metasyntactic variable foobar]{Foobar}
is shorter than the one about \wiki{Einstein}.
\end{document}

(另请注意,这不一定符合维基百科的下划线空格约定,尽管这肯定是可以修复的。)


编辑1: 实际上,如果你使用字符串包,自动处理下划线非常容易。此修订后的命令将自动将其参数中的所有空格替换为下划线,因此您不必这样做。如果您仍然想要不同的标题,您可以提供它。所以

\documentclass{article}
\usepackage{ifthen}
\usepackage{hyperref}
\usepackage{xstring}

\makeatletter
\newcommand*{\wiki}[2][]{%
  \StrSubstitute{#2}{ }{_}[\wiki@article]%
  \href{http://en.wikipedia.org/wiki/\wiki@article}%
       {\ifthenelse{\equal{#1}{}}{#2}{#1}}}
\makeatother

\begin{document}
  The Wikipedia article about \wiki[the metasyntactic variable foobar]{Foobar}
is shorter than the one about \wiki{Albert Einstein} or the one about \wiki[the
creator of \TeX]{Donald Knuth}.
\end{document}

呈现为

维基百科文章关于元句法变量 foobar艾尔伯特爱因斯坦或者关于TeX 的创始人

答案2

这有效:

\newcommand{\WWW}[1]{%
    \href{http://en.wikipedia.org/wiki/#1}{#1}%
}

但是当然,如​​果您想指定一个标题,这还不够......当您想要这样做时,如何使用第二个单独的命令?

答案3

这是一个稍微不同的方法。

\usepackage{hyperref}
\makeatletter
\newcommand*\wiki{%
        \@ifstar{\wiki@iii\wiki@ii}%
                {\wiki@iii\wiki@i}%
}
\newcommand*\wiki@iii[1]{%
        \begingroup
        \catcode`\_12
        \catcode`\%12
        #1%
}
\newcommand*\wiki@i[1]{\href{http://en.wikipedia.org/wiki/#1}{#1}\endgroup}
\newcommand*\wiki@ii[2]{\href{http://en.wikipedia.org/wiki/#2}{#1}\endgroup}
\makeatletter
\begin{document}
\wiki*{Foo's Bar}{Foo's_Bar}
\wiki{Foo}
\wiki*{Foo (Bar)}{Foo_%28Bar%29}

在这里,如果你想给它两个参数,你可以使用\wiki*。更好的方法是逐个字符地读取它并根据需要执行替换。不过这需要更多的工作。

相关内容