14

Is there a way to have lineno show line numbers for a paragraph that uses the align environment?

In the following example, the (first) paragraph that ends with \begin{align} ... \end{align} does not have the desired line numbers, whereas the (second) paragraph that separates the text with a single new line contains the line numbers.

\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}

missing line numbers with lineno and align

2
19

The lineno package is not compatible with the amsmath environments, but the two can be made to work together. Without the mathlines option to lineno (which turns on line numbering inside equations) this is pretty simple, but if you want the lines inside equations to be numbered it becomes a little more difficult.

Manual fix (without mathlines only)

The documentation for lineno describes how to get the equation numbering around a display equation right:

lineno.sty does not work well with display math. The parts of a paragraph preceeding a display math will not get line numbers. The reason is that the paragraph is not finished, but the part above the display is broken into lines anyway.

[…]

lineno.sty defines a {linenomath} environment, which can be wrapped around a display math to make the line numbering work. This will work with any kind of display math, even if you use explicit $$ pairs. There is a *-form {linenomath*} which also numbers the lines of the display itself, as good as it can.

This works fine as long as you don't provide the mathlines option to lineno (which turns on line numbering inside equations) or use the starred form.

\begin{linenomath}
    \begin{align}
        …
    \end{align}
\end{linenomath}

Doing this for every equation is a bit of a hassle, though.

Automatic fix (without mathlines)

Instead of manually doing this for every equation, it is more convenient to patch the AMS math environments instead. This can be done by adding the following (or some variation of it) to the preamble.

\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}

This also won't work well if the mathlines option to lineno is used (see below).

Note: The choice to load lineno before amsmath was intentional because lineno also patches the equation environment (but not equation*), as well as \[+\] (somewhat improperly), while amsmath redefines them completely. If the packages are loaded in the opposite order, equation and \[+\] end up being patched twice (which is harmless) and \[+\] ends up no longer being robust. Since \[ and \] are defined as shorthands for \begin{equation*} and \end{equation*}, these do work fine for this order.

Automatic fix (with or without mathlines)

If you are using the mathlines option to lineno because you also want the lines of the equations themselves to be numbered, there are some problems with this approach. An additional line number will be printed just below all amsmath equation environment, and multline will additionally receive an extra line number at the top. I posted a way to avoid both of these extraneous line numbers in this answer to another question.

You'll need to add the following to the preamble of your document. If the mathlines options is removed this will still work, but lines inside equations will no longer be numbered.

\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

An explanation of why all of this is necessary and why this works can be found here.


Demonstration

Here is a sample document for the last solution.

\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}

output

20
  • Awesome! Is there a way to extend this to work with \[ ... \] display math as well? Nov 21 '18 at 21:02
  • @PeterGrill I modified the answer to obey (the presence/absence of) the mathlines option. With this option \[…\]-equations are also counted as lines. Nov 21 '18 at 22:34
  • Oh I see. I didn't notice that you had removed the mathlines option in your MWE. Nov 21 '18 at 22:35
  • 1
    example would be improved by a multi-line align. align isn't meant to be used for single-line formulas. Nov 22 '18 at 16:04
  • 1
    You need to also patch equation if amsmath is loaded because then equation gets changed (and equation* was never patched before) Dec 29 '20 at 18:15
3

One way is to replace the align by

\[
  \begin{aligned}
    x = 2
  \end{aligned}
\]

or by

\begin{equation}
 \begin{aligned}
   x = 2
 \end{aligned}
\end{equation}

if you want numbered version.

enter image description here

1
  • 1
    example would be improved by a multi-line aligned. aligned isn't meant to be used for single-line formulas. Nov 22 '18 at 16:03

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.