将 \bal 定义为 \begin{align} 有什么错误?

将 \bal 定义为 \begin{align} 有什么错误?

我尝试在文档中 定义两个命令\bal和,\eal而不是插入\begin{align}和,但在下面的代码中,我收到一些错误。这有什么问题?\end{align}

\documentclass{article}
\usepackage{amsmath}
\makeatletter
 \newcommand{\bal}{%
 \begingroup
 \align%
\@ifstar{\nonumber}{}%
 }
 \newcommand{\eal}{\endalign\endgroup}
\makeatother
\begin{document}
\bal*
x=y
\eal
‎\end{document}

答案1

“问题”是众所周知的,也有记录。实际上,我不认为这是一个问题,因为我看不出

\bal
a&=b\\
c&<d
\eal

比输入更清晰

\begin{align}
a&=b\\
c&<d
\end{align}

相反,我坚信后一种语法比前一种语法好得多,因为它清楚地标记了文档。好的编辑器提供了快速的快捷方式,可以用尽可能少的按键输入后一种语法。

让我们来看看为什么你的定义不起作用。align环境必须先吸收所有内容,然后才能开始排版,因为它需要对材料进行两次处理:第一次处理用于测量,第二次处理用于进行真正的排版。这是正确放置材料的关键方程式的数字。

\newcommand{\bal}{\begingroup\align\@ifstar{\nonumber}{}}你开始align,但 LaTeX 永远看不到它的结束,因为它在吸收材料时不会扩展标记,因此\eal将被吸收并且不会识别为的结束align

可以定义

\makeatletter
\newcommand{\bal}{\@ifstar{\@bals}{\@bal}}
\def\@bals#1\eal{\begin{align*}#1\end{align*}}
\def\@bal#1\eal{\begin{align}#1\end{align}}
\makeatletter

这样就可以找到所需的令牌,但是它很笨拙,而且正如我所说,它不会提供任何好处,同时还会混淆代码。

这个问题在 中没有体现出来equation,因为这个环境不会执行复杂的任务来测量其内容。但同样的论点也适用:输​​入没有任何好处

\beq
a=b
\eeq

代替

\begin{equation}
a=b
\end{equation}

没有人能够让我相信相反的观点。

同样,我们也不能align基于

\newenvironment{myalign}
  {<something>\begin{align}}
  {\end{align}}

哪里<something>是想要执行的任何代码来修改align的行为。问题完全相同;但这会起作用:

\newenvironment{myalign}
  {<something>\align}
  {\endalign}

因为\align捕获了当前环境的名称并将其用作要\end{myalign}收集的材料的结束标记。

答案2

这个问题在6该文件是technote.pdf随 分发的文件中的一部分amsmath.sty。(在我的系统texdoc technote.pdf上将在 pdf 查看器中打开此文件。)

我在这里复制了本节的结尾,但您应该完整阅读它。

一些解决方法:

  1. \def\bal#1\eal{\begin{align}#1\end{align}}

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

相关内容