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