
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
background
Sie können hierfür einen Mechanismus verwenden . Sie können die Breite und Höhe der Box mit \overlaywidth
und 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
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 \vbox
Aufteilung 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
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.