答案1
摘自 TeX 书第 202 页:
TEX 还允许定义参数以相当通用的方式分隔的宏;你不必总是将参数括在括号中。例如,
\def\cs #1. #2\par{...}
定义一个具有两个参数的控制序列\cs
,其两个参数将按以下方式确定:#1
将由 和\cs
' ' 的下一个后续出现.
(句点和空格)之间的所有标记组成;#2
将由该 '.
' 和下一个\par
标记之间的所有标记组成。
当你写作时
\def\i2{\frac{i}{2}}
你是不是定义一个宏i2(我使用键盘符号来表示控制序列标记),而是一个分隔宏i必须后面总是跟着数字 2(后面的空格\i
按通常方式被吞掉)。因此从
\def\i2{i/2}
\i2\par
\i 2\par
\i3
\bye
你会得到我/2两次,并出现错误
! Use of \i doesn't match its definition.
l.4 \i3
如果你按下h
帮助信息,字面上的意思
If you say, e.g., `\def\a1{...}', then you must always
put `1' after `\a', since control sequence names are
made up of letters only. The macro here has not been
followed by the required stuff, so I'm ignoring it.
正如 egreg 所建议的,我补充说,使用\def
是总是很危险,因为它不检查宏是否已经定义。简单的例子:
\documentclass{article}
\def\i2{\frac{i}{2}}
\begin{document}
Using \verb+\def+ is quite naïve\ldots
\end{document}
运行此代码也会导致错误Use of \i doesn't match its definition
。为什么?该文件ot1enc.dfu
包含
\DeclareUnicodeCharacter{00EF}{\"\i}
(使用不同的字体编码类似),这意味着 Unicode 字符 U+00EF (ï) 被转换为\"\i
,其目的是将分音符放到\"
无点的 i 上\i
。但您已重新定义\i
为期望 2 并打印分数!随之而来的是混乱。
长话短说:\def
使用分隔参数来定义宏可以非常很有用(我在我的包中经常使用它们)但是你真的必须知道你在做什么...
上述讨论在正常\catcode
情况下成立。当然,你可以将\catcode
of 2
(或所有数字)从 12(其他)更改为 11(字母),但相信我,你不会想这么做的……
你能 定义宏i2,例如
\expandafter\def\csname i2\endcsname{...}
但当然你应该写信\csname i2\endcsname
来使用它......