定义命令时无需使用括号

定义命令时无需使用括号

不确定标准是否真的允许这样做,但至少在我的 LaTeX 安装 (TeX Live 2019/Debian) 中,我可以写例如$\sqrt\frac12$而不是$\sqrt{\frac{1}{2}}$。但是,这对于手动定义的命令不起作用:

数学家协会

\documentclass{article}
\newcommand{\myfrac}[2]{\frac{#1}{#2}}
\newcommand{\mysqrt}[1]{\sqrt{#1}}

\begin{document}
$\mysqrt\myfrac12$
\end{document}

产生错误

! Argument of \myfrac has an extra }.
<inserted text> 
                \par 
l.6 $\mysqrt\myfrac
                   12$

问题:我该如何定义自己的命令,以便它们也允许使用跳过括号的简写。

我担心这个问题已经在别处得到解答了。我辩解说,“强健的命令”似乎意味着完全不同的东西,所以我在这里找不到答案。

答案1

在 TeX/LaTeX 中,仅当参数由单个标记组成时,才可以省略带有非分隔参数的花括号。

让我们看一下你的例子:

\documentclass{article}
\newcommand{\myfrac}[2]{\frac{#1}{#2}}
\newcommand{\mysqrt}[1]{\sqrt{#1}}

\begin{document}
$\mysqrt\myfrac12$
\end{document}

在 TeXbook 中,Donald E. Knuth 将 TeX 的工作方式与消化道的工作方式进行了类比:

眼睛逐行查看 .tex-input-file。查看完一行 .tex-input 后​​,移动角色一行 .tex-input 放入口中。
(这里的“看并动”是指

  • 从 .tex 输入文件复制到 TeX 管理的某个内存区域,
  • 从计算机平台的字符编码转换为 TeX 引擎的内部字符编码,
  • 删除行右端的所有空格字符,
  • 在行的右端附加一个字符,该字符在 TeX 引擎的内部字符编码方案中的代码点号等于整数参数的值\endlinechar。通常该值为 13,而 13 表示 TeX 引擎的内部字符编码方案中的返回字符。对于传统的 TeX 引擎,内部字符编码方案是 ASCII。对于基于 XeTeX 或 LuaTeX 的 TeX 引擎,内部字符编码方案是 unicode/utf-8,其中 ASCII 是其子集。)

嘴巴把这些输入字符作为一组产生标记的指令(控制序列标记、字符标记)并将这些代币送入食道。 (嘴巴将眼睛产生的“输入字符流”分成小块,并根据这些小块产生标记(控制序列标记、字符标记),然后将这些标记送入食道,这意味着在食道中你有一个“标记流”/一个“标记流”。)

在可扩展令牌的喉咙扩张中例如宏,发生。这意味着可扩展标记会从标记流中移除,而替换标记(如果有)会插入到标记流中。这种情况会一直发生(在某种反流过程中),直到标记流中没有剩余的可扩展标记。食道中扩展可扩展标记所产生的标记会被送入 TeX 的胃中。因此通常只有非可扩展标记才能到达 TeX 的胃中。

我在这里写“通常”是因为在特殊情况下,扩张被抑制,以便可扩展的令牌可以到达胃:例如,当胃从食道请求属于⟨参数文本⟩或者⟨平衡文本⟩\def,扩展被抑制。随着⟨平衡文本⟩赋值扩展的\edef不被抑制。例如,属于⟨平衡文本⟩标记寄存器赋值扩展被抑制。(但标记寄存器赋值扩展不会被抑制,直到{找到⟨平衡文本⟩,随后是⟨右括号⟩

不可膨胀的令牌在胃中被处理。


我们来看看 .tex-input 的行$\mysqrt\myfrac12$

眼睛看着 .tex 输入行,并把字符(还不是“标记”!),,,,,,,,,,,,,,,,,,,,,,送进嘴里。(-
$character是 由于整数 参数\的值为13,它表示mTeX引擎内部字符编码方案中的 -character y。)sqrt\myfrac12$⟨return⟩

⟨return⟩\endlinechar⟨return⟩

首先,嘴巴产生 catcode-3(数学转换)字符标记并将其送入食道。这样的字符标记不可扩展,因此它只是通过食道到达胃部,导致切换到数学模式,然后被移除。$3

因此嘴里只剩下
\字符m,,,,,,,,,,,,,,,,,。​​​​​​​​​ ​​ ​ysqrt\myfrac12$⟨return⟩

 在嘴巴中,TeX 生成控制字标记\mysqrt。它被送入食道,在那里展开可扩展标记。
因此,在嘴巴中,您会看到字符:\myfrac12$。 在食道中,您会看到标记: 。⟨return⟩
\mysqrt

该标记\mysqrt是可扩展的,因此食道从嘴中请求更多的标记,即适合形成\mysqrt非限定参数的标记。

嘴巴中的下一个字符不是左花括号字符(不是类别代码 1(开始组)的字符)。因此,TeX 假设 的\mysqrt非分隔参数由单个标记组成,而不是嵌套在一对花括号中的一组(花括号平衡的)标记。嘴巴产生标记\myfrac并将其送入 TeX 的食道。

因此,在嘴里,您有以下字符:12$⟨return⟩ 。
在食道里,您有以下标记:\mysqrt\myfrac 。

\mysqrt在 TeX 的喉管内进行扩展可得:

口中的字符: 12$⟨return⟩ 。
食道中的令牌:\sqrt、、、 。{1\myfrac}2

\sqrt在 TeX 的喉管内进行扩展可得:

口中的字符:12$⟨return⟩ 。
食道中的令牌:\protect\sqrt␣,,, 。{1\myfrac}2

表示空格字符(ASCII 中的代码点编号 32)是所讨论的控制序列标记名称的一部分。在正常的类别代码制度下,无法通过让 TeX 读取并标记 .tex 输入文件中的行/字符来获得此类标记。但可以通过 获取它们\csname..\endcsname。还可以通过在让 TeX 读取并标记 .tex 输入文件中的内容之前将空格字符的类别代码临时切换为 11(字母)来获得它们。)

\protect在这种情况下相等\relax,因此不可扩展,因此被送入 TeX 的胃中,在那里它不起作用,因此你得到:

口中字符:12$⟨return⟩ 。
食道中的代币:\sqrt␣,,, 。 胃中的代币: 。{1\myfrac}2
\protect

现在\protect由胃处理并因此被移除。(的含义\protect等于 -primitive 的含义,\relax而 -primitive 又表示 TeX 的胃无操作。)

口中的字符:12$⟨return⟩ 。
食道中的标记:\sqrt␣,,, 。 胃中的标记:{1\myfrac}2

\sqrt␣在 TeX 的喉咙中扩张可得到:

口中的字符:12$⟨return⟩ 。
食道中的代币: ,\@ifnextchar,,,,。胃中 的代币:[12\@sqrt\sqrtsign{1\myfrac}2

经过处理\@ifnextchar,在某个阶段您会得到:

口中的字符:12$⟨return⟩ 。
食道中的标记:\sqrtsign,,, 。 胃中的标记:{1\myfrac}2

\sqrtsign在 TeX 的喉咙中扩张可得到:

口中的角色:12$⟨return⟩ 。
食道中的代币: ,\radical, , , , , , , ,。胃中 的代币:"12212712012312712012\relax{1\myfrac}2

标记\radical、 、 、 、 、 、 、 不可展开。因此它们将不会在 TeX 的食道中处理,而是会被发送到 TeX 的胃中。因此你会得到:"12212712012312712012\relax{1

口中的角色:12$⟨return⟩ 。
食道中的代币: ,\myfrac。 胃中 的代币:, , , , , , , ,。}2
\radical"12212712012312712012\relax{1

胃需要更多的令牌才能执行\radical.. 指令。胃“处理”食道,以便让食道输送更多的令牌。

当在 TeX 的喉咙中尝试扩展时\myfrac\myfrac后面跟着一个右花括号标记。

TeX 管道中的这种情况会干扰 TeX 对\myfrac两个非限定参数的收集。

TeX 通过提交错误消息让用户意识到它的干扰! Argument of \myfrac has an extra }.

答案2

输入\sqrt\frac12仅偶然起作用。

该宏的\sqrt基本定义是

\@ifnextchar[\@sqrt\sqrtsign

由于没有[跟进呼叫,你得到

\sqrtsign\frac12

进而

\radical "270370\relax\frac12

现在 TeX 想要看看什么\radical适用于它发生扩展\frac12

{\begingroup 1\endgroup\over 2}

支架保证建筑物正常运转。

尝试

\sqrt3^2

你会得到相同的结果

{\sqrt{3}}^2

\sqrt\cos x你一起得到

! Missing { inserted.
<to be read again>
                   \mathop
l.6 $\sqrt\cos
               x$

学习使用正确的标记:

\sqrt{\frac{1}{2}}

每次你都会没事的。

相关内容