![当段落后跟没有空格的“对齐”方程式环境时,为什么 lineno 不会对段落进行编号?](https://linux22.com/image/245563/%E5%BD%93%E6%AE%B5%E8%90%BD%E5%90%8E%E8%B7%9F%E6%B2%A1%E6%9C%89%E7%A9%BA%E6%A0%BC%E7%9A%84%E2%80%9C%E5%AF%B9%E9%BD%90%E2%80%9D%E6%96%B9%E7%A8%8B%E5%BC%8F%E7%8E%AF%E5%A2%83%E6%97%B6%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%20lineno%20%E4%B8%8D%E4%BC%9A%E5%AF%B9%E6%AE%B5%E8%90%BD%E8%BF%9B%E8%A1%8C%E7%BC%96%E5%8F%B7%EF%BC%9F.png)
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
存在问题。以下是环境$$
的定义align
amsmath
:
\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谈论,只是不需要更改文档中的每个显示数学。
值得注意的是,这个解决方案最终是糟糕的;它破坏了正确的分页和正确的垂直间距。