`mdframed` 内 `amsmath` 环境上方的额外空间

`mdframed` 内 `amsmath` 环境上方的额外空间

当我使用此代码时,上面会出现一些空格。

\documentclass{article}
\usepackage{amsmath}
\usepackage{mdframed}

\begin{document}

\begin{mdframed}    
\begin{gather*}
    \lambda^2-2\lambda = 0\\
    \lambda_1 = 0, \enspace \lambda_2 = 2
\end{gather*}
\end{mdframed}

\end{document}

在此处输入图片描述

我尝试实现egreg 的这个答案并且它可以工作,但是我收到了这些错误。

在此处输入图片描述

\documentclass{article}
\usepackage{amsmath}
\usepackage{mdframed}
\usepackage{etoolbox}
\makeatletter
\pretocmd\start@gather{%
    \if@mdframed\kern-\topskip\kern-\abovedisplayskip\fi
}{}{}
\makeatother

\begin{document}

\begin{mdframed}    
\begin{gather*}
    \lambda^2-2\lambda = 0\\
    \lambda_1 = 0, \enspace \lambda_2 = 2
\end{gather*}
\end{mdframed}

\end{document}

在此处输入图片描述


我也想知道如何让它在所有amsmath环境下工作。现在只有一个\start@gather受到影响。

答案1

\if@mdframed正如@UlrikeFischer在问题评论中指出的那样,包中没有布尔值mdframed。以下解决方法

  • 使用 TeX 计数的值\mdf@envdepth来确定代码是否在mdframed环境内执行,并且
  • 补丁各为\start@gather\start@align\start@multline

希望这适用于每个amsmath多行显示方程环境。

\documentclass{article}
\usepackage{amsmath}
\usepackage{mdframed}
\usepackage{etoolbox}

\makeatletter
\pretocmd\start@gather{%
  \ifnum\mdf@envdepth>0
    \kern\glueexpr-\topskip-\abovedisplayskip\relax
  \fi
}{}{\fail}
\pretocmd\start@align{%
  \ifnum\mdf@envdepth>0
    \kern\glueexpr-\topskip-\abovedisplayskip\relax
  \fi
}{}{\fail}
\pretocmd\start@multline{%
  \ifnum\mdf@envdepth>0
    \kern\glueexpr-\topskip-\abovedisplayskip\relax
  \fi
}{}{\fail}
\makeatother

\begin{document}

gather:
\begin{mdframed}    
\begin{gather*}
    \lambda^2-2\lambda = 0\\
    \lambda_1 = 0, \enspace \lambda_2 = 2
\end{gather*}
\end{mdframed}

align:
\begin{mdframed}    
\begin{align*}
    \lambda^2-2\lambda = 0\\
    \lambda_1 = 0, \enspace \lambda_2 = 2
\end{align*}
\end{mdframed}

multline:
\begin{mdframed}    
\begin{multline*}
    \lambda^2-2\lambda = 0\\
    \lambda_1 = 0, \enspace \lambda_2 = 2
\end{multline*}
\end{mdframed}

\end{document}

在此处输入图片描述


如果您喜欢更紧凑的修补代码,则可以使用循环版本:

\makeatletter
\@for\@tempa:=gather,align,multline\do{%
  \expandafter\pretocmd\csname start@\@tempa\endcsname{%
    \ifnum\mdf@envdepth>0
      \kern\glueexpr-\topskip-\abovedisplayskip\relax
    \fi
  }{}{\fail}
}
\makeatother

以下\@for是 LaTeX2e 内部宏,例如macros2e文档。

相关内容