我想要一个不关心空行的方程式环境。通常,方程式前后的空行会开始一个新段落,从而导致显示方程式周围出现额外的垂直间距。方程式环境中的空行会导致编译错误:
Text above
% <- Empty line causes additional spacing
\begin{equation}
\begin{aligned}
% <- Empty line causes error
x &= y \\
% <- Empty line causes error
y &= z
% <- Empty line causes error
\end{aligned}
\end{equation}
% <- Empty line causes additional spacing
Text below
答案1
解决方案:
之前有空行。一旦 LateX 处理了它,
\par
它就不能被删除。相反,我们检查是否处于新段落的开头\ifvmode
,然后将 parskip 设置为零,并用负空间补偿上面的空行。之后为空行。 我们可以
\par
使用 来防止在环境之后写入\@gobble\par
,这会忽略可能跟在方程式环境后面的空格和换行符。有关更多详细信息,请参阅这个答案。內容中有空行。为了隐藏 amsmath 中的空行,我们更改
\endlinechar
到空格字符。否则这不会影响方程,因为在数学模式下空格会被忽略。我不确定为什么需要嵌套命令,但它确实有效。
例子:
\documentclass{article}
\usepackage{amsmath}
\usepackage{xpatch}
\usepackage{lipsum}
\xapptocmd\normalsize{%
\abovedisplayskip=.8em plus .2em minus .2em
\belowdisplayskip=.6em plus .1em minus .1em
\abovedisplayshortskip=.8em plus .2em minus .2em
\belowdisplayshortskip=.6em plus .1em minus .1em
}{}{}
\makeatletter
\newcommand{\removeParBefore}{\ifvmode\vspace*{-\baselineskip}\setlength{\parskip}{0ex}\fi}
\newcommand{\removeParAfter}{\@ifnextchar\par\@gobble\relax}
\newcommand{\eq}{\begingroup\removeParBefore\endlinechar=32 \eqinner}
\newcommand{\eqinner}[1]{\endlinechar=32%
\begin{equation}\begin{aligned}#1\end{aligned}\end{equation}\endgroup\removeParAfter}
\makeatother
\begin{document}
\lipsum[2]
\eq{
x &= y \\
y &= z
}
\lipsum[2]
\end{document}