tcolorbox 可破坏框内的多列

tcolorbox 可破坏框内的多列

我尝试将两列的长文本放入带有可分页选项的 tcolorbox 框中。文本从框中出来,而 LaTeX 不会产生分页符!

这是我的 MWE:

\documentclass{article}
\usepackage{multicol,lipsum}
\usepackage[all]{tcolorbox}

\begin{document}

\begin{tcolorbox}[breakable]
\begin{multicols}{2}
\lipsum[1-20]
\end{multicols}
\end{tcolorbox}


\end{document}

结果 :

在此处输入图片描述

有什么建议吗?谢谢

答案1

我只不过是从 OPmac 复制了一些宏\begmulti...\endmulti这些宏可以在纯 TeX 中实现多列排版。而且它可以正常工作:

\documentclass{article}
\usepackage{multicol,lipsum}
\usepackage[all]{tcolorbox}

\newdimen\colsep \colsep=2em
\newcount\mullines
\newcount\tmpnum
\def\corrsize #1{%% #1 := #1 + \splittopskip - \topskip
   \advance #1 by \splittopskip \advance #1 by-\topskip
}
\def\begmulti #1 {\par\bgroup\penalty0 \def\Ncols{#1}
   \setbox6=\vbox\bgroup\penalty0
   %% \hsize := Sirka sloupce = (\hsize+\colsep) / n - \colsep
   \advance\hsize by\colsep
   \divide\hsize by\Ncols  \advance\hsize by-\colsep
   \mullines=0
   \def\par{\ifhmode\endgraf\global\advance\mullines by\prevgraf\fi}%
}
\def\endmulti{\vskip-\prevdepth\vfil
   \expandafter\egroup\expandafter\baselineskip\the\baselineskip\relax 
   \dimen0=.8\maxdimen \tmpnum=\dimen0 \divide\tmpnum by\baselineskip 
   \splittopskip=\baselineskip
   \setbox1=\vsplit6 to0pt
   %% \dimen1 := the free space on the page
   \vsize=.95\vsize
   \ifdim\pagegoal=\maxdimen \dimen1=\vsize \corrsize{\dimen1}
   \else \dimen1=\pagegoal \advance\dimen1 by-\pagetotal \fi
   \ifdim \dimen1<2\baselineskip
     \vfil\break \dimen1=\vsize \corrsize{\dimen1} \fi
   \ifnum\mullines<\tmpnum \dimen0=\ht6 \else \dimen0=.8\maxdimen \fi
   \divide\dimen0 by\Ncols \relax
   %% split the material to more pages?
   \ifdim \dimen0>\dimen1 \splitpart
   \else \balancecolumns \fi  % only balancing
   \egroup
}
\def\makecolumns{\bgroup % full page, destination height: \dimen1
   \vbadness=20000 \setbox1=\hbox{}\tmpnum=0
   \loop \ifnum\Ncols>\tmpnum
      \advance\tmpnum by1
      \setbox1=\hbox{\unhbox1 \vsplit6 to\dimen1 \hss}
   \repeat
   \hbox{}\nobreak\vskip-\splittopskip \nointerlineskip
   \null\nobreak\medskip\hbox to\hsize{\unhbox1\unskip}
   \dimen0=\dimen1 \divide\dimen0 by\baselineskip \multiply\dimen0 by\Ncols
   \global\advance\mullines by-\dimen0
   \egroup
}
\def\splitpart{%
   \makecolumns % full page
   \vskip 0pt plus 1fil minus\baselineskip \break
   \ifnum\mullines<\tmpnum \dimen0=\ht6 \else \dimen0=.8\maxdimen \fi
   \divide\dimen0 by\Ncols \relax
   \ifx\balancecolumns\flushcolumns \advance\dimen0 by-.5\vsize \fi
   \dimen1=\vsize \corrsize{\dimen1}\dimen2=\dimen1
   \advance\dimen2 by-\Ncols\baselineskip
   %% split the material to more pages?
   \ifvoid6 \else
      \ifdim \dimen0>\dimen2 \expandafter\expandafter\expandafter \splitpart
      \else \balancecolumns % last balancing
   \fi \fi
}
\def\balancecolumns{\bgroup \setbox7=\copy6 % destination height: \dimen0
   \ifdim\dimen0>\baselineskip \else \dimen0=\baselineskip \fi
   \vbadness=20000
   \def\tmp{%
      \setbox1=\hbox{}\tmpnum=0
      \loop \ifnum\Ncols>\tmpnum
         \advance\tmpnum by1
         \setbox1=\hbox{\unhbox1
              \ifvoid6 \hbox to\wd6{\hss}\else \vsplit6 to\dimen0 \fi\hss}
      \repeat
   \ifvoid6 \else
      \advance \dimen0 by.2\baselineskip
      \setbox6=\copy7
      \expandafter \tmp \fi}\tmp
   \hbox{}\nobreak\vskip-\splittopskip \nointerlineskip
   \null\nobreak\medskip\hbox to\hsize{\unhbox1\unskip}%
   \egroup
}

\begin{document}

\begin{tcolorbox}[breakable]
%\begin{multicols}{2}
\begmulti 2
\lipsum[1-20]
%\end{multicols}
\endmulti
\end{tcolorbox}

相关内容