Propiedades hereditarias con marcos anidados (mdframed y tikz)

Propiedades hereditarias con marcos anidados (mdframed y tikz)

Al anidar un entorno mdframed en un entorno mdframed que usa tikz, parece que el entorno mdframed anidado adquiere muchas de las propiedades del entorno en el que no está anidado, reemplazando sus propias propiedades. Estos incluyen, bueno, prácticamente todo, incluidos los nodos, el color de fondo, el ancho (y el color) de la línea exterior y el redondeo de las esquinas, excepto en el caso en que el entorno mdframed anidado también usa tikz, en cuyo caso solo existe el problema del nodo. . Esto se ilustra con varios ejemplos diferentes a continuación:

\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}

El problema persiste independientemente de si hay nodos o no (o qué opciones se les dan, es decir, \singleextra, \doubleextra, etc. no hacen una diferencia). La cuestiónno esocurrir en el escenario opuesto con un entorno mdframed normal que contiene un entorno mdframed usando tikz.

¿Hay alguna forma de evitar que el entorno mdframed anidado tome las propiedades del entorno en el que está contenido? En particular, ¿hay alguna forma de garantizar que los nodos no se repitan, ya que esto también altera la numeración?

Respuesta1

Simplemente agregue la defaultopción a simplestyle:

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

Esto restablece los estilos a su configuración predeterminada al principio.

ingrese la descripción de la imagen aquí


Alternativamente se puede aplicar style=defaultoptions. Un ejemplo más sencillo que ilustra el uso de ambas posibilidades.

ingrese la descripción de la imagen aquí

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}

Respuesta2

Puede que haya una manera de entrar mdframed, pero no la conozco. Sin embargo, lo que hice aquí fue crear la caja interior fuera del entorno exterior, la guardé y la metí cuando fue necesario.

EDITADO para mostrar cómo se pueden guardar varios cuadros internos [nombrados] antes de la invocación del cuadro externo (mi respuesta inicial usó un cuadro temporal).

\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}

ingrese la descripción de la imagen aquí

Respuesta3

Puede mezclar mdframedcajas con otras cajas para anidar y evitar el problema. Aquí uso a tcolorboxpara la caja anidada.

\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}

ingrese la descripción de la imagen aquí

Por diversión, también agrego algo de código para una tcolorboxsolución completa a continuación, pero no veo ningún problema en usar un enfoque mixto con mdframedy tcolorboxcomo se describe anteriormente.

\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}

información relacionada