![何时花括号在宏定义中消失?(例如 \documentclass 扩展)](https://linux22.com/image/409267/%E4%BD%95%E6%97%B6%E8%8A%B1%E6%8B%AC%E5%8F%B7%E5%9C%A8%E5%AE%8F%E5%AE%9A%E4%B9%89%E4%B8%AD%E6%B6%88%E5%A4%B1%EF%BC%9F%EF%BC%88%E4%BE%8B%E5%A6%82%20%5Cdocumentclass%20%E6%89%A9%E5%B1%95%EF%BC%89.png)
我一直在研究\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 循环和\@in
s,它们以逗号分隔(使用带有逗号分隔符的参数字符串)。所以在我看来,由\@fileswith@ptions
和引入的括号\@fileswith@pti@ns
要么在某处被删除,要么在一些忽略它们的地方……?有人能在这里解释一下 TeXs 的神奇行为吗?
答案1
如果整个参数都在括号组中,则 TeX 会从宏参数中删除括号,因此
\frac{1}{2}
#1
不是1
{1}
但这也适用于
\def\foo[#1]#2{....}
则在\foo[{abc}]{xyz}
#1
isabc
和#2
is中xyz
两个括号组都被删除。
您引用的代码在包含的[{#2}]
情况下确实如此,在这种情况下,分隔参数匹配将失败,但括号括起整个参数,因此永远不会传递给被调用的宏。#2
]