关于强健命令的缺陷

关于强健命令的缺陷

这些天,我越来越明确强壮的命令,例如使用\newrobustcmd(etoolbox套餐)或\NewDocumentCommandxparse包)。在我看来,健壮的命令在许多方面都很有利,事实上,其他人也这么认为。引用xparse包文档中专门介绍支持非健壮(即完全可扩展)命令定义的工具的部分:

很稀少在某些情况下,使用完全可扩展的参数抓取器创建函数可能会很有用。为了支持这一点,xparse可以创建可扩展函数以及通常的健壮函数。[…] 此功能应仅在以下情况下使用绝对有必要;如果你不明白这可能是什么时候,不要使用这些功能

然而,我的经验是,强大的命令也有其缺陷。例如,考虑以下最小示例:

\documentclass{article}

\usepackage{etoolbox}

\newrobustcmd*{\test}[1]{%
  \ifblank{#1}{blank}{not blank}%
}

\begin{document}

\tableofcontents

\section{\test{\empty}}

\end{document}

\test输出相当不能令人满意,因为对其论证性质的决定取决于上下文:

在这种情况下以及类似情况下我该怎么办?求助于\newcommand

答案1

您在示例中遇到的问题是基于这样一个事实:强健命令的参数根本没有被屏蔽以免受扩展。因此,\test检查两个不同的参数:节标题中的标记\empty和目录中的空字符串。尽管如此,您不需要将其定义\test为完全可扩展的命令。\newcommand\protecting(etoolbox包)来获得只会展开一次的命令:

\documentclass{article}

\usepackage{etoolbox}

\newcommand*{\test}[1]{%
  \protecting{\ifblank{#1}{blank}{not blank}}%
}

\begin{document}

\tableofcontents

\section{\test{\empty}}

\end{document}

输出为:

相关内容