Vererbte Eigenschaften bei verschachtelten Frames (mdframed und tikz)

Vererbte Eigenschaften bei verschachtelten Frames (mdframed und tikz)

Beim Verschachteln einer mdframed-Umgebung in einer mdframed-Umgebung, die tikz verwendet, scheint es, dass die verschachtelte mdframed-Umgebung viele der Eigenschaften der Umgebung übernimmt, in die sie nicht verschachtelt wird, und ihre eigenen Eigenschaften ersetzt. Dazu gehört, nun ja, so ziemlich alles, einschließlich Knoten, Hintergrundfarbe, Breite (und Farbe) der äußeren Linien und die Rundung der Ecken, außer in dem Fall, in dem die verschachtelte mdframed-Umgebung auch tikz verwendet, in welchem ​​Fall nur das Knotenproblem besteht. Dies wird unten anhand mehrerer verschiedener Beispiele veranschaulicht:

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

Das Problem besteht weiterhin, unabhängig davon, ob Knoten vorhanden sind oder nicht (oder welche Optionen ihnen gegeben werden, d. h. \singleextra, \doubleextra usw. machen keinen Unterschied). Das Problemnichttritt im umgekehrten Szenario mit einer normalen MDFramed-Umgebung auf, die eine MDFramed-Umgebung mit Tikz enthält.

Gibt es eine Möglichkeit, die verschachtelte MDFramed-Umgebung daran zu hindern, die Eigenschaften aus der Umgebung zu übernehmen, in der sie enthalten ist? Gibt es insbesondere eine Möglichkeit, sicherzustellen, dass die Knoten nicht wiederholt werden, da dies auch die Nummerierung durcheinander bringt?

Antwort1

Fügen Sie die Option einfach defaulthinzu simplestyle:

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

Dadurch werden die Stile zu Beginn auf die Standardeinstellung zurückgesetzt.

Bildbeschreibung hier eingeben


Alternativ kann man anwenden style=defaultoptions. Ein einfacheres Beispiel, das die Verwendung beider Möglichkeiten veranschaulicht

Bildbeschreibung hier eingeben

Code:

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

Antwort2

Es gibt vielleicht einen Weg hinein mdframed, aber ich kenne ihn nicht. Was ich hier jedoch gemacht habe, war, die innere Box außerhalb der äußeren Umgebung zu erstellen, sie zu speichern und sie bei Bedarf einzufügen.

BEARBEITET, um zu zeigen, wie mehrere [benannte] innere Boxen vor dem Aufruf der äußeren Box gespeichert werden können (in meiner ursprünglichen Antwort wurde eine temporäre Box verwendet).

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

Bildbeschreibung hier eingeben

Antwort3

Um das Problem zu umgehen , können Sie mdframedKisten mit anderen Kisten zum Verschachteln mischen. Hier verwende ich ein tcolorboxfür die verschachtelte Kiste.

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

Bildbeschreibung hier eingeben

Aus Spaß füge ich tcolorboxunten auch etwas Code für eine vollständige Lösung hinzu, aber ich sehe kein Problem darin, einen gemischten Ansatz mit mdframedund tcolorboxwie oben beschrieben zu verwenden.

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

verwandte Informationen