不确定标准是否真的允许这样做,但至少在我的 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,它表示m
TeX引擎内部字符编码方案中的 -character y
。)s
q
r
t
\
m
y
f
r
a
c
1
2
$
⟨return⟩
⟨return⟩
\endlinechar
⟨return⟩
首先,嘴巴产生 catcode-3(数学转换)字符标记并将其送入食道。这样的字符标记不可扩展,因此它只是通过食道到达胃部,导致切换到数学模式,然后被移除。$3
因此嘴里只剩下
\
字符m
,,,,,,,,,,,,,,,,,。 y
s
q
r
t
\
m
y
f
r
a
c
1
2
$
⟨return⟩
在嘴巴中,TeX 生成控制字标记\mysqrt
。它被送入食道,在那里展开可扩展标记。
因此,在嘴巴中,您会看到字符:\
,m
,y
,f
,r
,a
,c
,1
,2
,$
。 在食道中,您会看到标记: 。⟨return⟩
\mysqrt
该标记\mysqrt
是可扩展的,因此食道从嘴中请求更多的标记,即适合形成\mysqrt
非限定参数的标记。
嘴巴中的下一个字符不是左花括号字符(不是类别代码 1(开始组)的字符)。因此,TeX 假设 的\mysqrt
非分隔参数由单个标记组成,而不是嵌套在一对花括号中的一组(花括号平衡的)标记。嘴巴产生标记\myfrac
并将其送入 TeX 的食道。
因此,在嘴里,您有以下字符:1
,2
,$
,⟨return⟩
。
在食道里,您有以下标记:\mysqrt
,\myfrac
。
\mysqrt
在 TeX 的喉管内进行扩展可得:
口中的字符: 1
、2
、$
、⟨return⟩
。
食道中的令牌:\sqrt
、、、 。{1
\myfrac
}2
\sqrt
在 TeX 的喉管内进行扩展可得:
口中的字符:1
,2
,$
,⟨return⟩
。
食道中的令牌:\protect
,\sqrt␣
,,, 。{1
\myfrac
}2
(␣
表示空格字符(ASCII 中的代码点编号 32)是所讨论的控制序列标记名称的一部分。在正常的类别代码制度下,无法通过让 TeX 读取并标记 .tex 输入文件中的行/字符来获得此类标记。但可以通过 获取它们\csname..\endcsname
。还可以通过在让 TeX 读取并标记 .tex 输入文件中的内容之前将空格字符的类别代码临时切换为 11(字母)来获得它们。)
\protect
在这种情况下相等\relax
,因此不可扩展,因此被送入 TeX 的胃中,在那里它不起作用,因此你得到:
口中字符:1
,2
,$
,⟨return⟩
。
食道中的代币:\sqrt␣
,,, 。 胃中的代币: 。{1
\myfrac
}2
\protect
现在\protect
由胃处理并因此被移除。(的含义\protect
等于 -primitive 的含义,\relax
而 -primitive 又表示 TeX 的胃无操作。)
口中的字符:1
,2
,$
,⟨return⟩
。
食道中的标记:\sqrt␣
,,, 。 胃中的标记:{1
\myfrac
}2
\sqrt␣
在 TeX 的喉咙中扩张可得到:
口中的字符:1
,2
,$
,⟨return⟩
。
食道中的代币: ,\@ifnextchar
,,,,。胃中 的代币:[12
\@sqrt
\sqrtsign
{1
\myfrac
}2
经过处理\@ifnextchar
,在某个阶段您会得到:
口中的字符:1
,2
,$
,⟨return⟩
。
食道中的标记:\sqrtsign
,,, 。 胃中的标记:{1
\myfrac
}2
\sqrtsign
在 TeX 的喉咙中扩张可得到:
口中的角色:1
,2
,$
,⟨return⟩
。
食道中的代币: ,\radical
, , , , , , , ,。胃中 的代币:"12
212
712
012
312
712
012
\relax
{1
\myfrac
}2
标记\radical
、 、 、 、 、 、 、 不可展开。因此它们将不会在 TeX 的食道中处理,而是会被发送到 TeX 的胃中。因此你会得到:"12
212
712
012
312
712
012
\relax
{1
口中的角色:1
,2
,$
,⟨return⟩
。
食道中的代币: ,\myfrac
。 胃中 的代币:, , , , , , , ,。}2
\radical
"12
212
712
012
312
712
012
\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}}
每次你都会没事的。