TikZ 프레임 단락은 ConTeXt의 페이지 전체에 걸쳐 있습니다.

TikZ 프레임 단락은 ConTeXt의 페이지 전체에 걸쳐 있습니다.

ConTeXt에서 다음 예제를 재현해 보았습니다.
http://www.texample.net/tikz/examples/framed-tikz/

framed프레임을 여러 페이지에 걸쳐 표시하는 LaTeX 패키지를 어떻게 대체할 수 있습니까 ?
(TikZ에서 사임하는 것은 이미 내 자신의 프레임을 디자인했기 때문에 선택 사항이 아닙니다.)

답변1

background이를 위해 메커니즘을 사용할 수 있습니다 . \overlaywidth및 를 사용하여 상자의 너비와 높이를 얻을 수 있습니다 \overlayheight. 예는 다음과 같습니다.

\usemodule[tikz]

\startsetups tikz:frame
  \starttikzpicture 
    \filldraw[fill=lightgray] (0,0) -- (0, \overlayheight) -- (\overlaywidth, \overlayheight) -- (\overlaywidth,0) -- cycle;
  \stoptikzpicture
\stopsetups 

\defineoverlay[tikzframe][\setups{tikz:frame}]

\definebackground[tikzframe][background=tikzframe]

\starttext

\starttikzframe
  \dorecurse{10}{\input knuth \endgraf}
\stoptikzframe

\stoptext

이는

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

편집하다: @user19041 님께서 댓글에서 상황에 따라 배경을 바꿀 수 있냐고 물으셨습니다.상태분할의. ConTeXt에는 분할되는 \backgroundsplitmode방식을 추적하는 내부 매크로가 있습니다 . \vbox안타깝게도 vbox를 분할할 필요가 없는 경우와 vbox가 분할되었지만 마지막 페이지에 있는 경우를 구분하지 않습니다. 이 둘을 쉽게 구별할 수 있습니다(해당 프레임을 중첩하지 않는 경우, 이 경우 중첩된 각 수준에 대해 새 카운터를 정의해야 합니다). 아래 예에서는 이 작업이 수행되는 방법을 보여줍니다. 개념을 설명하기 위해 배경색을 변경했습니다.

\usemodule[tikz]

\setnewconstant\tikzbackgroundstate\zerocount

\definecolor[backgroundcolor][lightgray]

\startsetups tikz:frame
  \starttikzpicture 
    \ifcase \backgroundsplitmode
      % Case 0: no split or last page
      \ifcase\tikzbackgroundstate
        % The frame does not split across pages
        \definecolor[backgroundcolor][lightgray]
      \else
        % Last page of a split frame
        \definecolor[backgroundcolor][red]
      \fi \or 
      % Case 1: split to max height, always middle page
        \definecolor[backgroundcolor][yellow]
        \global\tikzbackgroundstate=\plusone
      \else
      % Case 2: split to partial height. Always first page
        \definecolor[backgroundcolor][green]
        \global\tikzbackgroundstate=\plustwo
      \fi
        \filldraw[fill=backgroundcolor] (0,0) -- (0, \overlayheight) -- (\overlaywidth, \overlayheight) -- (\overlaywidth,0) -- cycle;
  \stoptikzpicture
\stopsetups 

\defineoverlay[tikzframe][\setups{tikz:frame}]

\definebackground[tikzinternalframe][background=tikzframe]

\define\starttikzframe
    {\dosingleargument\dostarttikzframe}

\def\dostarttikzframe[#1]%
    {\tikzbackgroundstate=\zerocount
     \starttikzinternalframe[#1]}

\define\stoptikzframe{\stoptikzinternalframe}



\starttext

\starttikzframe
\input ward
\stoptikzframe

\blank[big]

\starttikzframe
  \dorecurse{11}{\input knuth \endgraf}
\stoptikzframe



\stoptext

이는

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

답변2

내 현재 초안 솔루션은 다음에 대한 답변을 기반으로 합니다.깨지기 쉬운 vbox:

\usemodule[tikz]
\pgfdeclarelayer {background}
\pgfsetlayers {background,main}

\newbox\totalbox
\newbox\partialbox
\newdimen\partialboxdim

\def\startframedbox{\par\bigskip
\setbox\totalbox=\vbox\bgroup\advance\hsize by -8pt}
\def\endframedbox{\egroup\splitframedbox}

\def\splitframedbox{\ifvoid\totalbox\finishframedbox
  \else\continuesplitting\fi}
\def\finishframedbox{\bigskip}

\newdimen\Distance

\def\continuesplitting{\null%
  \Distance=\dimexpr\pagegoal-\pagetotal-\pageshrink-6pt\relax
  \ifdim\ht\totalbox<\Distance
    \setbox\partialbox=\box\totalbox
    \framethisbox
  \else
    \setbox\partialbox=\vsplit\totalbox to\dimexpr\Distance-5pt\relax
    \framethisbox
    \vfill\page
  \fi
  \splitframedbox}

\def\framethisbox{%
\starttikzpicture
    \node (A) {\hbox{\vbox{\unvbox\partialbox}}};
    \startpgfonlayer{background}
        \filldraw[draw=black,fill=lightgray] (A.north east) -- (A.north west) -- (A.south west) -- (A.south east) -- cycle;
    \stoppgfonlayer{background}
\stoptikzpicture%
}

\starttext

\input knuth

\startframedbox
  \dorecurse{15}{\input knuth\par}
\endframedbox

\input knuth

\stoptext

이 코드는 텍스트 주위에 얇은 프레임을 그리고 회색 배경을 추가하지만 유효한 TikZ 코드는 모두 작동합니다.

관련 정보