我在创建名称中包含数字的程序时遇到了一些问题\newcommand
;我找不到有关该程序以及有关 LaTeX 命令所接受的字符集的文档。
答案1
您应该在用户命令中仅使用字母 A-Za-z。.sty 文件中(或\makeatletter
/\makeatother
对内)定义的命令可能包含 @。
如果需要用数字来表示一组相关命令,通常的做法是使用罗马数字,如,,,,\fooi
等。\fooii
\fooiii
\fooiv
答案2
命令名称可以由以下任一内容组成一非字母字符或字母()字符序列A-Za-z
。
其实这个规则要复杂一些,但对于最终用户来说,这可以算是事实。
因此您不能说,\newcommand{\a1}{...}
因为该名称a1
不是合法的命令名称。Macho TeX 程序员知道如何克服这一限制,但这对最终用户来说会很不利,因为他们无论如何都无法说\a1
,与 不同\a232
。
如果您考虑使用带有数字的命令名称,请修改您的问题,以便有人可以向您推荐更好的替代方案。
答案3
用 Knuth 自己的术语来说,有两种基本的“风格”控制序列在 TeX/LaTeX 中:
- A控制符号,由一个反斜杠组成
\
,后面跟着一个非字母字符。例如:(\\
换行符)、\'
(文本模式下的尖音符)。[对于 TeX 纯粹主义者:我知道,严格来说,启动控制序列的是“转义字符”,不一定是反斜杠。但是,几乎普遍的做法是使用反斜杠字符,并且只使用反斜杠字符作为转义字符。] - A控制字,由反斜杠和一个或多个字母的字符(即,没有数字,没有其他非字母字符)。示例:
\textbackslash
,\def
。请注意,TeX 和 LaTeX 区分大小写,因此\hello
和\Hello
不是相同的命令。
控制字可以进一步区分为包含一个或多个“at”、@
、 字符的控制字和不包含一个或多个“at”、 、 字符的控制字。前者控制字主要由 TeX 和 LaTeX 程序员用于宏和变量,用户应该不是直接访问或操作;这是通过使@
字符“特殊”来实现的,在明确的意义上。然而,当一个必须更改一些包含一个或多个@
字符的现有宏,可以通过首先键入\makeatletter
暂停@
字符的“特殊性”,执行所需的任何进一步的指令,然后\makeatother
执行恢复符号“正常”行为的指令来实现@
。
根据前面的解释,很明显您遇到的事实是,您不应该在控制字中使用数字(或任何其他非字母字符)。(如果您认为必须在宏中使用一些数字,则可以将它们写成,例如,,\choosefirstoftwo
等\numberten
。)
答案4
您只能在宏名称中使用正式标记为字母。默认情况下,只有真实字母 az 和 AZ 以这种方式标记。
不过,你可以通过改变类别代码(catcode)将字符设置为 11(信@
)。对所有包和类文件的角色都执行此操作。在用户文档中,您可以使用手动执行此操作\makeatletter
,并在定义所有必需的宏后切换回正常使用\makeatother
。这样做是为了让内部宏在普通用户文档中保持不可触碰,以避免意外的名称冲突。
您可以将几乎任何字符的 catcode 更改为 11,然后在宏名称中使用它,但这可能会导致问题。(例如,LaTeX3 项目使用:
和_
。)最好的办法是坚持使用普通字母,并使用“a”、“b”等或罗马数字代替数字。