当段落后跟没有空格的“对齐”方程式环境时,为什么 lineno 不会对段落进行编号?

当段落后跟没有空格的“对齐”方程式环境时,为什么 lineno 不会对段落进行编号?

lineno在这种情况下跳过行号:

\documentclass[12pt]{article}
\usepackage{amsmath}
\usepackage{lineno}
\linenumbers
\begin{document}
Lorem ipsum dolor sit amet, consectetur adipiscing elit: 
\begin{align}
1+1=2
\end{align}
\end{document}

但可以

\documentclass[12pt]{article}
\usepackage{amsmath}
\usepackage{lineno}
\linenumbers
\begin{document}
Lorem ipsum dolor sit amet, consectetur adipiscing elit: 

\begin{align}
1+1=2
\end{align}
\end{document}

请注意,虽然这听起来很像这个问题。我不认为答案是相关的,因为这不使用 $$后者是否更正确?

答案1

本质上,这相同,因为在组装环境内容之前align存在问题。以下是环境$$的定义alignamsmath

\newenvironment{align}{%
  \start@align\@ne\st@rredfalse\m@ne
}{%
  % <removed \end{align} part for brevity>
}

因此,\begin{align}相当于

\start@align{\@ne}{\st@rredfalse}{\m@ne}

其中\start@align被定义为采用三个参数并进行适当的条件处理。在 的定义中\start@align,我标记了条件,以及$$用于进入显示数学模式的最后一个条件:

\def\start@align#1#2#3{%
    \let\xatlevel@#1% always \z@, \@ne, or \tw@
    \maxfields@#3\relax
    \ifnum\maxfields@>\m@ne % <------------------- FALSE
        \checkat@true
        \ifnum\xatlevel@=\tw@
            \xxat@true
        \fi
        \multiply\maxfields@\tw@
    \else % <------------------------------------- TRUE
        \checkat@false
    \fi
    \ifingather@ % <------------------------------ FALSE
        \iffalse{\fi\ifnum0=`}\fi
        \DN@{\vcenter\bgroup\savealignstate@\align@#2}%
    \else % <------------------------------------- TRUE
        \ifmmode % <------------------------------ FALSE
          \if@display
             \DN@{\align@recover}%
          \else
            \nomath@env
            \DN@{\@namedef{end\@currenvir}{}\@gobble}%
          \fi
        \else % <--------------------------------- TRUE
            $$% <--------------------------------- enter display math mode
            \let\split\insplit@
            \DN@{\align@#2}%
        \fi
    \fi
    \collect@body\next@
}

结论?使用空行(或段落分隔符)。使用或不使用输出结果相同,但本例除外lineno

答案2

我也找到了这个答案。它提供了一个命令,您可以根据需要使用它来修补数学环境。我认为它的作用与上面介绍的相同,但有几种解决方案也无妨。

无论它是否包含在序言中,我都看不出行距的差异,但之前未显示的行号在添加后会显示出来。

http://phaseportrait.blogspot.com/2007/08/lineno-and-amsmath-compatibility.html

上述链接的简短摘要:将以下内容添加到您的序言中:

\newcommand*\patchAmsMathEnvironmentForLineno[1]{%
  \expandafter\let\csname old#1\expandafter\endcsname\csname #1\endcsname
  \expandafter\let\csname oldend#1\expandafter\endcsname\csname end#1\endcsname
  \renewenvironment{#1}%
     {\linenomath\csname old#1\endcsname}%
     {\csname oldend#1\endcsname\endlinenomath}}% 
\newcommand*\patchBothAmsMathEnvironmentsForLineno[1]{%
  \patchAmsMathEnvironmentForLineno{#1}%
  \patchAmsMathEnvironmentForLineno{#1*}}%
\AtBeginDocument{%
\patchBothAmsMathEnvironmentsForLineno{equation}%
\patchBothAmsMathEnvironmentsForLineno{align}%
\patchBothAmsMathEnvironmentsForLineno{flalign}%
\patchBothAmsMathEnvironmentsForLineno{alignat}%
\patchBothAmsMathEnvironmentsForLineno{gather}%
\patchBothAmsMathEnvironmentsForLineno{multline}%
}

答案3

将其放在你的序言中,最后(数学包加载之后):

\makeatletter
% Make a copy of macros responsible for entering display math mode
\let\start@align@nopar\start@align
\let\start@gather@nopar\start@gather
\let\start@multline@nopar\start@multline
% Add the "empty line" command to the macros
\long\def\start@align{\par\start@align@nopar}
\long\def\start@gather{\par\start@gather@nopar}
\long\def\start@multline{\par\start@multline@nopar}
\makeatother

它实际上采用了@Werner谈论,只是不需要更改文档中的每个显示数学。

值得注意的是,这个解决方案最终是糟糕的;它破坏了正确的分页和正确的垂直间距。

相关内容