![多行方程,标记一次并支持分页](https://linux22.com/image/379689/%E5%A4%9A%E8%A1%8C%E6%96%B9%E7%A8%8B%EF%BC%8C%E6%A0%87%E8%AE%B0%E4%B8%80%E6%AC%A1%E5%B9%B6%E6%94%AF%E6%8C%81%E5%88%86%E9%A1%B5.png)
我想要一个多行公式,只标记一次,并支持分页符。如果我选择
\begin{align}\begin{split}
balabala\\
balabala
\end{split}\end{align}
然后,标签split
就无法支持分页符了。我知道可以align
一起使用nonumber
,但我想要一种更智能的方式,这样我就不用担心了。标签出现在哪里并不重要。
一个简化的问题是:是否有任何方法可以自动在第一行设置标签,同时整个等式允许分页?
答案1
如果我理解正确的话,这就是你要找的东西:一些对齐的方程式,它们在最开始 (第一行) 被编号一次并允许分页?以下代码可以做到这一点。
它使用align*
环境来抑制自动方程编号。我编写了一个简短的宏\numberthis
,它对环境的当前行进行编号align*
并更新方程计数器。然后我修补了align*
环境以使用它并对第一行进行编号。正如其他人提到的,您还需要\allowdisplaybreaks
。
\documentclass[12pt,a4paper]{article}
\usepackage{amsmath}
\usepackage{etoolbox}
\usepackage{lipsum}
\newcommand{\numberthis}{\refstepcounter{equation}\tag{\arabic{equation}}}
\expandafter\appto\csname align*\endcsname{\numberthis}
\allowdisplaybreaks
\begin{document}
\begin{align*}
(a+b)^2&=a^2+2ab+b^2\\
(a-b)^2&=a^2-2ab+b^2\\
a^2-b^2&=(a+b)(a-b)
\end{align*}
\lipsum[1-3]
\begin{align*}
(a+b)^2&=a^2+2ab+b^2\\
(a-b)^2&=a^2-2ab+b^2\\
a^2-b^2&=(a+b)(a-b)\\
a&\\
b&\\
c&
\end{align*}
\end{document}
答案2
请注意:这个答案更多的是作为 LaTeX 代码改进的建议,而不是尝试改变amsmath
从属数学环境。我们应该阻止后者。
你不应该使用从属数学环境来编写多个方程式
以下是两段引言amsldoc.pdf
以下用户指南amsmath
软件包:
第 3.4 节,第 6 页: … [这
split
环境是为了单身的方程式太长,一行无法容纳,因此必须分成多行。
和
第 3.7 节,第 9 页:...[V]ariant
gathered
、、aligned
和alignedat
...可用作包含表达式的组成部分。
总之,您不应该使用从属数学环境来编写多个方程式,因为从属仅仅是其他顶级数学环境中的构建块,而顶级(例如,,,,align
等)是多个方程式的预期结构。align*
gather
gather*
你应该把注意力放在破解多个方程式上
我再次引用了用户指南amsmath
软件包:
第 3.9 节,第 10 页:...
amsmath
使用该软件包时,通常不允许在方程式行之间使用分页符;其理念是,作者应该对此类材料的分页符给予特别关注。... 如果您更喜欢让分页符随意放置的策略,即使是在多行方程式的中间,也可以将其放在文档\allowdisplaybreaks[1]
的序言中。
并在同一节中
…某些方程环境将其内容包裹在一个牢不可破的盒子里[。]……其中包括
split
,,,和aligned
。gathered
alignedat
所以我强烈建议
- 避免使用大量的多个方程式;
- 手动添加定制标签。
您是否将多个方程式放入已经位于某些多行顶级环境内的从属环境内?
好吧,不要这样做。只需使用一层顶层环境,无论它是什么。
如果你以这种方式写出方程式,那么环境align*
和\tag
简单组合即可。例如,这个答案。
请注意@nox 的回答与链接帖子中@IanThompson 的回答几乎相同,但@nox 的回答会导致全部 align*
需要更改。您确定要这样做吗?
添加:通过结合@nox 答案下的评论,您可能希望使用\theequation
而不是\arabic{equation}
,并按照@GuM 的建议为此特定用途定义您自己的环境。
答案3
我认为如果定义一个新的环境,而不是重新定义(从而滥用),@nox 的好答案可以得到进一步改进align*
;我在一条评论但两天多过去了,建议仍未得到采纳,所以我才敢于提交这个额外的答案来说明如何做到这一点。请允许我强调,这只是对@nox 设计的解决方案的改进,我很高兴承认他的主要功劳。
实际上,通过新环境实现 @nox 的解决方案可能并不完全简单,因为从 的环境派生新环境amsmath
是出了名的棘手。但这个技巧可以归结为一个简单的技巧:只需避免\@currenvir
在编写的代码中更改 的值即可。这可以通过分别用 和 替换 来实现。\begin{FOOENV}
然而,在我们的例子中,我们要使用的环境在其名称中包含一个非字母(星号),因此我们必须求助于,或者,这是一样的,。\end{FOOENV}
\FOOENV
\endFOOENV
\csanme align*\endcsname
\@nameuse{align*}
这是一个完整的可编译示例;可以在代码本身中找到进一步的注释。我还必须撤回我之前关于使用\refstepconter
: indeed\stepcounter
就足够的错误评论(我已经意识到这一点前@egreg 发布他的评论!)。
% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly
% declare the paper format.
\usepackage[T1]{fontenc} % Not always necessary, but recommended.
% End of standard header. What follows pertains to the problem at hand.
\usepackage{amsmath}
\usepackage{lipsum} % only for this example (of course!)
\makeatletter
\newenvironment{oddalign}{%
\@nameuse{align*}% or directly "\csname align*\endcsname"
\stepcounter{equation}\tag{\theequation}%
}{\@nameuse{endalign*}} % as above
\makeatother
\allowdisplaybreaks[1] % see amsmath manual, section 3.9
\begin{document}
A normal \texttt{align*} environment (which you might \emph{still} want to use,
of course!):
\begin{align*}
(a+b)^2 &= a^2+2ab+b^2\\
(a-b)^2 &= a^2-2ab+b^2\\
a^2-b^2 &= (a+b)(a-b)
\end{align*}
An example of our new \texttt{oddalign} environment where a page break isn't
needed:
\begin{oddalign}
\label{eq:example1}
(a+b)^0 &= 1 \\
(a+b)^1 &= a+b \\
\begin{split}
(a+b)^2 &= (a+b)(a+b) = a^2+ab+ab+b^2 \\
&= a^2+2ab+b^2
\end{split} \\
\begin{split}
(a+b)^3 &= (a+b)(a+b)^2 = (a+b)(a^2+2ab+b^2) \\
&= a^3+2a^2b+2ab^2+a^2b+2ab^2+b^3 \\
&= a^3+3a^2b+3ab^2+b^3
\end{split} \\
\intertext{and in general}
(a+b)^{n} &= \sum_{k=0}^{n}\binom{n}{k} a^{n-k}b^{k}
\end{oddalign}
Note that our new environment behaves correctly with nested environments (and
with \verb|\intertext|, too).
% Try different alternatives:
% no "\lipsum" at all
% \lipsum[1]
\lipsum[2-3]
% \lipsum[1-3]
We'll now repeat the same code as above in a place where, on the contrary, a
page break \emph{is} needed:
\begin{oddalign}
\label{eq:example2}
(a+b)^0 &= 1 \\
(a+b)^1 &= a+b \\
\begin{split}
(a+b)^2 &= (a+b)(a+b) = a^2+ab+ab+b^2 \\
&= a^2+2ab+b^2
\end{split} \\
\begin{split}
(a+b)^3 &= (a+b)(a+b)^2 = (a+b)(a^2+2ab+b^2) \\
&= a^3+2a^2b+2ab^2+a^2b+2ab^2+b^3 \\
&= a^3+3a^2b+3ab^2+b^3
\end{split} \\
\intertext{and in general}
(a+b)^{n} &= \sum_{k=0}^{n}\binom{n}{k} a^{n-k}b^{k}
\end{oddalign}
Will the next equation be numbered correctly?
\begin{equation}
x=y
\label{eq:xy}
\end{equation}
Yes.
The references are to equations \eqref{eq:example1} and~\eqref{eq:example2},
(and to equation~\eqref{eq:xy}): this is OK\@. Note, however, that in order for
the references to work correctly, the \verb|\label| commands must be placed at
the very beginning of the \texttt{oddalign} environment.
On second thought, why the name \texttt{oddalign}? It isn't that odd, after
all!
\end{document}