有没有办法显示lineno
使用环境的段落的行号align
?
在下面的例子中,以 结尾的(第一个)段落\begin{align} ... \end{align}
没有所需的行号,而以单个新行分隔文本的(第二个)段落包含行号。
\documentclass{article}
\usepackage{amsmath}
\usepackage[mathlines]{lineno}
\usepackage{lipsum}
\linenumbers
\title{My Document}
\author{Anonymous Anteater}
\begin{document}
\maketitle
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
culpa qui officia deserunt mollit anim id est laborum.
\begin{align}
x = 2
\end{align}
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
\begin{align}
x = 2
\end{align}
\end{document}
答案1
该lineno
软件包与环境不兼容amsmath
,但可以使两者协同工作。如果没有选项mathlines
(lineno
打开方程式内的行编号),这非常简单,但如果您想对方程式内的行进行编号,就会变得有点困难。
手动修复(mathlines
仅限无)
这文档为了lineno
描述如何正确获取显示方程周围的方程编号:
lineno.sty
无法很好地与显示数学配合使用。显示数学之前的段落部分不会获得行号。原因是段落尚未完成,但显示上方的部分无论如何都会被分成几行。[…]
lineno.sty
定义一个{linenomath}
环境,它可以包裹显示数学以使行号工作。这将适用于任何类型的显示数学,即使您使用显式$$
对。有一个 * 形式{linenomath*}
,它也可以对显示本身的行进行编号,尽其所能。
只要您不提供mathlines
选项lineno
(打开等式内的行号)或使用星号形式,这种方法就可以正常工作。
\begin{linenomath}
\begin{align}
…
\end{align}
\end{linenomath}
然而,对每个方程都这样做有点麻烦。
自动修复(无mathlines
)
与其手动为每个方程式执行此操作,不如修补 AMS 数学环境更方便。这可以通过在前言中添加以下内容(或其一些变体)来实现。
\usepackage{lineno} %% <- no mathlines option
\usepackage{amsmath} %% <- after lineno
\usepackage{etoolbox} %% <- for \cspreto, \csappto
%% Patch 'normal' math environments:
\newcommand*\linenomathpatch[1]{%
\cspreto{#1}{\linenomath}%
\cspreto{#1*}{\linenomath}%
\csappto{end#1}{\endlinenomath}%
\csappto{end#1*}{\endlinenomath}%
}
\linenomathpatch{equation}
\linenomathpatch{gather}
\linenomathpatch{multline}
\linenomathpatch{align}
\linenomathpatch{alignat}
\linenomathpatch{flalign}
如果使用mathlines
选项的话这也不会很好地工作(见下文)。lineno
注意:选择加载lineno
前 amsmath
是故意的,因为lineno
也修补了equation
环境(但不是equation*
),以及\[
+ \]
(有点不恰当),而amsmath
完全重新定义它们。如果以相反的顺序加载软件包,equation
并且\[
+\]
最终被修补两次(这是无害的),并且\[
+\]
最终不再是健壮的。由于\[
和\]
被定义为\begin{equation*}
和 的简写\end{equation*}
,因此它们对于此顺序确实可以正常工作。
自动修复(有或无mathlines
)
如果您使用该mathlines
选项是lineno
因为您还希望方程式本身的行被编号,那么这种方法存在一些问题。额外的行号将打印在所有amsmath
方程式环境的正下方,并且multline
还会在顶部收到额外的行号。我发布了一种避免这两种无关行号的方法这个答案到另一个问题。
您需要将以下内容添加到文档的序言中。如果mathlines
删除选项,这仍然有效,但方程式内的行将不再编号。
\usepackage[mathlines]{lineno} %% <- with [mathlines] to number lines in equations
\usepackage{amsmath} %% <- after lineno
\usepackage{etoolbox} %% <- for \cspreto, \csappto and \patchcmd
%% Patch 'normal' math environments:
\newcommand*\linenomathpatch[1]{%
\cspreto{#1}{\linenomath}%
\cspreto{#1*}{\linenomath}%
\csappto{end#1}{\endlinenomath}%
\csappto{end#1*}{\endlinenomath}%
}
%% Patch AMS math environments:
\newcommand*\linenomathpatchAMS[1]{%
\cspreto{#1}{\linenomathAMS}%
\cspreto{#1*}{\linenomathAMS}%
\csappto{end#1}{\endlinenomath}%
\csappto{end#1*}{\endlinenomath}%
}
%% Definition of \linenomathAMS depends on whether the mathlines option is provided
\expandafter\ifx\linenomath\linenomathWithnumbers
\let\linenomathAMS\linenomathWithnumbers
%% The following line gets rid of an extra line numbers at the bottom:
\patchcmd\linenomathAMS{\advance\postdisplaypenalty\linenopenalty}{}{}{}
\else
\let\linenomathAMS\linenomathNonumbers
\fi
\linenomathpatch{equation}
\linenomathpatchAMS{gather}
\linenomathpatchAMS{multline}
\linenomathpatchAMS{align}
\linenomathpatchAMS{alignat}
\linenomathpatchAMS{flalign}
% Disable line numbering during measurement step of multline
\makeatletter
\patchcmd{\mmeasure@}{\measuring@true}{
\measuring@true
\ifnum-\linenopenaltypar>\interdisplaylinepenalty
\advance\interdisplaylinepenalty-\linenopenalty
\fi
}{}{}
\makeatother
关于为什么所有这些都是必要的以及为什么这是有效的,可以找到解释这里。
示范
这是最后一个解决方案的示例文档。
\documentclass{article}
\usepackage[mathlines]{lineno} %% <- remove [mathlines] to omit equation line numbers
\usepackage{amsmath}
\usepackage{etoolbox} %% <- for \pretocmd, \apptocmd and \patchcmd
%% Patch 'normal' math environments:
\newcommand*\linenomathpatch[1]{%
\cspreto{#1}{\linenomath}%
\cspreto{#1*}{\linenomath}%
\csappto{end#1}{\endlinenomath}%
\csappto{end#1*}{\endlinenomath}%
}
%% Patch AMS math environments:
\newcommand*\linenomathpatchAMS[1]{%
\cspreto{#1}{\linenomathAMS}%
\cspreto{#1*}{\linenomathAMS}%
\csappto{end#1}{\endlinenomath}%
\csappto{end#1*}{\endlinenomath}%
}
%% Definition of \linenomathAMS depends on whether the mathlines option is provided
\expandafter\ifx\linenomath\linenomathWithnumbers
\let\linenomathAMS\linenomathWithnumbers
%% The following line gets rid of an extra line numbers at the bottom:
\patchcmd\linenomathAMS{\advance\postdisplaypenalty\linenopenalty}{}{}{}
\else
\let\linenomathAMS\linenomathNonumbers
\fi
\linenomathpatch{equation}
\linenomathpatchAMS{gather}
\linenomathpatchAMS{multline}
\linenomathpatchAMS{align}
\linenomathpatchAMS{alignat}
\linenomathpatchAMS{flalign}
\linenumbers
\title{My Document}
\author{Anonymous Anteater}
\begin{document}
\maketitle
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
culpa qui officia deserunt mollit anim id est laborum.
\begin{align*}
\nabla \cdot E &= \frac{\rho}{\varepsilon_0}
&
\nabla \times E &= - \frac{\partial B}{\partial t}
\\
\nabla \cdot B &= 0
&
\nabla \times B &= \mu_0 J + \mu_0 \varepsilon_0 \frac{\partial E}{\partial t}
\end{align*}
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
\begin{equation*}
(\mathrm{id}_{C} \otimes \Delta ) \circ \Delta = (\Delta \otimes \mathrm{id}_{C}) \circ \Delta
\end{equation*}
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor,
\[
\bigwedge_{i=1}^{\dim(V)} A(v_i) = \det(A) \bigwedge_{i=1}^{\dim(V)} v_i,
\]
culpa qui officia deserunt mollit anim id est laborum.
\end{document}