带有分隔参数的带星号的宏?

带有分隔参数的带星号的宏?

我的目标是定义一个带星号的宏和一个不带星号的宏版本,\foo该宏将被称为\foo arg {actual argument}\foo* arg {actual argument}

因此我尝试了以下方法:

\makeatletter
\def\foo{\@ifstar\withstar\withoutstar}
\makeatother

\def\withstar arg #1{%
  With star: #1
}

\def\withoutstar arg #1{%
  Without star: #1
}

\foo* arg {actual argument}
\foo arg {actual argument}

但我得到了错误

! Use of \withstar doesn't match its definition.
l.67 \foo* 
           arg {actual argument}

但是,如果我将\withstar和的定义改为\withoutstar

\def\withstar #1{%
  With star: #1
}

\def\withoutstar #1{%
  Without star: #1
}

然后通话\foo* {actual argument}\foo {actual argument}工作都按预期进行。为什么会发生这种情况?

答案1

开始*和之间有一个空格arg

\foo* arg {actual argument}

但是的参数文本\withstar直接以 开头arg

\def\withstar arg #1{...}

因为中间的空格结束了命令序列\withstar

使固定:

\makeatletter
\def\foo{\@ifstar\withstar\withoutstar}

\@firstofone{\def\withstar} arg #1{%
  \typeout{With star: #1}%
}
\makeatother

\def\withoutstar arg #1{%
  \typeout{Without star: #1}
}

\foo* arg {actual argument}
\foo arg {actual argument}

% End TeX job
\makeatletter\@@end

花括号后的空格不会被忽略。\@firstofone在 LaTeX 内核中定义如下:

\long\def\@firstofone#1{#1}

它是一种在命令序列后插入空格的技巧\withstar

结果:

With star: actual argument
Without star: actual argument

相关内容