我尝试在文档中 定义两个命令\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 查看器中打开此文件。)
我在这里复制了本节的结尾,但您应该完整阅读它。
一些解决方法:
\def\bal#1\eal{\begin{align}#1\end{align}}
定义
\newcommand{\env}[2]{\begin{#1}#2\end{#1}}
然后使用\env{align}{...}