关于 \def\b*{\begin{align*}}

关于 \def\b*{\begin{align*}}

我想让代码更短一些。我定义了以下一对宏:

\def\b*{\begin{align*}}
\def\e*{\end{align*}}

我的观点是,我在一份文件中看到了这一点,

\def\b*{\begin{eqnarray*}}
\def\e*{\end{eqnarray*}}

相反。第一对宏无法编译(在 sharelatex.com 上),而第二对宏可以编译。为什么?

答案1

technote文档解释了为什么这种简写定义会失败:

6 为什么我不能使用缩写\begin{align} ... \end{align}

作者通常喜欢使用诸如\beq \eeqfor 之类的缩写\begin{equation} \end{equation}。对于包定义的某些环境amsmath,例如align、、和其他相同类型的环境,这样做不起作用:尝试将其定义为 for 的简写将会gather失败并显示令人费解的错误消息。不幸的是,这与不简单的技术复杂性有关:给定的环境必须将其内容读取为分隔的宏参数,因为它们使用从 Spivak 的 继承的算法对内容进行多遍处理。显而易见的解决方案 - 用不同的算法替代多遍计算中的框洗牌而不是标记洗牌 - 需要从头开始重写这些显示环境;虽然这是一个值得的目标,但它超出了 AMS-LaTeX 项目的原始范围。一个名为的辅助包的工作正在进行中,它不仅解决了这个问题,还解决了许多其他问题;然而,在撰写本文时 [1999 年 9 月] 它只进展到 beta 版本。multline\bal \eal\begin{align} \end{align}amstex.texbreqn

一些解决方法:

  • \def\bal#1\eal{\begin{align}#1\end{align}}
  • 定义\newcommand{\env}[2]{\begin{#1}#2\end{#1}}然后使用 \env{align}{...}

答案2

AMS 对齐的限制是它们不能隐藏在命令形式后面,这在 amsmath 指南第 28 页有记录 ( texdoc amsmath) 实际上,该限制在技术说明 ( texdoc technote) 中得到了更好的描述,如另一个答案所示。

这里选择的名称特别危险,因为使用它们\def你会丢失从正确的 LaTeX 语法中获得的警告,\newcommand即你覆盖了标准重音命令\b

相关内容