[Tex/LaTex] How to force the tcolorbox package to cover the upper and lower part of pages

framedtcolorbox

The code

\documentclass{book}
\usepackage[many]{tcolorbox}
\usepackage{lipsum}

\begin{document}
\chapter{Foo bar}
\lipsum[1-2]

\begin{tcolorbox}[size=tight,oversize,
  sharp corners,
    breakable,
  enhanced,
  interior style={top color=green!30!white,bottom color=green!30!white},
  colframe=blue,
  colupper=black,
  left=170pt,
  right=170pt,
  bottom=10pt,
  top=10pt,
  ]
\lipsum[2-3]
\end{tcolorbox}

\lipsum[2]
\end{document}

gives me this result:

enter image description here

but I want this result (it's Photoshop!):

enter image description here
Is there a way to do this?

Best Answer

You can use underlay options combined with remember and frame hidden. remember allows to make reference to other frame pictures or use current page node in overlay|underlay additions. frame hidden avoid spurious lines behind your filled rectangles.

\documentclass{book}
\usepackage[many]{tcolorbox}
\usepackage{lipsum}

\begin{document}
\chapter{Foo bar}
\lipsum[1-2]

\begin{tcolorbox}[oversize,
  remember,
  sharp corners,
    breakable,
  enhanced,
  frame hidden,
  underlay first={\fill[green!30!white] (frame.north-|current page.west) rectangle (current page.south east);},
  underlay last={\fill[green!30!white] (current page.north west) rectangle (current page.east|-frame.south);},
  colframe=blue,
  colupper=black,
  bottom=10pt,
  top=10pt,
]
\lipsum[2-3]
\end{tcolorbox}

\lipsum[2]
\end{document}

enter image description here

Update: How to preserve header?

I don't know how to solve this problem. To my understanding you want that something which is drawn later (colored box) doesn't cover something which is already printed on your page (header). It's possible that tcolorbox leaves some information about a broken box which could be used to know that some background must be added to next page before the header is printed. But I don't know how to use it. May be follow up question attracts interest of more smart brains than mine.

The best I can do, which looks horrible, is making a hole for header area with tikzpagenodes package help.

\documentclass{book}
\usepackage[many]{tcolorbox}
\usepackage{lipsum}
\usepackage{tikzpagenodes}

\begin{document}
\chapter{Foo bar}
\lipsum[1-2]

\begin{tcolorbox}[oversize,
  remember,
  sharp corners,
    breakable,
  enhanced,
  frame hidden,
  interior hidden,
  underlay first={\fill[green!30!white] (frame.north-|current page.west) 
                     rectangle (current page.south east);},
  underlay last={\begin{scope}[even odd rule, fill=green!30!white]
         \fill[clip] (current page.north west) rectangle 
                     (current page.east|-frame.south) 
                     (current page header area.north west) rectangle 
                     (current page header area.south east);
         \end{scope}
},
  colframe=blue,
  colupper=black,
  bottom=10pt,
  top=10pt,
]
\lipsum[2-3]
\end{tcolorbox}

\lipsum[2]
\end{document}

enter image description here

Related Question