我正在尝试在 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 breakable
tcolorboxes 中使用。
但是在magazine
和raster
库的帮助下,可以做一些看起来像的事情multicol environment inside a breakable tcolorbox
。
magazine
库提供了将损坏的 tcolorbox 片段存储在数组中的工具。稍后可以根据需要将这些片段插入到我们的文本中,甚至可以按不同的顺序插入。(查看magazine
来源:tcolorbox:可以存储可破坏的 tcolorbox 的各个部分以供日后使用吗?)
一旦我们拥有了所有的片段,我们就可以使用tcboxedraster
或tcboxeditemize
来组成所有的片段,就像一个盒装的多列一样。
这个过程不是自动的,首先我们应该确定初始碎片有多大,并且我们必须知道已经产生了多少碎片,因为我们必须在栅格内手动输入每个碎片。这不容易,但有可能。
举个小例子:
一些文本:\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
中打印。raster
tcboxeditemize
\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}