赋值中的左括号是隐式的还是显式的,它的类别代码应该是什么?

赋值中的左括号是隐式的还是显式的,它的类别代码应该是什么?

我试图根据 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>表明显式左括号是强制性的。

请帮助消除我的困惑:

  1. {定义中出现的‘ ’是不是<general text>拼写错误?
  2. 如果不是,那么<left brace>token 在什么意义上是隐含的?
  3. {关于的 catcode还出现了另一个问题。

    与同一章(第 24 章)中出现的语法图不同,此处的 ' ' 文字没有下标来表示其类别代码。将其与上一页中出现的{文字 ' ' 进行比较:=

    等号与类别代码

    {这是否意味着 的正式定义中的 ' ' 的类别代码<general text>无关紧要,即 TeX 引擎在此上下文中忽略此标记的类别代码?或者,即使 ' {' 本身不是拼写错误,此处省略类别代码是否可能是拼写错误?

    有些关键词的类别代码无关紧要,例如atbpby。完整列表在第 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 为它们使用 ⟨左括号⟩ 和 ⟨右括号⟩ 的原因。

相关内容