可能有很多理由不这样做,但什么是重新声明序列$$
或\[
,\]
对以默认打开某些特殊的显示数学环境(例如\begin{align*}
, )的正确方法\end{align*}
?
(当然,不这样做的理由是什么?)
答案1
虽然你可以重新定义[\
和,\begin{align*}
但\]
这样做\end{align*}
是行不通的,因为许多amsmath
环境使用显式\end{<env>}
发生来查找环境主体并收集它。即使是一些看似微不足道的事情,比如
\newenvironment{<env>}{\begin{align}}{\end{align}}
不会起作用。然而
\let\<env>\align
\let\end<env>\endalign
<env>
因为使用 时环境名称会被 LaTeX 保存\begin{<env>}
。而 则\newenvironment{<env>}
amsmath
不会找到,\end{align}
因为它被 隐藏了\end{<env>}
。
然而,我们可以通过定义为分隔宏来模仿主体收集过程的行为,\[
该分隔宏由 分隔\]
,而 的实际定义\]
仍然是旧的(或任何实际定义),它只是永远不会被执行:
\def\[#1\]{\begin{align*}#1\end{align*}}
将允许
\[
a & = b \\
b & = c
\]
\[
(这只有在在另一个宏和/或包中使用并\]
需要原始定义时才会正常工作。)
同样的道理也适用于$$
。但是,$$
不是宏序列,而是数学移位字符$
(猫码: 3
)。
我们可以使其处于$
活动状态(catcode:13),以便它可以测试以下内容$
并使用(类似于我们的)包装所有内容直到我们自定义环境中的\[#1\]
下一个内容的定义。$$
\catcode`\$=\active
\begingroup
\catcode`\|=3 % | will act as math-shift
\makeatletter
\gdef${\kernel@ifnextchar$\@doubledollar|}
\gdef\@doubledollar$#1$${\begin{align*}#1\end{align*}}
\endgroup
请注意,这将使$ $
(一个空的内联数学)看起来像$$
并且还将执行\@doubledollar
将期望另一个$$
(可能找不到)的数学。我们可以用各种方法纠正这个问题和/或改变它,但所有这些都会使这个问题更难控制或破坏其他事情。
是的,我们可以做很多事,但是我们却没有这么做。
答案2
你当然不应该重新定义$$
,这是一个 TeX数学原语所有类型的 LaTeX 命令内部使用的命令。有关此主题的更多信息,请参阅帖子$$
、、、\[
和之间有何align
区别?equation
displaymath
以及相关答案。如果你弄乱了 的定义$$
,就无法预知会有多少事情会严重出错。环境的定义align
肯定会变得一团糟。
\]
按照你正在考虑的方式修改和的定义\]
(顺便说一下,默认情况下,它们被定义为围绕$$
指令的精心设计的“包装器”)也是行不通的。这是因为amsmath
方程结构“向前看”到各自环境的末尾,以便将所有材料收集到合适的块中。因此,你会收到一条错误消息,内容是
! LaTeX Error: \begin{align*} on input line xx ended by \end{document}
因为 LaTeX 正在搜索一个\end{align*}
声明,但没有成功。