如何在书籍模板中创建两列可破坏的彩色环境

如何在书籍模板中创建两列可破坏的彩色环境

我正在尝试在 tufte 书籍模板中创建一个双列可破坏的彩色环境,但是使用 mdframed 和 tcolorbox 没有用。错误是:在一个框中多列没有意义!

\documentclass{article}
\usepackage[margin=0.5in,showframe]{geometry}
\setlength{\parindent}{0pt}
%%------------------------------
\usepackage{tcolorbox}
\tcbuselibrary{skins}
\usepackage{lipsum,multicol}

\begin{document}
\begin{tcolorbox}[width=\textwidth,
                  enhanced,
                  %%frame hidden,
                  interior hidden,
                  boxsep=0pt,
                  left=0pt,
                  right=0pt,
                  top=2pt,
                  ]%%
\twocolumn  \lipsum[1-10]
\end{tcolorbox}
\end{document}

在此处输入图片描述

答案1

tcolorbox可以在环境中使用multicols,并且框会相应地中断。但multicol环境只能在non breakabletcolorboxes 中使用。

但是在magazineraster库的帮助下,可以做一些看起来像的事情multicol environment inside a breakable tcolorbox

magazine库提供了将损坏的 tcolorbox 片段存储在数组中的工具。稍后可以根据需要将这些片段插入到我们的文本中,甚至可以按不同的顺序插入。(查看magazine来源:tcolorbox:可以存储可破坏的 tcolorbox 的各个部分以供日后使用吗?

一旦我们拥有了所有的片段,我们就可以使用tcboxedrastertcboxeditemize来组成所有的片段,就像一个盒装的多列一样。

这个过程不是自动的,首先我们应该确定初始碎片有多大,并且我们必须知道已经产生了多少碎片,因为我们必须在栅格内手动输入每个碎片。这不容易,但有可能。

举个小例子:

一些文本:\lipsum[1-8]被分解.93\textheight X .42\textwidth成碎片,并被存储在一个盒子default数组中blanker

\begin{tcolorbox}[blanker, 
width=.42\textwidth,
breakable,
break at=.93\textheight,
%break at=.93\textheight/.93\textheight/.4\textheight,
reset box array,
store to box array,]
\lipsum[1-8]
\end{tcolorbox}

该文本仅被处理和存储,根本不被打印。

稍后这些片段(在本例中为 3,尽管\boxarraygetsize{\mysize}会将片段编号存储在中)可以在或类似的文件\mysize中打印。rastertcboxeditemize

\begin{tcboxeditemize}[%
    blanker, 
    raster columns=2, 
    sharp corners, 
    halign=center, 
    raster valign=top]{%
    breakable, 
    colback=yellow!20, 
    fonttitle=\bfseries\large, 
    colframe=red!80!yellow,
    title=Breakable twocolumn tcolorbox, 
    title after break= Second and last part,
    }
\tcbitem\consumeboxarray{1}
\tcbitem\consumeboxarray{2}
\tcbitem\consumeboxarray{3}
\tcbitem\consumeboxarray{4}
\end{tcboxeditemize}

\consumeboxarray{1}使用并删除第一个片段。由于我们只有三个片段,因此对第四个片段的引用将被忽略,而不会干扰工作。

结果如下:

在此处输入图片描述

如果您希望更好地平衡第二页,也可以这样做,但我们必须手动设置所有片段的长度。例如:

break at=.93\textheight/.93\textheight/.4\textheight,

将在长度后强制两次中断.93\textheight,其他所有中断都将具有.4\textheight长度。使用这些数字,结果是:

在此处输入图片描述

完整代码如下:

\documentclass[a4paper,12pt]{article}
\usepackage[margin=0.5in]{geometry}
\usepackage[most]{tcolorbox}
\usepackage{multicol}
\usepackage{lipsum}

\begin{document}
\begin{tcolorbox}[blanker, 
width=.42\textwidth,
breakable,
break at=.93\textheight,
%break at=.93\textheight/.93\textheight/.4\textheight,
reset box array,
store to box array,]
\lipsum[1-8]
\end{tcolorbox}

\begin{tcboxeditemize}[%
    blanker, 
    raster columns=2, 
    sharp corners, 
    halign=center, 
    raster valign=top]{%
    breakable, 
    colback=yellow!20, 
    fonttitle=\bfseries\large, 
    colframe=red!80!yellow,
    title=Breakable twocolumn tcolorbox, 
    title after break= Second and last part,
    }
\tcbitem\consumeboxarray{1}
\tcbitem\consumeboxarray{2}
\tcbitem\consumeboxarray{3}
\tcbitem\consumeboxarray{4}
\end{tcboxeditemize}

\end{document}

答案2

\twocolumn在框内没有意义。但在外面用 tcolorbox 就可以了。您也可以在 tcolorbox 内使用多列,但前提是它不可破坏。如果您想要在两列文档的两列周围都画一个框架,您应该用其他方法绘制它,例如用 eso-pic 作为背景图像。

\documentclass{article}
\usepackage[margin=0.5in,showframe]{geometry}
\setlength{\parindent}{0pt}
%%------------------------------
\usepackage[many]{tcolorbox}
\tcbuselibrary{skins}
\usepackage{multicol,lipsum}

\begin{document}
\twocolumn
\begin{tcolorbox}[width=\linewidth, %\linewidth, not \textwidth!
                  enhanced,
                  breakable
                  ]%%
 \lipsum[1-10]
\end{tcolorbox}

\onecolumn
\begin{tcolorbox}[width=\textwidth,
                  enhanced,
                  colback=blue!20!white
                  %breakable %won't work
                  ]%%
 \begin{multicols}{2}                  
 \lipsum[1-2]
 \end{multicols}
\end{tcolorbox}

\end{document}

相关内容