При вложении среды mdframed в среду mdframed, которая использует tikz, кажется, что вложенная среда mdframed берет на себя многие свойства среды, в которую не вкладывается, заменяя ее собственные свойства. К ним относятся, ну, почти все, включая узлы, цвет фона, ширину внешней линии (и цвет) и скругление углов, за исключением случая, когда вложенная среда mdframed также использует tikz, в этом случае существует только проблема с узлами. Это проиллюстрировано несколькими различными примерами ниже:
\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}
Проблема сохраняется независимо от того, есть ли узлы или нет (или какие параметры им предоставлены, например, \singleextra, \doubleextra и т. д. не имеют значения).непроисходит противоположный сценарий с обычной средой mdframed, содержащей среду mdframed, использующую tikz.
Есть ли способ не дать вложенной среде mdframed брать свойства из среды, в которой она содержится? В частности, есть ли способ гарантировать, что узлы не будут повторяться, поскольку это также нарушает нумерацию?
решение1
Просто добавьте default
опцию в simplestyle
:
\global\mdfdefinestyle{simplestyle}{%
default,
linecolor=red,linewidth=3pt,%
leftmargin=1cm,rightmargin=1cm
}
Это сбрасывает стили к настройкам по умолчанию, которые были в начале.
В качестве альтернативы можно применить style=defaultoptions
. Более простой пример, иллюстрирующий использование обеих возможностей
Код:
\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}
решение2
Может быть, есть способ mdframed
, но я его не знаю. Однако, то, что я сделал здесь, это создал внутреннюю коробку вне внешней среды, сохранил ее и вставил ее, когда это было необходимо.
ОТРЕДАКТИРОВАНО, чтобы показать, как можно сохранить несколько [именованных] внутренних ящиков до вызова внешнего ящика (в моем первоначальном ответе использовался один временный ящик).
\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}
решение3
Вы можете смешивать mdframed
коробки с другими коробками для вложения, чтобы обойти эту проблему. Здесь я использую a tcolorbox
для вложенной коробки.
\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}
Ради интереса я также добавляю немного кода для полного tcolorbox
решения ниже, но я не вижу никаких проблем в использовании смешанного подхода с mdframed
и , tcolorbox
как описано выше.
\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}