在当前的工作中,我使用了大量 CURIE(缩写 URI),这在我的社区中很常见。因此,我定义了一个名为 的元命令,\defcurie
我可以使用它来定义前缀,例如\defcurie{dbr}{http://dbpedia.org/resource/}
。在这种情况下,它将创建一个命令\dbr
,我稍后可以使用它来\dbr{Dog}
打印(并正确链接)dbr:狗。
目前,仅使用\dbr{}
它打印dbr:,但我想让它打印出来dbr:
(如果参数为空,则不带尾随的)。
梅威瑟:
\documentclass{article}
\usepackage{hyperref}
\newcommand{\curiesize}{\small}
\newcommand{\defcurie}[2]{%
\expandafter\newcommand\csname#1\endcsname[1]{{\curiesize \href{#2##1}{\nolinkurl{#1:##1}}}}%
}
\defcurie{dbr}{http://dbpedia.org/resource/}
\begin{document}
Normal: \dbr{Dog}
Empty: \dbr{}
\end{document}
正如你在第二行看到的,有一个:
我想要删除的结尾。
我显然已经尝试了各种各样的事情,例如(每行一次尝试,我将为您省去我最终出于绝望而尝试的排列)\noexpand
:\expandafter
\expandafter\newcommand\csname#1\endcsname[1]{{\curiesize \href{#2##1}{\nolinkurl{#1\IfStrEq{##1}{}{}{:##1}}}}}%
\expandafter\newcommand\csname#1\endcsname[1]{{\curiesize \href{#2##1}{\nolinkurl{#1\ifthenelse{\isempty{##1}}{}{:##1}}}}}%
\expandafter\newcommand\csname#1\endcsname[1]{{\curiesize \href{#2##1}{\nolinkurl{#1\IfValueT{##1}{:##1}}}}}%
我遗漏了什么明显的东西吗?
答案1
使用\ifblank
frometoolbox
来检查##1
内部定义的宏的参数。
替代方案:使用并切换分支\notblank
的顺序True/False
\documentclass{article}
\usepackage{etoolbox}
\usepackage{hyperref}
\newcommand{\curiesize}{\small}
\newcommand{\defcurie}[2]{%
\expandafter\newcommand\csname#1\endcsname[1]{{\curiesize \href{#2##1}{\nolinkurl{#1\ifblank{##1}{}{:##1}}}}}%
}
\defcurie{dbr}{http://dbpedia.org/resource/}
\begin{document}
Normal: \dbr{Dog}
Empty: \dbr{}
\end{document}
答案2
尝试这个:
\documentclass{article}
\usepackage{hyperref}
\newcommand{\curiesize}{\small}
\makeatletter
\newcommand{\MyIfEmptyF}[1]{%
\if\relax\detokenize{#1}\relax%
\expandafter\@gobble%
\else%
\expandafter\@firstofone%
\fi}
\makeatother
\newcommand{\defcurie}[2]{%
\expandafter\newcommand\csname#1\endcsname[1]{{\curiesize
\href{#2##1}{\nolinkurl{#1\MyIfEmptyF{##1}{:##1}}}}}%
}
\defcurie{dbr}{http://dbpedia.org/resource/}
\begin{document}
Normal: \dbr{Dog}
Empty: \dbr{}
\end{document}