![如何将 \newcommand 用于 \href?](https://linux22.com/image/232545/%E5%A6%82%E4%BD%95%E5%B0%86%20%5Cnewcommand%20%E7%94%A8%E4%BA%8E%20%5Chref%EF%BC%9F.png)
我想以标准方式格式化文档中的维基百科条目:
\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*
。更好的方法是逐个字符地读取它并根据需要执行替换。不过这需要更多的工作。