Cantos arredondados não funcionam em mdf@singleextra usando mdframed com TikZ

Cantos arredondados não funcionam em mdf@singleextra usando mdframed com TikZ

Estou criando novos ambientes emoldurados usando o mdframedpacote (junto com TikZ) com base no exemplo de digressão fornecido em mdframed-example-texsx.tex. Meu código é o seguinte:

\documentclass{scrartcl}

\usepackage{times}

\usepackage{lipsum}
\usepackage[usenames,dvipsnames,svgnames,table]{xcolor}
\usepackage{tikz}
   \usetikzlibrary{calc,arrows,shadows}
\usepackage[framemethod=tikz]{mdframed}


\tikzset{
    title/.style={
      fill=white,
      font=\normalfont,
      text=black,
      anchor=base west,
    },
    contour/.style = {
      line width = 0.6pt,
      draw = black,
      rounded corners = 2ex,
    },
    fakeshadow/.style = {
      line width = 4.5pt,
      draw = white,
    },
}

\newcommand{\definitiontitle}{
  {\scshape \bfseries \Large Definition}
}

\mdfdefinestyle{definition}{%
    singleextra={%
          %% Store (O) in \p1, store (P) in \p2. Now \p1=(\x1,\y1) and \p2=(\x2,\y2). From that, define (Q) = (\x1,\y2).
          \path let \p1=(O), \p2=(P) in (\x1,\y2) coordinate (Q);
          \path let \p1=(O), \p2=(P) in (\x2,\y1) coordinate (R);
          \path let \p1=(O), \p2=(Q) in (\x1,{(\y1+\y2)/2}) coordinate (M);
          \path[contour] (M) |- (P) |- (O) -- (M);
          \node[title, anchor=west, xshift=18pt - 5pt] at (Q) {\definitiontitle};
    },
    firstextra={%
          \path let \p1=(O), \p2=(P) in (\x1,\y2) coordinate (Q);
          \path let \p1=(O), \p2=(P) in (\x2,\y1) coordinate (R);
          \path[contour] (O) -- (Q) -- (P) -- (R);
          \node[title, anchor=west, xshift=18pt - 5pt] at (Q) {\definitiontitle};
          \path[fakeshadow] ($(O)+(1pt,-1.5pt)$) -- ($(R)+(-1pt,-1.5pt)$);  %% Hide the bottom shadow
    },
    secondextra={%
          \path let \p1=(O), \p2=(P) in (\x1,\y2) coordinate (Q);
          \path let \p1=(O), \p2=(P) in (\x2,\y1) coordinate (R);
          \path[contour] (Q) -- (O) -- (R) -- (P);
    },
    middleextra={%
          \path let \p1=(O), \p2=(P) in (\x1,\y2) coordinate (Q);
          \path let \p1=(O), \p2=(P) in (\x2,\y1) coordinate (R);
          \path[contour] (O) -- (Q);
          \path[contour] (P) -- (R);
          \path[fakeshadow] ($(O)+(1pt,-1.5pt)$) -- ($(R)+(-1pt,-1.5pt)$);  %% Hide the bottom shadow
    },
    align=center,
    backgroundcolor=yellow,
    userdefinedwidth=.9\textwidth,
    middlelinewidth=1.7em,middlelinecolor=white,
    hidealllines=true,topline=true,
    innertopmargin=6pt,
    innerbottommargin=18pt,
    innerleftmargin=18pt,
    innerrightmargin=18pt,
    splitbottomskip=8pt,
    splittopskip=16pt,
    roundcorner=2ex,
    shadow=true,
    shadowsize=5,
    shadowcolor=black!40,
    %% Experimental
    needspace=3em,
    ignorelastdescenders=true,
}



\begin{document}

\lipsum[3]

\vspace{1\baselineskip}
\begin{mdframed}[style=definition]
    \lipsum[1]
\end{mdframed}

\vspace{1\baselineskip}
\lipsum[3]

\vspace{1\baselineskip}
\begin{mdframed}[style=definition]
    \lipsum[1-2]
\end{mdframed}

\vspace{1\baselineskip}
\lipsum[3]

\vspace{1\baselineskip}
\begin{mdframed}[style=definition]
    \lipsum[1-8]
\end{mdframed}

\end{document}


Atualmente estou usando o TikZ para colocar um título personalizado e desenhar a moldura. Isso é necessário para usar o apropriado middlelinewidthpara compensar a altura do título, para que o mdframed saiba onde dividir. No entanto, também estou usando cantos arredondados e é aí que acontece o problema geral.

Como aponta Marco Daniel emesta postagem, é importante usar o código

    hidealllines=true,topline=true,


Entretanto, using hidealllines=truetem um efeito inesperado em \mdf@singleextra, ou seja, os cantos arredondados desaparecem e uma caixa cheia é renderizada. Isso não acontece quando o quadro é dividido (ou quando hidealllines=truenão é usado, mas a altura não pode ser calculada corretamente), conforme mostrado na saída:

saída

Alguma ideia de por que isso acontece apenas no \mdf@singleextrae como consertar?

Responder1

