如何重新声明 $$ 或 \[, \] 对

如何重新声明 $$ 或 \[, \] 对

可能有很多理由不这样做,但什么是重新声明序列$$\[,\]对以默认打开某些特殊的显示数学环境(例如\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区别?equationdisplaymath以及相关答案。如果你弄乱了 的定义$$,就无法预知会有多少事情会严重出错。环境的定义align肯定会变得一团糟。

\]按照你正在考虑的方式修改和的定义\](顺便说一下,默认情况下,它们被定义为围绕$$指令的精心设计的“包装器”)也是行不通的。这是因为amsmath方程结构“向前看”到各自环境的末尾,以便将所有材料收集到合适的块中。因此,你会收到一条错误消息,内容是

! LaTeX Error: \begin{align*} on input line xx ended by \end{document}

因为 LaTeX 正在搜索一个\end{align*}声明,但没有成功。

相关内容