
Intenté reproducir el siguiente ejemplo en ConTeXt:
http://www.texample.net/tikz/examples/framed-tikz/
¿Cómo puedo sustituir el framed
paquete LaTeX, es decir, hacer que el marco abarque varias páginas?
(Renunciar a TikZ no es una opción porque ya he diseñado mi propio marco).
Respuesta1
Puedes usar background
un mecanismo para esto. Puede obtener el ancho y el alto del cuadro usando \overlaywidth
y \overlayheight
. Aquí hay un ejemplo:
\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
lo que da
EDITAR: En un comentario, @user19041 preguntó si es posible cambiar el fondo dependiendo delestadode la escisión. ConTeXt tiene una macro interna \backgroundsplitmode
que realiza un seguimiento de cómo \vbox
se divide. Desafortunadamente, no diferencia entre el caso en el que no es necesario dividir el vbox y el caso en el que el vbox está dividido pero estamos en la última página. Es fácil diferenciar entre estos dos (siempre que no esté anidando dichos marcos; en ese caso, necesitaremos definir un nuevo contador para cada nivel anidado). El siguiente ejemplo ilustra cómo se hace esto. Acabo de cambiar el color de fondo para ilustrar el concepto.
\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
lo que da
Respuesta2
Mi borrador de solución actual se basa en la respuesta aVboxes rompibles:
\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
Este código dibuja un marco delgado alrededor del texto y agrega un fondo gris, pero cualquier código TikZ válido debería funcionar.