Los párrafos del marco TikZ se extienden a lo largo de las páginas en ConTeXt

Los párrafos del marco TikZ se extienden a lo largo de las páginas en ConTeXt

Intenté reproducir el siguiente ejemplo en ConTeXt:
http://www.texample.net/tikz/examples/framed-tikz/

¿Cómo puedo sustituir el framedpaquete 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 backgroundun mecanismo para esto. Puede obtener el ancho y el alto del cuadro usando \overlaywidthy \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

ingrese la descripción de la imagen aquí

EDITAR: En un comentario, @user19041 preguntó si es posible cambiar el fondo dependiendo delestadode la escisión. ConTeXt tiene una macro interna \backgroundsplitmodeque realiza un seguimiento de cómo \vboxse 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

ingrese la descripción de la imagen aquí

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.

información relacionada