我目前正在以两列布局排版文档。许多文本块被放入彩色框中,目前使用 TikZ 实现。这可行;但是,我必须手动将文本块拆分到两列之间,否则整个列将移动到第二列,因为 tikzpicture 太大了。有没有办法在到达列底部时自动拆分 tikzpicture 的所有节点?如果没有,我可以使用定理包来实现这一点吗?
\documentclass[twocolumn]{scrartcl}
\usepackage{lipsum}
\usepackage{tikz}
\newcommand\mybox[1]{%
\noindent\begin{tikzpicture}%
\node[rectangle, draw=red!40, fill=red!20, inner sep=10pt] (box){%
\begin{minipage}{0.9\columnwidth}%
#1%
\end{minipage}%
};%
\end{tikzpicture}%
}
\begin{document}
\section{Observe overflow:}
\mybox{\lipsum[1]}
\mybox{\lipsum[3]}
\newpage
\section{Correctly set:}
\mybox{\lipsum[4]}
\end{document}
答案1
根据 @Yiannis Lazarides 的评论,下面是一个如何使用的示例mdframed
。在这种情况下,您确实不需要 TikZ 包:
\documentclass[twocolumn]{scrartcl}
\usepackage{lipsum}
\usepackage{mdframed}
\newcommand\mybox[1]{%
% \minsizebox{0.9\columnwidth}{\textheight}{\parbox{0.9\columnwidth}{#1}}
\begin{mdframed}[linewidth=1pt,linecolor=red!40,backgroundcolor=red!20]
#1
\end{mdframed}
}
\begin{document}
\section{Observe no overflow:}
\mybox{\lipsum[1-3]}
\mybox{\lipsum[3]}
\newpage
\section{Also correctly set:}
\mybox{\lipsum[4]}
\end{document}
该线有三个“层”,可以单独进行调整(例如,框架的多色线)等,如包文档中所述。
答案2
TikZ 对于这种用途来说绝对是过度的,除非你希望除了背景颜色和规则之外,你的盒子有更精美的装饰。
我尝试过mdframed
包,但我得到了一些无关的规则和颜色框,它们延伸到了第二列。包文档说它不适用于multicolumn
环境。
这是一种解决方案framed
包裹:
\documentclass[twocolumn]{scrartcl}
\usepackage{lipsum}
\usepackage{xcolor}
\usepackage{framed}
\makeatletter
\newenvironment{MyBox}{%
\colorlet{framecolor}{red!40}%
\colorlet{shadecolor}{red!20}%
\setlength{\fboxrule}{2pt}%
\def\FrameCommand{\fcolorbox{framecolor}{shadecolor}}%
\MakeFramed {\FrameRestore\@setminipage}}%
{\par\unskip\endMakeFramed}
\newcommand{\mybox}[1]{\begin{MyBox}#1\end{MyBox}}
\makeatother
\begin{document}
\section{Observe overflow:}
\mybox{\lipsum[1-2]}
\mybox{\lipsum[3]}
\newpage
\section{Correctly set:}
\mybox{\lipsum[4]}
\end{document}
我说“有点”是因为我不认为你希望每个段落都有一个框,而这个包就是发生这种情况的原因。