[Tex/LaTex] mdframed: Put a line below the frame title and give it a shaded background

framedmdframed

I like to use mdframed to make a framed environment with an optional title. The title has to be in its own box with a gray background, like this:
example

I hope that this is possible.

MWE

\documentclass{article}

\usepackage[framemethod=TikZ]{mdframed}
\newenvironment{Frame}[1][]{%
    \begin{mdframed}[%
        frametitle={#1},
        skipabove=\baselineskip plus 2pt minus 1pt,
        skipbelow=\baselineskip plus 2pt minus 1pt,
        linewidth=0.5pt,
    ]%
}{%
    \end{mdframed}
}

\begin{document}
Text
\begin{Frame}[with Title]
    Text
\end{Frame}
Text
\begin{Frame}% no Title
    Text
\end{Frame}
Text
\end{document}

I like to use mdframed instead of the package and hack to make the picture above because it is more flexible 🙂

Best Answer

Update

The version 1.2 of mdframed has new possibilities for setting the frame title. Based of your request you can simple use the option frametitlerule=true and frametitlebackgroundcolor=gray!20. The current version is available at github.

\documentclass{article}

\usepackage[framemethod=TikZ]{mdframed}
\newenvironment{Frame}[1][]{%
    \begin{mdframed}[%
        frametitle={#1},
        skipabove=\baselineskip plus 2pt minus 1pt,
        skipbelow=\baselineskip plus 2pt minus 1pt,
        linewidth=0.5pt,
        frametitlerule=true,
        frametitlebackgroundcolor=gray!30
    ]%
}{%
    \end{mdframed}
}

\begin{document}
Text
\begin{Frame}[with Title]
    Text
\end{Frame}
Text
\begin{Frame}% no Title
    Text
\end{Frame}
Text
\end{document}

enter image description here


By using tikz to modify the header here one suggestion.

You have to modify the command \mdframetitleenv to influence the output. The package itself controls whether the frame title is empty or not.

\documentclass{article}

\usepackage[framemethod=TikZ]{mdframed}
\makeatletter
%ORIGINAL
%\providecommand*\mdframedtitleenv[1]{%
%  \@afterindentfalse
%   {\parindent \z@
%         \setlength{\parfillskip}{\z@ plus 1fil}%
%         \mdraggedtitle\nobreak\mdf@frametitlefont#1\relax%
%    \par}%
%  \@afterheading}
\tikzstyle{mybox} = [draw=black, %
                    fill=gray!20,%
                    line width=\mdf@middlelinewidth@length,
                    rectangle,
                    inner sep=0pt,
                    inner ysep=0.333em,
                    minimum height=1cm,
                    text width = \linewidth
                                 +\mdf@innerleftmargin@length
                                 +\mdf@innerrightmargin@length
                                 +\mdf@linewidth@length,
                    align=left,
                    ]
\renewcommand*{\mdframedtitleenv}[1]{%
\vspace*{\dimexpr-\mdf@innertopmargin@length-\mdf@linewidth@length\relax}%
\makebox[0pt][l]{%
\hspace*{\dimexpr-\mdf@innerleftmargin@length-\mdf@linewidth@length\relax}%
\begin{tikzpicture}[remember picture]
\node [mybox]{\hspace*{\mdf@innerrightmargin@length}%
   \parbox{\linewidth}{\mdf@frametitlefont#1\relax}};%
\end{tikzpicture}%
}%
\par
\@afterheading
}%
\newenvironment{Frame}[1][]{%
    \begin{mdframed}[%
        frametitle={#1},
        skipabove=\baselineskip plus 2pt minus 1pt,
        skipbelow=\baselineskip plus 2pt minus 1pt,
        linewidth=0.5pt,
    ]%
}{%
    \end{mdframed}
}

\begin{document}
Text
\begin{Frame}[with Title]
    Text
\end{Frame}
Text

\begin{Frame}[with Title with Title with Title with Title with Title with Title with Title with Title with Title with Title with Title with Title with Title with Title with Title with Title]
    Text
\end{Frame}

Text
\begin{Frame}% no Title
    Text
\end{Frame}
Text
\end{document}
Related Question