当我使用此代码时,上面会出现一些空格。
\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
文档。