[Tex/LaTex] Tcolorbox and lost floats

floatstcolorbox

I use tcolorbox to write exercises with solutions for a book of probability. When I use some floats, like tables or figures, it refuses it, and I have error messages like ! LaTeX Error: Not in outer par mode. or Float(s) lost.. so I'm obliged to undo the float command begin{figure}.. \end{figure} and use instead the caption package, and it's command
\captionof{figure}{The caption}

Now, I want to use floats in such cases. 1/ How can I use it ?

2/ Moreover, is it possible to use with \NewTColorBox some rotated tables, given by the package ctable, like this one, for example: ?

\ctable[
caption={Mycaption},
label={tab:Mytable},
botcap, % caption below table
sideways % This rotates the table
]
{ccc}
{
% Table footnotes here
}
{
Column 1 & Column 2 & Column 3 \\
Row 2, 1 & 2, 2     & 2, 3 \\
}

3/ More and moreover, can I write some things outside the box of solution, for writing some comments for example, or some floats !, between two successive solutions ?

I give an example of an exercise, where one can note that the commands \begin{figure} \end{figure} are commented, (there is the error Not in outer par mode when it is uncomented)

\documentclass{book}

\usepackage[most]{tcolorbox} 
\tcbuselibrary{skins,breakable,xparse}

\usepackage{caption}

\usepackage[most]{tcolorbox}
\tcbuselibrary{skins,breakable,xparse}

\usepackage{tikz}
\usetikzlibrary{arrows,backgrounds,plotmarks,calc,positioning,shadings,patterns,tikzmark}
\usepackage{pgfplots}

%\usepackage{ctable}% Uncomment If one wants to compile the ctable given as example
\usepackage{polyglossia}
\setmainlanguage{english}

