定义带星号的命令版本(* 宏)

定义带星号的命令版本(* 宏)

我想定义*一个命令的版本,例如

\newcommand{\foo}{blah}
\newcommand{\foo*}{blahblah}

如果我尝试这样做,LaTeX 会抱怨我正在尝试重新定义\foo,所以我想我需要做一些特殊的事情来处理*s。但是怎么办呢?

答案1

此条目在 TeX FAQ 中。

“优雅”的方法是使用suffix包(需要 eTeX):

\documentclass{article}

\usepackage{suffix}
\newcommand\foo{blah}
\WithSuffix\newcommand\foo*{blahblah}

\begin{document}

\foo

\foo*

\end{document}

答案2

如果你看看来源2e你可能会看到很多这样的行

\def\foo{\@ifstar\@foo\@@foo}
\def\@foo#1{...}
\def\@@foo#1{...}

这将生成\foo一个具有常规和带星号版本的单参数命令。带星号的版本是 的扩展,\@foo而无星号的版本是 的扩展\@@foo。在辅助宏中使用 @ 符号是 TeX 惯例,有些作者接受,有些作者避免。

有更高级别的方法可以做到这一点(正如 lockstep 指出的那样),但一旦你学会了这个模式,它就不太难使用了。只要确保它位于文件之间\makeatletter...\makeatother.sty文件中即可。

編輯删除了一些不准确之处和社论。

答案3

LaTeX3 解决方案:

\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand\foo{s}{%
  \IfBooleanTF#1%
    {blahblah}% If a star is seen
    {blah}%     If no star is seen
}

相关内容