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 default
opçã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.
Alternativamente, pode-se aplicar style=defaultoptions
. Um exemplo mais simples que ilustra o uso de ambas as possibilidades
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}
Responder3
Você pode misturar mdframed
caixas com outras caixas para aninhamento para contornar o problema. Aqui, eu uso a tcolorbox
para 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}
Por diversão, também adiciono algum código para uma tcolorbox
solução completa abaixo, mas não vejo problema em usar uma abordagem mista com mdframed
e tcolorbox
conforme 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}