我想定义*
一个命令的版本,例如
\newcommand{\foo}{blah}
\newcommand{\foo*}{blahblah}
如果我尝试这样做,LaTeX 会抱怨我正在尝试重新定义\foo
,所以我想我需要做一些特殊的事情来处理*
s。但是怎么办呢?
答案1
答案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
}