Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

I would like to obtain a custom frame, which is different from the ones given by mdframed.

Here is the image comes from the package fancytikzposter, which consists in a minipage inside a tikzpicture environment.

This works great, but I can't create a figure in this frame since it is inside a tikzpicture environment.

Is there some solution for this, or any possibility to construct it outside the TikZ environment ?

Ideally, I am looking for something in the following form :

\begin{block}{Block title}
\end{block}

Package

Here is (the graphical part of) the code producing this frame

  %% the content of the block
  \draw let \p1=($(#4)-(2.2,0)$),\p2=($(0,\blocktitleheight cm)-(0,0.5cm)$) in
  node[draw, anchor=north, color=blocktitlefillcolor, fill=blockfillcolor,
  text=blocktextcolor, framefour, rectangle]
  (box) at #1 {
    \begin{minipage}{\x1}
      \vspace{\y2}

      \color{blocktextcolor}
      #3
    \end{minipage}};

  %% the title of the block
  \begin{scope}
    \clip[rounded corners=20] ($(box.south west)+(0.01,0.01)$) rectangle
    ($(box.north east)-(0.01,0.01)$);

    \draw let \p1=($(#4)-(3.2,0)$),\p2=($(0,\blocktitleheight cm)-(0,0.4cm)$)%
    in node[anchor=bottom right corner, draw=none, %
    bottom color=blocktitlefillcolor, top color=blocktitlefillcolor!85!,
    text=blocktitletextcolor, rounded corners=20, inner xsep=1cm, %
    minimum height=\y2, minimum width=\x1, %
    shape=trapezium, shape border rotate=180, trapezium stretches=true]
    (boxtitle) at ($(box.north west)+(1.5,0)$) {\bf\LARGE #2}

    %% fading on top
    [preaction={path fading=south,fill=blocktitlefillcolor,opacity=.4},draw=none]
    ($(boxtitle.bottom right corner) - (3,\y2)$) rectangle
    ($(boxtitle.bottom left corner)+(3,0)$);
  \end{scope}


  %% decorative drawing on the title
  \begin{scope}[even odd rule]
    \clip[rounded corners=20] ($(boxtitle.bottom right corner)-(-0.2,0.2)$) --
    ($(boxtitle.bottom left corner) -(0.2,0.2)$) -- (boxtitle.top left corner)
    -- (boxtitle.top right corner) -- cycle %
    (box.south west) rectangle (box.north east) ;

    \draw[draw=none, rounded corners=20, %
    bottom color=blocktitlefillcolor, top color=blocktitlefillcolor!85!]
    ($(boxtitle.bottom right corner)-(0.5,0)$) --
    (boxtitle.bottom right corner) -- (boxtitle.top right corner) --
    ($(boxtitle.bottom right corner)+(3,0)$) --
    ($(boxtitle.bottom right corner)-(0.5,0)$)

    ($(boxtitle.bottom left corner)+(0.5,0)$) --
    (boxtitle.bottom left corner) -- (boxtitle.top left corner) --
    ($(boxtitle.bottom left corner)-(3,0)$) --
    ($(boxtitle.bottom left corner)+(0.5,0)$) ;
  \end{scope}

}
share|improve this question
2  
Is the width of the title variable? –  Marco Daniel Jun 23 '13 at 14:11
    
I don't require it to be a constant. This was just an example frame ;) –  Laurent Jun 23 '13 at 14:17
    
Not sure I understand the " I can't create a figure in this frame since it is inside a tikzpicture" comment. Also code snippets are useful in explanations, but it is always best to compose a fully compilable MWE that sets up the problem including the \documentclass and the appropriate packages so that those trying to help don't have to recreate it. –  Peter Grill Jun 23 '13 at 15:28

1 Answer 1

up vote 20 down vote accepted

Here's one possibility using tcolorbox:

\documentclass{article}
\usepackage[svgnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{shadows,calc}
\usepackage{tcolorbox}
\tcbuselibrary{skins,theorems,breakable}
\usepackage{lipsum}

\definecolor{myblue}{RGB}{40,96,139}


\tcbset{
mybox/.style={
  breakable,
  enhanced standard,
  boxrule=0.4pt,titlerule=-0.2pt,drop fuzzy shadow,
  width=\linewidth,
  title style={top color=myblue!30,bottom color=myblue!0.5},
  overlay unbroken and first={
    \path[fill=myblue]
    ([xshift=5pt,yshift=-\pgflinewidth]frame.north west) to[out=0,in=180] ([xshift=20pt,yshift=-5pt]title.south west) -- ([xshift=-20pt,yshift=-5pt]title.south east) to[out=0,in=180] ([xshift=-5pt,yshift=-\pgflinewidth]frame.north east) -- cycle;
  },
  fonttitle=\Large\bfseries\sffamily,
  fontupper=\sffamily,
  fontlower=\sffamily,
  before=\par\medskip\noindent,
  after=\par\medskip,
  center title,
  toptitle=3pt,
  top=11pt,topsep at break=-5pt,
  colback=white
}}

\newtcolorbox{MyBlock}[2][\linewidth]{mybox,width=#1,title=#2}

\begin{document}

\begin{MyBlock}{Some Variable Width Block}
\lipsum[4]
\end{MyBlock}

\begin{MyBlock}[.5\linewidth]{Some Title}
\lipsum[4]
\end{MyBlock}

\end{document}

enter image description here

The MyBlock environment has a mandatory argument for the title, and an optional one for the width (default width=\linewidth).

And here's an idea of the same environment, but using this time the mdframed package (in its current form, only titles spanning no more than one line are allowed):

\documentclass{article}
\usepackage[latin]{babel}
\usepackage[svgnames]{xcolor}
\usepackage[framemethod=tikz]{mdframed}
\usepackage{tikz}
\usetikzlibrary{shadows,calc}
\usepackage{lipsum}

\definecolor{myblue}{RGB}{40,96,139}

\makeatletter
\newenvironment{MiBlock}[2][\linewidth]
  {\begin{mdframed}[
  skipabove=\topsep,
  skipbelow=\topsep,
  roundcorner=5pt,
  shadow=true,
  shadowsize=4pt,
  frametitle=\phantom{#2},
  frametitlebelowskip=15pt,
  font=\sffamily,
  innerleftmargin=12pt,
  innerrightmargin=12pt,
  frametitlefont=\Large\sffamily\bfseries\color{white},
  singleextra={
  \path[top color=myblue!30,bottom color=myblue!0.5,rounded corners]
    ([xshift=\pgflinewidth,yshift=-\pgflinewidth]O|-P) rectangle
    ([xshift=-\pgflinewidth,yshift=-20pt]P) -- cycle;
  \path[fill=myblue]
    ([xshift=5pt,yshift=-\pgflinewidth]O|-P.north west) to[out=0,in=180]
    ([xshift=20pt,yshift=-25pt]O|-P.north west) --
    ([xshift=-20pt,yshift=-25pt]P.south east) to[out=0,in=180]
    ([xshift=-5pt,yshift=-\pgflinewidth]P.north east) -- cycle;
  \path let \p1=(P), \p2= (O) in 
    node at ([yshift=-12pt]0.5*\x1+0.5*\x2,\y1) {\parbox{\dimexpr\mdf@userdefinedwidth@length-40pt\relax
}{\centering\mdf@frametitlefont#2}};
  },
  userdefinedwidth=#1]}
  {\end{mdframed}}
\makeatother

\begin{document}

\begin{MiBlock}{Some Variable Width Block}
\lipsum[2]
\end{MiBlock}

\begin{MiBlock}[0.5\linewidth]{Some Title}
\lipsum[2]
\end{MiBlock}

\end{document}

enter image description here

share|improve this answer
    
I need your path ;-) –  Marco Daniel Jun 23 '13 at 16:53
    
@MarcoDaniel ooh another nice addition, maybe! –  percusse Jun 23 '13 at 17:22
    
@user81566: You need an update of your TeX distribution. –  Marco Daniel Jun 23 '13 at 17:28
1  
@user81566 I've made some updated to my answer. –  Gonzalo Medina Jun 23 '13 at 18:35
2  
@GonzaloMedina Very nice solution! I just edited some lines of the tcolorbox example (if the peer reviewer approves it) to remove some spaces visible in high resolution; I did not exchange the picture since it's quite the same. I like this example and its solution very much :-) –  Thomas F. Sturm Jun 24 '13 at 12:26

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.