何时花括号在宏定义中消失?(例如 \documentclass 扩展)

何时花括号在宏定义中消失?(例如 \documentclass 扩展)

我一直在研究\documentclass朋友的实际定义,并且注意到了一些奇怪的事情,我想了解一下。

假设我有\documentclass[11pt, titlepage]{article}。据我所知,\documentclass最终扩展为\@fileswith@ptions\@clsextension,其定义如下:

  \@ifnextchar[
  {\@fileswith@pti@ns#1[{#2}]#3}%
  {\@fileswith@pti@ns#1[{#2}]#3[]}}

我从中得知,可选参数11pt, titlepage现在放在括号中。从简单的实验来看\edef\foo{{{\bar}}},这些括号似乎并没有以某种方式神奇地被移除,也就是说,它们似乎在进一步的扩展中被保留了下来,即使在使用时也是如此\edef- 也就是说,据我所知,扩展是:

\@fileswith@pti@ns\@clsextension[{11pt,titlepage}]article[]

  • 第一个困惑:\@fileswith@pti@ns包含行\xdef\@classoptionslist{\zap@space#2 \@empty},在我看来,这是为了删除11pt,和之间的空格titlepage。但由于\@fileswith@ptions将可选参数放在括号中,因此这不应该有任何效果。实际上,尝试\zap@space {a b} c \@empty会产生a bc而不是abc
  • 此外,\@fileswith@pti@ns最终确实如此\@onefilewithoptions#3[{#2}][{#4}]#1——这意味着它额外的一对括号括住可选参数,得到

    \@onefilewithoptions article[{{11pt, titlepage}}][{}]\@clsextension.所以现在我们有包参数周围的括号是错误的。

但所有参数的进一步处理(最终)都是基于 for 循环和\@ins,它们以逗号分隔(使用带有逗号分隔符的参数字符串)。所以在我看来,由\@fileswith@ptions和引入的括号\@fileswith@pti@ns要么在某处被删除,要么在一些忽略它们的地方……?有人能在这里解释一下 TeXs 的神奇行为吗?

答案1

如果整个参数都在括号组中,则 TeX 会从宏参数中删除括号,因此

\frac{1}{2}

#1不是1{1}

但这也适用于

\def\foo[#1]#2{....}

则在\foo[{abc}]{xyz} #1isabc#2is中xyz 两个括号组都被删除。

您引用的代码在包含的[{#2}] 情况下确实如此,在这种情况下,分隔参数匹配将失败,但括号括起整个参数,因此永远不会传递给被调用的宏。#2]

相关内容