“#1#” 参数。第二个哈希值的含义是什么?

“#1#” 参数。第二个哈希值的含义是什么?

在回答这个问题时自动用方程+对齐组合替换环境对齐egreg 用途

\def\relaxtag#1#{\relaxrelaxtag}
\def\relaxrelaxtag#1{}

第二个的作用#我不太清楚。它似乎既不是带有结构参数的定义的元素,也不是对齐标记。

答案1

\tag命令允许使用 * 形式,因此可以将其调用为\tag{x}\tag*{x}

由于目的是中和,\tag我们不需要花哨的\@ifstar定义。语法

\def\relaxtag#1#{...}

表示参数\relaxtag被输入流中找到的第一个左括号分隔。因此,如果\relaxtag{...}参数为空,则\relaxtag*{...}第一个参数为*

这当然是通过\let\tag\relaxtag宏来补充的。

概念证明:

\def\relaxtag#1#{\showtokens{Before the brace we have '#1'}\relaxrelaxtag}
\def\relaxrelaxtag#1{\showtokens{Between the braces we have '#1'}}

\relaxtag{x}

\relaxtag*{x}

运行此代码pdftex(或pdflatex同时运行)将在终端上产生以下输出

> Before the brace we have ''.
\relaxtag ...okens {Before the brace we have '#1'}
                                                  \relaxrelaxtag {
l.4 \relaxtag{
              x}
? 
> Between the braces we have 'x'.
\relaxrelaxtag ...Between the braces we have '#1'}

l.4 \relaxtag{x}

? 
> Before the brace we have '*'.
\relaxtag ...okens {Before the brace we have '#1'}
                                                  \relaxrelaxtag {
l.6 \relaxtag*{
               x}
? 
> Between the braces we have 'x'.
\relaxrelaxtag ...Between the braces we have '#1'}

l.6 \relaxtag*{x}

? 

引用 TeXbook 第 204 页,第二个双重危险的段落:

允许对这些规则进行特殊扩展:如果 ⟨参数文本⟩ 的最后一个字符是#,因此#紧接着的是{,则 TeX 将表现得好像{已插入到参数文本和替换文本的右端。例如,如果您说 ' \def\a#1#{\hbox to #1}',则后续文本 ' \a3pt{x}' 将扩展为 ' \hbox to 3pt{x}',因为 的参数\a由左括号分隔。

相关内容