Propriedades hereditárias com frames aninhados (mdframed e tikz)

Propriedades hereditárias com frames aninhados (mdframed e tikz)

Ao aninhar um ambiente mdframed em um ambiente mdframed que usa tikz, parece que o ambiente mdframed aninhado assume muitas das propriedades do ambiente que não está sendo aninhado, substituindo suas próprias propriedades. Isso inclui, bem, praticamente tudo, incluindo nós, cor de fundo, largura da linha externa (e cor) e arredondamento de cantos, exceto no caso em que o ambiente mdframed aninhado também usa tikz, caso em que existe apenas o problema do nó . Isso é ilustrado com vários exemplos diferentes abaixo:

\documentclass{article}
\usepackage{tikz}
\usepackage[framemethod=tikz]{mdframed}

%%%%%%%%%%%%%%%%% mdframed style with node

\tikzset{tetregris/.style =
{draw=gray, thick, fill=white, shading = exampletitle, %
text=darkgray, rectangle, rounded corners, right,minimum height=.7cm}}
\pgfdeclarehorizontalshading{examplebackground}{100bp}
{color(0bp)=(black!2); color(100bp)=(teal!30)}
\pgfdeclarehorizontalshading{exampletitle}{100bp}
{color(0bp)=(black!2);color(100bp)=(purple!20)}
\newcounter{example}
\renewcommand*\theexample{Example~\arabic{example}}
\makeatletter
\mdfdefinestyle{examplestyle}{%
outerlinewidth=1em,outerlinecolor=white,%
leftmargin=-1em,rightmargin=-1em,%
middlelinewidth=1.2pt,roundcorner=5pt,linecolor=gray,
apptotikzsetting={\tikzset{mdfbackground/.append style ={%
shading = examplebackground}}},
innertopmargin=1.2\baselineskip,
skipabove={\dimexpr0.5\baselineskip+\topskip\relax},
skipbelow={-1em},
needspace=\baselineskip,
frametitlefont=\sffamily\scshape,
settings={\global\stepcounter{example}},
singleextra={%
\node[tetregris,xshift=-3cm] at (P) %
{~\mdf@frametitlefont{\theexample}\hbox{~}};
},
firstextra={%
\node[tetregris,xshift=-3cm] at (P) %
{~\mdf@frametitlefont{\theexample}\hbox{~}};
},
}
\makeatother

%%%%%%%%%%%%%%%%%% simple mdframed style

\global\mdfdefinestyle{simplestyle}{%
linecolor=red,linewidth=3pt,%
leftmargin=1cm,rightmargin=1cm
}

\begin{document}

\begin{mdframed}[style=examplestyle]
blah
\begin{mdframed}[style=simplestyle]
blah
\end{mdframed}
blah
\end{mdframed}

\begin{mdframed}[style=simplestyle]
blah
\end{mdframed}

\end{document}

O problema persiste quer haja ou não nós (ou quais opções eles recebem, ou seja, \singleextra, \doubleextra, etc. não fazem diferença). O problemanãoocorrem no cenário oposto com um ambiente mdframed normal contendo um ambiente mdframed usando tikz.

Existe alguma maneira de impedir que o ambiente mdframed aninhado obtenha as propriedades do ambiente em que está contido? Em particular, existe alguma maneira de garantir que os nós não se repitam, pois isso também atrapalha a numeração?

Responder1

Basta adicionar a defaultopção ao simplestyle:

\global\mdfdefinestyle{simplestyle}{%
    default,
    linecolor=red,linewidth=3pt,%
    leftmargin=1cm,rightmargin=1cm
}

Isso redefine os estilos para suas configurações padrão no início.

insira a descrição da imagem aqui


Alternativamente, pode-se aplicar style=defaultoptions. Um exemplo mais simples que ilustra o uso de ambas as possibilidades

insira a descrição da imagem aqui

Código:

