检查元命令中的空参数

检查元命令中的空参数

在当前的工作中,我使用了大量 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

使用\ifblankfrometoolbox来检查##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}

相关内容