将 \item 标签与 mdframed 框顶部对齐

将 \item 标签与 mdframed 框顶部对齐

默认情况下,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框时应用,否则不应用。另外,我如何确定乘数的值?请参阅混合文本(自动解决方案失败)部分。


笔记:


代码:

\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}

相关内容