默认情况下,enumerate
的\item
标签与文本顶部对齐:
但是,如果文本恰好是一个mdframed
框,则标签与底部盒子看起来不太好:
问题:
如何对齐带框和不带框盒子顶部的标签?
失败的解决方案:
我尝试按照以下方式使用该adjustbox
包将枚举标签与图像顶部对齐?:
\begin{enumerate}[label={(\alph*)}]
\item \adjustbox{valign=t}{\TextBFramed}
\item \adjustbox{valign=t}{\TextCFramed}
\end{enumerate}
但这会产生以下错误:
LaTeX 错误:出现问题 - 可能缺少 \item
几乎有效的(手动)解决方案:
适应此解决方案来自将枚举项对齐到 tikzpicture 的顶部似乎可行,但我如何在不重新定义的情况下自动执行此操作\item
。此外,标签与框架中第一行的基线不完全对齐(可以通过更改进行调整2
,但如何在不同情况下确定此值)。
\begin{enumerate}[label={(\alph*)}]
\item ~\\[-2\baselineskip] \TextBFramed
\item ~\\[-2\baselineskip] \TextCFramed
\end{enumerate}
我可以用 来替换\item
,\MyItem
例如:
\newcommand{\MyItem}{\item ~\\[-2\baselineskip]}%
但我需要这个\MyItem
才能~\\[-2\baselineskip]
在内容是mdframed
框时应用,否则不应用。另外,我如何确定乘数的值?请参阅混合文本(自动解决方案失败)部分。
笔记:
- 由于重新定义
\item
可能会很危险`mdframed` 和 `\item` 之间奇怪的交互,我正尝试通过使用来避免这种情况\MyItem
。
代码:
\documentclass{article}
\usepackage[paperheight=30cm]{geometry}% fit on "one" page
\usepackage{amsmath}
\usepackage{enumitem}
\usepackage{mdframed}
\usepackage{adjustbox}
\newcommand{\TextB}{%
Duis blandit tempus placerat.
Nulla vitae erat ante. Nulla facilisi.
Aliquam tristique interdum suscipit.
Duis posuere orci vel velit suscipit in porttitor purus eleifend.
}%
\newcommand{\TextBFramed}{%
\begin{mdframed}%
\TextB%
\end{mdframed}%
}%
\newcommand{\TextC}{%
\begin{align*}
e &= mc^2\\
F &= ma
\end{align*}
}%
\newcommand{\TextCFramed}{%
\begin{mdframed}%
\TextC%
\end{mdframed}%
}%
\begin{document}\noindent
\textbf{Plain text (works fine):}
\begin{enumerate}[label={(\alph*)}]
\item \TextB
\item \TextC
\end{enumerate}
%
\medskip\noindent
\textbf{Framed text (not so good):}
\begin{enumerate}[label={(\alph*)}]
\item \TextBFramed
\item \TextCFramed
\end{enumerate}
%
\medskip\noindent
\textbf{Using adjustbox yields error:}
%\begin{enumerate}[label={(\alph*)}]
% \item \adjustbox{valign=t}{\TextBFramed}
% \item \adjustbox{valign=t}{\TextCFramed}
%\end{enumerate}
\medskip\noindent
\textbf{Framed text (manual solution):}
\begin{enumerate}[label={(\alph*)}]
\item ~\\[-2\baselineskip] \TextBFramed
\item ~\\[-2\baselineskip] \TextCFramed
\end{enumerate}
\bigskip\noindent
\newcommand{\MyItem}{\item ~\\[-2\baselineskip]}%
\textbf{Mixed text (failed automated solution):}\medskip
\begin{enumerate}[label={(\alph*)}]
\MyItem \TextB
\MyItem \TextC
\MyItem \TextBFramed
\MyItem \TextCFramed
\end{enumerate}
\end{document}
答案1
的输出mdframed
是通过一个简单的 完成的makebox
。目前我还没有更好的主意 ;-)。
随便。要将整个环境对齐到顶部,你可以使用 vtop 修改输出:
\makeatletter
\renewrobustcmd*\mdf@makebox@out[2][\linewidth]{%
\noindent\hb@xt@\z@{%
\noindent\makebox[\dimexpr #1\relax][l]{\vtop{\vskip-\ht\strutbox\vskip-\dp\strutbox\relax#2}}%
\hss}%
}%
\makeatother
完整代码结果为:
\documentclass{article}
\usepackage[paperheight=30cm]{geometry}% fit on "one" page
\usepackage{amsmath}
\usepackage{enumitem}
\usepackage{mdframed}
%\usepackage{adjustbox}
\makeatletter
\renewrobustcmd*\mdf@makebox@out[2][\linewidth]{%
\noindent\hb@xt@\z@{%
\noindent\makebox[\dimexpr #1\relax][l]{\vtop{\vskip-\ht\strutbox\vskip-\dp\strutbox\relax#2}}%
\hss}%
}%
\makeatother
\newcommand{\TextB}{%
Duis blandit tempus placerat.
Nulla vitae erat ante. Nulla facilisi.
Aliquam tristique interdum suscipit.
Duis posuere orci vel velit suscipit in porttitor purus eleifend.
}%
\newcommand{\TextBFramed}{%
\begin{mdframed}%
\TextB%
\end{mdframed}%
}%
\newcommand{\TextC}{%
\begin{align*}
e &= mc^2\\
F &= ma
\end{align*}
}%
\newcommand{\TextCFramed}{%
\begin{mdframed}[skipabove=0pt]%
\TextC%
\end{mdframed}%
}%
\begin{document}
\textbf{Framed text (not so good):}
\begin{enumerate}[label={(\alph*)}]
\item \TextBFramed
\item \TextCFramed
\end{enumerate}
\end{document}