O problema ocorre porque o fundo é desenhado sem cantos arredondados se você definir a opção topline=true. No entanto, você pode hackear o teste:

\makeatletter
\let\mdf@putbox@single@orig\mdf@putbox@single
\mdfapptodefinestyle{definition}{%
  settings={%
        \def\mdf@putbox@single{%
                   \let\mdf@test@t\@gobbletwo
                   \let\mdf@test@noline\@firstoftwo
                 \mdf@putbox@single@orig
            }%
   }%
}
\makeatother

Após o hack você deve expandir a opção singlextrapela seguinte linha:

\path[draw=white,line width=1.7em,overlay] (O|-P) -- (P);

para desenhar um fundo branco do seu título.

O canto estranho da segunda página não pode ser reproduzido.

Aqui a saída:

insira a descrição da imagem aqui

Aqui o código completo:

\documentclass{scrartcl}

\usepackage{times}

\usepackage{lipsum}
\usepackage[usenames,dvipsnames,svgnames,table]{xcolor}
\usepackage{tikz}
   \usetikzlibrary{calc,arrows,shadows}
\usepackage[framemethod=tikz]{mdframed}


\tikzset{
    title/.style={
      fill=white,
      font=\normalfont,
      text=black,
      anchor=base west,
    },
    contour/.style = {
      line width = 0.6pt,
      draw = black,
      rounded corners = 2ex,
    },
    fakeshadow/.style = {
      line width = 4.5pt,
      draw = white,
    },
}

\newcommand{\definitiontitle}{
  {\scshape \bfseries \Large Definition}
}

\mdfdefinestyle{definition}{%
    singleextra={%
          %% Store (O) in \p1, store (P) in \p2. Now \p1=(\x1,\y1) and \p2=(\x2,\y2). From that, define (Q) = (\x1,\y2).
          \path let \p1=(O), \p2=(P) in (\x1,\y2) coordinate (Q);
          \path let \p1=(O), \p2=(P) in (\x2,\y1) coordinate (R);
          \path let \p1=(O), \p2=(Q) in (\x1,{(\y1+\y2)/2}) coordinate (M);
         \path[draw=white,line width=1.7em,overlay] (O|-P) -- (P);
          \path[contour,] (M) |- (P) |- (O) -- (M);
          \node[title, anchor=west, xshift=18pt - 5pt] at (Q) {\definitiontitle};
    },
    firstextra={%
          \path let \p1=(O), \p2=(P) in (\x1,\y2) coordinate (Q);
          \path let \p1=(O), \p2=(P) in (\x2,\y1) coordinate (R);
          \path[contour] (O) -- (Q) -- (P) -- (R);
          \node[title, anchor=west, xshift=18pt - 5pt] at (Q) {\definitiontitle};
          \path[fakeshadow] ($(O)+(1pt,-1.5pt)$) -- ($(R)+(-1pt,-1.5pt)$);  %% Hide the bottom shadow
    },
    secondextra={%
          \path let \p1=(O), \p2=(P) in (\x1,\y2) coordinate (Q);
          \path let \p1=(O), \p2=(P) in (\x2,\y1) coordinate (R);
          \path[contour] (Q) -- (O) -- (R) -- (P);
    },
    middleextra={%
          \path let \p1=(O), \p2=(P) in (\x1,\y2) coordinate (Q);
          \path let \p1=(O), \p2=(P) in (\x2,\y1) coordinate (R);
          \path[contour] (O) -- (Q);
          \path[contour] (P) -- (R);
          \path[fakeshadow] ($(O)+(1pt,-1.5pt)$) -- ($(R)+(-1pt,-1.5pt)$);  %% Hide the bottom shadow
    },
    align=center,
    backgroundcolor=yellow,
    userdefinedwidth=.9\textwidth,
    middlelinewidth=1.7em,middlelinecolor=white,
    hidealllines=true,topline=true,
    innertopmargin=6pt,
    innerbottommargin=18pt,
    innerleftmargin=18pt,
    innerrightmargin=18pt,
    splitbottomskip=8pt,
    splittopskip=16pt,
    roundcorner=2ex,
%    shadow=true,
    shadowsize=5,
    shadowcolor=black!40,
    %% Experimental
    needspace=3em,
    ignorelastdescenders=true,
}




\makeatletter
\let\mdf@putbox@single@orig\mdf@putbox@single
\mdfapptodefinestyle{definition}{%
  settings={%
        \def\mdf@putbox@single{%
                   \let\mdf@test@t\@gobbletwo
                   \let\mdf@test@noline\@firstoftwo
                 \mdf@putbox@single@orig
            }%
   }%
}
\makeatother


\begin{document}

\lipsum[3]

\vspace{1\baselineskip}
\begin{mdframed}[style=definition]
    \lipsum[1]
\end{mdframed}

\vspace{1\baselineskip}
\lipsum[3]

\vspace{1\baselineskip}
\begin{mdframed}[style=definition]
    \lipsum[1-2]
\end{mdframed}

\vspace{1\baselineskip}
\lipsum[3]

\vspace{1\baselineskip}
\begin{mdframed}[style=definition]
    \lipsum[1-8]
\end{mdframed}

\end{document}

informação relacionada