我试图根据 TeXbook (Addison-Wesley 1996) 第 275-278 页了解 TeX 分配到底是什么。
第 275 页指出,赋值有两种类型:宏定义或简单赋值。宏类型在第 275 页定义,而简单类型在第 276-278 页定义。
在定义宏品种之后和定义简单品种之前,做出以下注释(第 276 页):
下面我们将要研究的几个命令的语法有些类似于定义,但是被任意的空格和“ ”命令
<parameter text>
序列替换,并且标记可以是隐式的:\relax
<left brace>
<filler> -> <optional spaces> | <filler>\relax<optional spaces> <general text> -> <filler>{<balanced text><right brace>
a 的主要目的
<general text>
是指定<balanced text>
内部。
从表面上看,在我看来,非正式描述与正式定义不一致,因为非正式描述说标记<left brace>
可以是隐式的,但 * 的正式定义<general text>
表明显式左括号是强制性的。
请帮助消除我的困惑:
{
定义中出现的‘ ’是不是<general text>
拼写错误?- 如果不是,那么
<left brace>
token 在什么意义上是隐含的? {
关于的 catcode还出现了另一个问题。与同一章(第 24 章)中出现的语法图不同,此处的 ' ' 文字没有下标来表示其类别代码。将其与上一页中出现的
{
文字 ' ' 进行比较:=
{
这是否意味着 的正式定义中的 ' ' 的类别代码<general text>
无关紧要,即 TeX 引擎在此上下文中忽略此标记的类别代码?或者,即使 '{
' 本身不是拼写错误,此处省略类别代码是否可能是拼写错误?有些关键词的类别代码无关紧要,例如
at
,bp
和by
。完整列表在第 61 页给出。但是,{
没有出现在此列表中。
*<general text>
在第 276 页的定义中使用<variable assignment>
:
<variable assignment> -> ... <token variable><equals><filler><token variable>
...
<token variable> -> <token parameter> | <toksdef token> | \toks<8-bit number>
以及第 279 页中以下原语的描述:\uppercase<general text>
、\lowercase<general text>
、\message<general text>
和\errmessage<general text>
。
答案1
表示{
可能隐含的 catcode 1 字符标记。在此上下文中隐含表示它可能是\let
此类字符的控制序列。
具体来说你可以去
\toks0\bgroup abc}
但你不能去
\def\foo\bgroup abc}
TeXBook 说
如果控制序列的含义已由
\let
或指定,则它们有时会伪装成字符\futurelet
。例如,附录 B 说\let\bgroup={ \let\egroup=}
和 这些命令使\bgroup
和 的\egroup
作用有点像左花括号和右花括号。 这样的控制序列被称为“隐式的 人物'';当 TeX 将它们作为命令执行时,它们的解释方式与字符相同,但当它们出现在命令的参数中时并非总是如此。例如,命令\let\plus=+
不会对上面给出的语法规则中的\plus
字符标记进行可接受的替换|+|_{12}
,命令也不会将其\let\p=p
作为\p
关键字的一部分进行可接受的替换[pt]
。当 TeX 的语法允许显式和隐式字符时,下面的规则将小心地明确说明。
答案2
在第 275 页的底部,你会发现
这里 ⟨控制序列⟩ 表示一个标记,它要么是一个控制序列,要么是一个活动字符;⟨左括号⟩ 和 ⟨右括号⟩ 是显式字符标记,其类别代码分别为类型 1 和 2。⟨参数文本⟩ 不包含 ⟨左括号⟩ 或 ⟨右括号⟩ 标记,它遵守第 20 章的规则。
在第 269 页你读到
使用符号“
{
”、“}
”和“$
”来表示类别 1、2 和 3 中的任何显式或隐式字符标记会很方便,无论实际字符代码是括号还是美元符号。因此,例如,纯 TeX\bgroup
是“ ”的示例{
,标记“{
1 ”和“(
1 ”也是;但“{
12 ”不是。
当你{
在语法描述中找到时,这意味着你能使用{
1或\bgroup
(或任何标记\let
到{
1),但当你找到 ⟨left brace⟩ 时,它意味着一个明确的将使用第 1 类字符标记。
例如,\bgroup
在宏的 ⟨参数文本⟩ 中允许使用,但 ⟨左括号⟩ 不允许(因为它会立即启动 ⟨替换文本⟩)。
另一方面,每个接受⟨填充符⟩的原语(例如\uppercase
)都可以在左侧用 分隔⟨平衡文本⟩ {
(因此\bgroup
可以接受)。⟨平衡文本⟩的最后一个分隔符必须是⟨右括号⟩(即明确的 }
2 个字符)。
注意:在上面的描述中,当出现{
1或}
2时,只有类别代码而不是字符代码是相关的。这就是 Knuth 为它们使用 ⟨左括号⟩ 和 ⟨右括号⟩ 的原因。