这些天,我越来越明确强壮的命令,例如使用\newrobustcmd
(etoolbox
套餐)或\NewDocumentCommand
(xparse
包)。在我看来,健壮的命令在许多方面都很有利,事实上,其他人也这么认为。引用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}
输出为: