TikZ와 함께 mdframed를 사용하여 \mdf@singleextra에서 둥근 모서리가 작동하지 않습니다.

TikZ와 함께 mdframed를 사용하여 \mdf@singleextra에서 둥근 모서리가 작동하지 않습니다.

에 제공된 여담 예제를 기반으로 mdframed패키지(와 함께 ) 를 사용하여 새로운 프레임 환경을 만들고 있습니다 . 내 코드는 다음과 같습니다TikZmdframed-example-texsx.tex

\documentclass{scrartcl}

\usepackage{times}

\usepackage{lipsum}
\usepackage[usenames,dvipsnames,svgnames,table]{xcolor}
\usepackage{tikz}
   \usetikzlibrary{calc,arrows,shadows}
\usepackage[framemethod=tikz]{mdframed}


\tikzset{
    title/.style={
      fill=white,
      font=\normalfont,
      text=black,
      anchor=base west,
    },
    contour/.style = {
      line width = 0.6pt,
      draw = black,
      rounded corners = 2ex,
    },
    fakeshadow/.style = {
      line width = 4.5pt,
      draw = white,
    },
}

\newcommand{\definitiontitle}{
  {\scshape \bfseries \Large Definition}
}

\mdfdefinestyle{definition}{%
    singleextra={%
          %% Store (O) in \p1, store (P) in \p2. Now \p1=(\x1,\y1) and \p2=(\x2,\y2). From that, define (Q) = (\x1,\y2).
          \path let \p1=(O), \p2=(P) in (\x1,\y2) coordinate (Q);
          \path let \p1=(O), \p2=(P) in (\x2,\y1) coordinate (R);
          \path let \p1=(O), \p2=(Q) in (\x1,{(\y1+\y2)/2}) coordinate (M);
          \path[contour] (M) |- (P) |- (O) -- (M);
          \node[title, anchor=west, xshift=18pt - 5pt] at (Q) {\definitiontitle};
    },
    firstextra={%
          \path let \p1=(O), \p2=(P) in (\x1,\y2) coordinate (Q);
          \path let \p1=(O), \p2=(P) in (\x2,\y1) coordinate (R);
          \path[contour] (O) -- (Q) -- (P) -- (R);
          \node[title, anchor=west, xshift=18pt - 5pt] at (Q) {\definitiontitle};
          \path[fakeshadow] ($(O)+(1pt,-1.5pt)$) -- ($(R)+(-1pt,-1.5pt)$);  %% Hide the bottom shadow
    },
    secondextra={%
          \path let \p1=(O), \p2=(P) in (\x1,\y2) coordinate (Q);
          \path let \p1=(O), \p2=(P) in (\x2,\y1) coordinate (R);
          \path[contour] (Q) -- (O) -- (R) -- (P);
    },
    middleextra={%
          \path let \p1=(O), \p2=(P) in (\x1,\y2) coordinate (Q);
          \path let \p1=(O), \p2=(P) in (\x2,\y1) coordinate (R);
          \path[contour] (O) -- (Q);
          \path[contour] (P) -- (R);
          \path[fakeshadow] ($(O)+(1pt,-1.5pt)$) -- ($(R)+(-1pt,-1.5pt)$);  %% Hide the bottom shadow
    },
    align=center,
    backgroundcolor=yellow,
    userdefinedwidth=.9\textwidth,
    middlelinewidth=1.7em,middlelinecolor=white,
    hidealllines=true,topline=true,
    innertopmargin=6pt,
    innerbottommargin=18pt,
    innerleftmargin=18pt,
    innerrightmargin=18pt,
    splitbottomskip=8pt,
    splittopskip=16pt,
    roundcorner=2ex,
    shadow=true,
    shadowsize=5,
    shadowcolor=black!40,
    %% Experimental
    needspace=3em,
    ignorelastdescenders=true,
}



\begin{document}

\lipsum[3]

\vspace{1\baselineskip}
\begin{mdframed}[style=definition]
    \lipsum[1]
\end{mdframed}

\vspace{1\baselineskip}
\lipsum[3]

\vspace{1\baselineskip}
\begin{mdframed}[style=definition]
    \lipsum[1-2]
\end{mdframed}

\vspace{1\baselineskip}
\lipsum[3]

\vspace{1\baselineskip}
\begin{mdframed}[style=definition]
    \lipsum[1-8]
\end{mdframed}

\end{document}


저는 현재 TikZ를 사용하여 사용자 정의 제목을 배치하고 프레임을 그리고 있습니다. 이는 적절한 middlelinewidth제목 높이를 사용하여 mdframed가 분할할 위치를 알 수 있도록 하기 위해 필요합니다. 하지만 둥근 모서리도 사용하고 있는데, 여기서 전체적인 문제가 발생합니다.

Marco Daniel이 지적했듯이이 게시물, 코드를 사용하는 것이 중요합니다

    hidealllines=true,topline=true,


그러나 을 사용하면 hidealllines=true에서 예상치 못한 효과가 발생합니다 \mdf@singleextra. 즉, 둥근 모서리가 사라지고 대신 전체 상자가 렌더링됩니다. hidealllines=true출력에 표시된 것처럼 프레임이 분할되는 경우(또는 를 사용하지 않지만 높이를 제대로 계산할 수 없는 경우)에는 이런 일이 발생하지 않습니다 .

산출

\mdf@singleextra왜 이런 일이 에서만 발생하는지 , 그리고 어떻게 해결하는지 아시나요 ?

답변1

해당 옵션을 설정하면 배경이 모서리가 둥글지 않게 그려지는 문제가 발생합니다 topline=true. 그러나 테스트를 해킹할 수 있습니다.

\makeatletter
\let\mdf@putbox@single@orig\mdf@putbox@single
\mdfapptodefinestyle{definition}{%
  settings={%
        \def\mdf@putbox@single{%
                   \let\mdf@test@t\@gobbletwo
                   \let\mdf@test@noline\@firstoftwo
                 \mdf@putbox@single@orig
            }%
   }%
}
\makeatother

해킹 후에는 singlextra다음 줄로 옵션을 확장해야 합니다.

\path[draw=white,line width=1.7em,overlay] (O|-P) -- (P);

제목의 흰색 배경을 그립니다.

두 번째 페이지의 홀수 모서리는 재현할 수 없습니다.

출력은 다음과 같습니다.

여기에 이미지 설명을 입력하세요

전체 코드는 다음과 같습니다.

\documentclass{scrartcl}

\usepackage{times}

\usepackage{lipsum}
\usepackage[usenames,dvipsnames,svgnames,table]{xcolor}
\usepackage{tikz}
   \usetikzlibrary{calc,arrows,shadows}
\usepackage[framemethod=tikz]{mdframed}


\tikzset{
    title/.style={
      fill=white,
      font=\normalfont,
      text=black,
      anchor=base west,
    },
    contour/.style = {
      line width = 0.6pt,
      draw = black,
      rounded corners = 2ex,
    },
    fakeshadow/.style = {
      line width = 4.5pt,
      draw = white,
    },
}

\newcommand{\definitiontitle}{
  {\scshape \bfseries \Large Definition}
}

\mdfdefinestyle{definition}{%
    singleextra={%
          %% Store (O) in \p1, store (P) in \p2. Now \p1=(\x1,\y1) and \p2=(\x2,\y2). From that, define (Q) = (\x1,\y2).
          \path let \p1=(O), \p2=(P) in (\x1,\y2) coordinate (Q);
          \path let \p1=(O), \p2=(P) in (\x2,\y1) coordinate (R);
          \path let \p1=(O), \p2=(Q) in (\x1,{(\y1+\y2)/2}) coordinate (M);
         \path[draw=white,line width=1.7em,overlay] (O|-P) -- (P);
          \path[contour,] (M) |- (P) |- (O) -- (M);
          \node[title, anchor=west, xshift=18pt - 5pt] at (Q) {\definitiontitle};
    },
    firstextra={%
          \path let \p1=(O), \p2=(P) in (\x1,\y2) coordinate (Q);
          \path let \p1=(O), \p2=(P) in (\x2,\y1) coordinate (R);
          \path[contour] (O) -- (Q) -- (P) -- (R);
          \node[title, anchor=west, xshift=18pt - 5pt] at (Q) {\definitiontitle};
          \path[fakeshadow] ($(O)+(1pt,-1.5pt)$) -- ($(R)+(-1pt,-1.5pt)$);  %% Hide the bottom shadow
    },
    secondextra={%
          \path let \p1=(O), \p2=(P) in (\x1,\y2) coordinate (Q);
          \path let \p1=(O), \p2=(P) in (\x2,\y1) coordinate (R);
          \path[contour] (Q) -- (O) -- (R) -- (P);
    },
    middleextra={%
          \path let \p1=(O), \p2=(P) in (\x1,\y2) coordinate (Q);
          \path let \p1=(O), \p2=(P) in (\x2,\y1) coordinate (R);
          \path[contour] (O) -- (Q);
          \path[contour] (P) -- (R);
          \path[fakeshadow] ($(O)+(1pt,-1.5pt)$) -- ($(R)+(-1pt,-1.5pt)$);  %% Hide the bottom shadow
    },
    align=center,
    backgroundcolor=yellow,
    userdefinedwidth=.9\textwidth,
    middlelinewidth=1.7em,middlelinecolor=white,
    hidealllines=true,topline=true,
    innertopmargin=6pt,
    innerbottommargin=18pt,
    innerleftmargin=18pt,
    innerrightmargin=18pt,
    splitbottomskip=8pt,
    splittopskip=16pt,
    roundcorner=2ex,
%    shadow=true,
    shadowsize=5,
    shadowcolor=black!40,
    %% Experimental
    needspace=3em,
    ignorelastdescenders=true,
}




\makeatletter
\let\mdf@putbox@single@orig\mdf@putbox@single
\mdfapptodefinestyle{definition}{%
  settings={%
        \def\mdf@putbox@single{%
                   \let\mdf@test@t\@gobbletwo
                   \let\mdf@test@noline\@firstoftwo
                 \mdf@putbox@single@orig
            }%
   }%
}
\makeatother


\begin{document}

\lipsum[3]

\vspace{1\baselineskip}
\begin{mdframed}[style=definition]
    \lipsum[1]
\end{mdframed}

\vspace{1\baselineskip}
\lipsum[3]

\vspace{1\baselineskip}
\begin{mdframed}[style=definition]
    \lipsum[1-2]
\end{mdframed}

\vspace{1\baselineskip}
\lipsum[3]

\vspace{1\baselineskip}
\begin{mdframed}[style=definition]
    \lipsum[1-8]
\end{mdframed}

\end{document}

관련 정보