\documentclass{article}
\usepackage{xcolor}
\usepackage[framemethod=Tikz]{mdframed}
\mdfsetup{middlelinecolor=red, middlelinewidth=2pt, backgroundcolor=red!10, roundcorner=10pt}

\listfiles
\begin{document}
    \noindent
    Without \verb|default| option:
    \begin{mdframed} Text\par Text
    \end{mdframed}
    % --------------------------------------
    With \verb|default| option applied:
    \begin{mdframed}[default] Text \par Text
    \end{mdframed}
    % --------------------------------------
    With \verb|style=defaultoptions| option applied:
    \begin{mdframed}[style=defaultoptions] Text\par Text
    \end{mdframed}
\end{document}

Responder2

Pode haver uma maneira de entrar mdframed, mas eu não sei. No entanto, o que fiz aqui foi criar a caixa interna fora do ambiente externo, salvei-a e coloquei-a quando necessário.

EDITADO para mostrar como várias caixas internas [nomeadas] podem ser salvas antes da invocação da caixa externa (minha resposta inicial usou uma caixa temporária).

\documentclass{article}
\usepackage{tikz}
\usepackage[framemethod=tikz]{mdframed}

%%%%%%%%%%%%%%%%% mdframed style with node

\tikzset{tetregris/.style =
{draw=gray, thick, fill=white, shading = exampletitle, %
text=darkgray, rectangle, rounded corners, right,minimum height=.7cm}}
\pgfdeclarehorizontalshading{examplebackground}{100bp}
{color(0bp)=(black!2); color(100bp)=(teal!30)}
\pgfdeclarehorizontalshading{exampletitle}{100bp}
{color(0bp)=(black!2);color(100bp)=(purple!20)}
\newcounter{example}
\renewcommand*\theexample{Example~\arabic{example}}
\makeatletter
\mdfdefinestyle{examplestyle}{%
outerlinewidth=1em,outerlinecolor=white,%
leftmargin=-1em,rightmargin=-1em,%
middlelinewidth=1.2pt,roundcorner=5pt,linecolor=gray,
apptotikzsetting={\tikzset{mdfbackground/.append style ={%
shading = examplebackground}}},
innertopmargin=1.2\baselineskip,
skipabove={\dimexpr0.5\baselineskip+\topskip\relax},
skipbelow={-1em},
needspace=\baselineskip,
frametitlefont=\sffamily\scshape,
settings={\global\stepcounter{example}},
singleextra={%
\node[tetregris,xshift=-3cm] at (P) %
{~\mdf@frametitlefont{\theexample}\hbox{~}};
},
firstextra={%
\node[tetregris,xshift=-3cm] at (P) %
{~\mdf@frametitlefont{\theexample}\hbox{~}};
},
}
\makeatother

%%%%%%%%%%%%%%%%%% simple mdframed style

\global\mdfdefinestyle{simplestyle}{%
linecolor=red,linewidth=3pt,%
leftmargin=1cm,rightmargin=1cm
}

\begin{document}
% SAVE MULTIPLE INNER BOXES IN ADVANCE
\newsavebox\boxA
\savebox\boxA{\vbox{\begin{mdframed}[style=simplestyle]BLAH-A\end{mdframed}}}
\newsavebox\boxB
\savebox\boxB{\vbox{\begin{mdframed}[style=simplestyle]BLAH-B\end{mdframed}}}

\begin{mdframed}[style=examplestyle]
\parindent=0pt
blah\par
\usebox{\boxA}
blah\par
\usebox{\boxB}
blah
\end{mdframed}
\end{document}

insira a descrição da imagem aqui

Responder3

Você pode misturar mdframedcaixas com outras caixas para aninhamento para contornar o problema. Aqui, eu uso a tcolorboxpara a caixa aninhada.

\documentclass{article}
\usepackage{tikz}
\usepackage[framemethod=tikz]{mdframed}
\usepackage[skins,breakable]{tcolorbox}

