我的目标是定义一个带星号的宏和一个不带星号的宏版本,\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