\NewTColorBox[auto counter,number within=chapter]{exercise}{m+O{}}{%
    enhanced,
    colframe=green!20!black,
    colback=yellow!10!white,
    coltitle=green!40!black,
    fonttitle=\bfseries,
    underlay={\begin{tcbclipinterior}
        \shade[inner color=green!80!yellow,outer color=yellow!10!white]
            (interior.north west) circle (2cm);
        \draw[help lines,step=5mm,yellow!80!black,shift={(interior.north west)}]
            (interior.south west) grid (interior.north east);
        \end{tcbclipinterior}},
    title={Exercise~ \thetcbcounter:},
    label={exercise:#1},
    attach title to upper=\quad,
    after upper={\par\hfill\textcolor{green!40!black}%
        {\itshape Solution on page~\pageref{solution:#1}}},
    lowerbox=ignored,
    savelowerto=solutions/exercise-\thetcbcounter.tex,
    record={\string\solution{#1}{solutions/exercise-\thetcbcounter.tex}},
    #2
}

\NewTotalTColorBox{\solution}{mm}{%
    enhanced,
    colframe=red!20!black,
    colback=yellow!10!white,
    coltitle=red!40!black,
    fonttitle=\bfseries,
    underlay={\begin{tcbclipinterior}
        \shade[inner color=red!50!yellow,outer color=yellow!10!white]
            (interior.north west) circle (2cm);
        \draw[help lines,step=5mm,yellow!80!black,shift={(interior.north west)}]
            (interior.south west) grid (interior.north east);
        \end{tcbclipinterior}},
    title={Solution of Exercise~\ref{exercise:#1} on page~\pageref{exercise:#1}:},
    phantomlabel={solution:#1},
    attach title to upper=\par,
}{\input{#2}}

\tcbset{no solution/.style={no recording,after upper=}}

\begin{document}
%% Uncomment If one wants to compile this ctable
%%  \ctable[
%%  caption={Your table caption},
%%  label={tab:mytable},
%%  botcap, % caption below table
%%  sideways % This rotates the table
%%  ]
%%  {ccc}
%%  {
%%  % Table footnotes here
%%  }
%%  {
%%  Column 1 & Column 2 & Column 3 \\
%%  Row 2, 1 & 2, 2     & 2, 3 \\
%%  }
\chapter{The first chapter}
\tcbstartrecording
\begin{exercise}{BanachMatch}
The bar graph of the distribution of Banach matches..
\tcblower
%   \begin{figure}[h]
    {\centering
\begin{tikzpicture}[
    declare function={
    comb(\n,\k)=\n!/(\k!*(\n-\k)!);
    albanach(\k,\n,\p)=comb(2*\n-\k,\n)*(\p^(\n+1)*(1-\p)^(\n-\k)+\p^(\n-\k)*(1-\p)^(\n+1));
    }
]
\begin{axis}[
    xlabel={$x$}, ylabel={$P(X=x)$},
    yticklabel style={
        /pgf/number format/fixed,
        /pgf/number format/fixed zerofill,
        /pgf/number format/precision=2
    },
    legend style={
cells={anchor=east},
legend pos=outer north east,
    xlabel={$x$}, ylabel={$P(X=x)$},samples at={0,...,50},
    yticklabel style={
        /pgf/number format/fixed,
        /pgf/number format/fixed zerofill,
        /pgf/number format/precision=2
                     }
              },
    ybar=0pt, bar width=2
]
\addplot [fill=orange, fill opacity=0.5] {albanach(x,50,0.5)}; \addlegendentry{$p=0.5$}
\addplot [fill=cyan, fill opacity=0.5] {albanach(x,50,0.4)}; \addlegendentry{$p=0.4$}
\addplot [fill=blue, fill opacity=0.5] {albanach(x,50,0.3)}; \addlegendentry{$p=0.3$}
\end{axis}
\end{tikzpicture}
\par}
\captionof{figure}{Banach matches}
%\end{figure}
\end{exercise}
\tcbstoprecording
\tcbinputrecords
\end{document}

and its compilation, using xelatex:
enter image description here

Best Answer

You have the nesting in the wrong order, you want your coloured boxes to float, so they should be inside figure you do not want figure to be inside the box.

this works without error

\begin{figure}[htp]
\begin{exercise}{BanachMatch}

....

\end{exercise}
\end{figure}

with no other changes needed to your document.


\documentclass{book}

\usepackage[most]{tcolorbox} 
\tcbuselibrary{skins,breakable,xparse}

\usepackage{caption}

\usepackage[most]{tcolorbox}
\tcbuselibrary{skins,breakable,xparse}

\usepackage{tikz}
\usetikzlibrary{arrows,backgrounds,plotmarks,calc,positioning,shadings,patterns,tikzmark}
\usepackage{pgfplots}

%\usepackage{ctable}% Uncomment If one wants to compile the ctable given as example
\usepackage{polyglossia}
\setmainlanguage{english}

\NewTColorBox[auto counter,number within=chapter]{exercise}{m+O{}}{%
    enhanced,
    colframe=green!20!black,
    colback=yellow!10!white,
    coltitle=green!40!black,
    fonttitle=\bfseries,
    underlay={\begin{tcbclipinterior}
        \shade[inner color=green!80!yellow,outer color=yellow!10!white]
            (interior.north west) circle (2cm);
        \draw[help lines,step=5mm,yellow!80!black,shift={(interior.north west)}]
            (interior.south west) grid (interior.north east);
        \end{tcbclipinterior}},
    title={Exercise~ \thetcbcounter:},
    label={exercise:#1},
    attach title to upper=\quad,
    after upper={\par\hfill\textcolor{green!40!black}%
        {\itshape Solution on page~\pageref{solution:#1}}},
    lowerbox=ignored,
    savelowerto=solutions/exercise-\thetcbcounter.tex,
    record={\string\solution{#1}{solutions/exercise-\thetcbcounter.tex}},
    #2
}

\NewTotalTColorBox{\solution}{mm}{%
    enhanced,
    colframe=red!20!black,
    colback=yellow!10!white,
    coltitle=red!40!black,
    fonttitle=\bfseries,
    underlay={\begin{tcbclipinterior}
        \shade[inner color=red!50!yellow,outer color=yellow!10!white]
            (interior.north west) circle (2cm);
        \draw[help lines,step=5mm,yellow!80!black,shift={(interior.north west)}]
            (interior.south west) grid (interior.north east);
        \end{tcbclipinterior}},
    title={Solution of Exercise~\ref{exercise:#1} on page~\pageref{exercise:#1}:},
    phantomlabel={solution:#1},
    attach title to upper=\par,
}{\input{#2}}

\tcbset{no solution/.style={no recording,after upper=}}

\begin{document}
%% Uncomment If one wants to compile this ctable
%%  \ctable[
%%  caption={Your table caption},
%%  label={tab:mytable},
%%  botcap, % caption below table
%%  sideways % This rotates the table
%%  ]
%%  {ccc}
%%  {
%%  % Table footnotes here
%%  }
%%  {
%%  Column 1 & Column 2 & Column 3 \\
%%  Row 2, 1 & 2, 2     & 2, 3 \\
%%  }
\chapter{The first chapter}
\tcbstartrecording
\begin{figure}[htp]
\begin{exercise}{BanachMatch}
The bar graph of the distribution of Banach matches..
\tcblower
    {\centering
\begin{tikzpicture}[
    declare function={
    comb(\n,\k)=\n!/(\k!*(\n-\k)!);
    albanach(\k,\n,\p)=comb(2*\n-\k,\n)*(\p^(\n+1)*(1-\p)^(\n-\k)+\p^(\n-\k)*(1-\p)^(\n+1));
    }
]
\begin{axis}[
    xlabel={$x$}, ylabel={$P(X=x)$},
    yticklabel style={
        /pgf/number format/fixed,
        /pgf/number format/fixed zerofill,
        /pgf/number format/precision=2
    },
    legend style={
cells={anchor=east},
legend pos=outer north east,
    xlabel={$x$}, ylabel={$P(X=x)$},samples at={0,...,50},
    yticklabel style={
        /pgf/number format/fixed,
        /pgf/number format/fixed zerofill,
        /pgf/number format/precision=2
                     }
              },
    ybar=0pt, bar width=2
]
\addplot [fill=orange, fill opacity=0.5] {albanach(x,50,0.5)}; \addlegendentry{$p=0.5$}
\addplot [fill=cyan, fill opacity=0.5] {albanach(x,50,0.4)}; \addlegendentry{$p=0.4$}
\addplot [fill=blue, fill opacity=0.5] {albanach(x,50,0.3)}; \addlegendentry{$p=0.3$}
\end{axis}
\end{tikzpicture}
\par}
\captionof{figure}{Banach matches}
\end{exercise}
\end{figure}
\tcbstoprecording
\tcbinputrecords
\end{document}
Related Question