宏中的 \def 带有数字吗?

宏中的 \def 带有数字吗?

我知道数字不能用于宏中,例如在\def/\newcommand定义中。有人能解释一下为什么

\documentclass{article}

\def\i2{\frac{i}{2}}

\begin{document}
$\i2$
\end{document}

作品?

在此处输入图片描述

答案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情况下成立。当然,你可以将\catcodeof 2(或所有数字)从 12(其他)更改为 11(字母),但相信我,你不会想这么做的……

定义宏i2,例如

\expandafter\def\csname i2\endcsname{...}

但当然你应该写信\csname i2\endcsname来使用它......

相关内容