%%%%%%%%%%%%%%%%% mdframed style with node

\tikzset{tetregris/.style =
{draw=gray, thick, fill=white, shading = exampletitle, %
text=darkgray, rectangle, rounded corners, right,minimum height=.7cm}}
\pgfdeclarehorizontalshading{examplebackground}{100bp}
{color(0bp)=(black!2); color(100bp)=(teal!30)}
\pgfdeclarehorizontalshading{exampletitle}{100bp}
{color(0bp)=(black!2);color(100bp)=(purple!20)}
\newcounter{example}
\renewcommand*\theexample{Example~\arabic{example}}
\makeatletter
\mdfdefinestyle{examplestyle}{%
outerlinewidth=1em,outerlinecolor=white,%
leftmargin=-1em,rightmargin=-1em,%
middlelinewidth=1.2pt,roundcorner=5pt,linecolor=gray,
apptotikzsetting={\tikzset{mdfbackground/.append style ={%
shading = examplebackground}}},
innertopmargin=1.2\baselineskip,
skipabove={\dimexpr0.5\baselineskip+\topskip\relax},
skipbelow={-1em},
needspace=\baselineskip,
frametitlefont=\sffamily\scshape,
settings={\global\stepcounter{example}},
singleextra={%
\node[tetregris,xshift=-3cm] at (P) %
{~\mdf@frametitlefont{\theexample}\hbox{~}};
},
firstextra={%
\node[tetregris,xshift=-3cm] at (P) %
{~\mdf@frametitlefont{\theexample}\hbox{~}};
},
}
\makeatother

%%%%%%%%%%%%%%%%%% simple style
\tcbset{
  simplestyle/.style={%
    sharp corners,
    boxsep=0pt,left skip=1cm,right skip=1cm,boxrule=3pt,
    colframe=red,colback=white
  }
}

\begin{document}

\begin{mdframed}[style=examplestyle]
  blah
  \begin{tcolorbox}[simplestyle]
    blah
  \end{tcolorbox}
  \noindent blah
\end{mdframed}

\begin{tcolorbox}[simplestyle]
  blah
\end{tcolorbox}

\end{document}

insira a descrição da imagem aqui

Por diversão, também adiciono algum código para uma tcolorboxsolução completa abaixo, mas não vejo problema em usar uma abordagem mista com mdframede tcolorboxconforme descrito acima.

\documentclass{article}
\usepackage[skins,breakable]{tcolorbox}

\pgfdeclarehorizontalshading{examplebackground}{100bp}
  {color(0bp)=(black!2); color(100bp)=(teal!30)}
\pgfdeclarehorizontalshading{exampletitle}{100bp}
  {color(0bp)=(black!2);color(100bp)=(purple!20)}
\newcounter{example}
\renewcommand*\theexample{Example~\arabic{example}}

\tcbset{
  examplestyle/.style={%
    enhanced,breakable,arc=5pt,beforeafter skip=1em,
    colframe=gray,interior style={shading=examplebackground},
    fonttitle=\sffamily\scshape,coltitle=darkgray,
    step=example,
    title=\theexample,
    attach boxed title to top right={xshift=-6mm,yshift*=-\tcboxedtitleheight/2},
    boxed title style={enhanced,size=fbox,arc=3pt,boxrule=0.3mm,boxsep=2mm,
      interior style={shading=exampletitle}},
  },
  simplestyle/.style={%
    sharp corners,
    boxsep=0pt,left skip=1cm,right skip=1cm,boxrule=3pt,
    colframe=red,colback=white
  }
}

\begin{document}

\begin{tcolorbox}[examplestyle]
  blah
  \begin{tcolorbox}[simplestyle]
    blah
  \end{tcolorbox}
  \noindent blah
\end{tcolorbox}

\begin{tcolorbox}[simplestyle]
  blah
\end{tcolorbox}

\end{document}

informação relacionada