TikZ-Frame-Absatz erstreckt sich über mehrere Seiten in ConTeXt

TikZ-Frame-Absatz erstreckt sich über mehrere Seiten in ConTeXt

Ich habe versucht, das folgende Beispiel in ConTeXt zu reproduzieren:
http://www.texample.net/tikz/examples/framed-tikz/

Wie kann ich das LaTeX-Paket ersetzen framed, also den Rahmen über mehrere Seiten spannen?
(Ein Ausstieg aus TikZ ist keine Option, da ich bereits einen eigenen Rahmen entworfen habe.)

Antwort1

backgroundSie können hierfür einen Mechanismus verwenden . Sie können die Breite und Höhe der Box mit \overlaywidthund ermitteln \overlayheight. Hier ist ein Beispiel:

\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

was gibt

Bildbeschreibung hier eingeben

BEARBEITEN: @user19041 hat in einem Kommentar gefragt, ob es möglich ist, den Hintergrund je nachZustandder Aufteilung. ConTeXt hat ein internes Makro \backgroundsplitmode, das verfolgt, wie die \vboxAufteilung erfolgt. Leider unterscheidet es nicht zwischen dem Fall, in dem die Vbox nicht aufgeteilt werden muss, und dem Fall, in dem die Vbox aufgeteilt ist, wir uns aber auf der letzten Seite befinden. Es ist einfach, zwischen diesen beiden zu unterscheiden (vorausgesetzt, Sie verschachteln solche Frames nicht; in diesem Fall müssen wir für jede verschachtelte Ebene einen neuen Zähler definieren). Das folgende Beispiel veranschaulicht, wie dies gemacht wird. Ich habe nur die Hintergrundfarbe geändert, um das Konzept zu veranschaulichen.

\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

was gibt

Bildbeschreibung hier eingeben

Antwort2

Mein aktueller Lösungsentwurf basiert auf der Antwort aufZerbrechliche Vboxen:

\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

Dieser Code zeichnet einen dünnen Rahmen um den Text und fügt einen grauen Hintergrund hinzu, aber jeder gültige TikZ-Code sollte funktionieren.

verwandte Informationen