以下文档中的环境的目的mybox
是在蓝色背景中排版一个框。该框可以通过分页符进行拆分。使用的算法与包中的算法类似boites
:
- 首先将文本格式化为 vbox
- 然后从 vbox 中提取 vbox 的每一行并将其输出到颜色框中。
该文件:
\documentclass{article}
\usepackage[paperwidth=10cm,paperheight=35mm,margin=3mm]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{color}
\usepackage{lipsum}
\pagestyle{empty}
\newbox\boxhead
\newbox\boxtail
\newbox\boxtemp
\newdimen\dimtemp
\def\boxsplit{%
% total height of original box
\dimtemp\ht\boxtail
\advance\dimtemp\dp\boxtail
% split original box in order to retrieve its first line
\setbox\boxhead\vsplit\boxtail to 0pt
% fix the height of the first line
\setbox\boxhead\vbox{\unvbox\boxhead}%
% restore original size
\setbox\boxtemp\vbox{\copy\boxhead\copy\boxtail}%
\advance\dimtemp-\ht\boxtemp
\advance\dimtemp-\dp\boxtemp
\advance\dimtemp\dp\boxhead
\dp\boxhead\dimtemp
}
\newenvironment{mybox}{%
\ifhmode\par\fi
\setbox\boxtail\vbox\bgroup
}{%
\egroup
{%
\noindent
\fboxsep 0pt
\splittopskip 0pt
\baselineskip 0pt
\lineskiplimit 0pt
\lineskip 0pt
\vfuzz\maxdimen
\leavevmode
\loop
\ifvoid\boxtail
\else
\boxsplit
\colorbox{blue}{\hbox to \linewidth{\box\boxhead}\hfil}%
\hfil
\repeat
}%
}
\begin{document}
\begin{mybox}
\lipsum[68]
\end{mybox}
\end{document}
仔细观察时(下图显示在evince
pdf 查看器中打开的文档),可以看到环境格式化的文本中的蓝线之间有非常细的白色规则。
有人知道如何消灭它们吗?
我知道已经有类似的包mdframed
使用不同的算法提供了此功能。但它们不适用于beamer
类或多列环境,并且无法嵌套。
编辑:
正如其他人指出的那样,这似乎是 pdf 查看器的问题。我尝试了几个查看器(在 Linux 上),发现其中一些显示细白线,而其他则不显示。
优秀的 pdf 查看器:
- qpdfview 0.4.9
- Adobe Reader 9.5.5
- okular 0.18.3
- foxit reader 6.1.4.0217 (含 wine)
糟糕的 PDF 查看器:
- evince 3.10.3
- epdfviewer 0.1.8
- 苏门答腊 pdf 2.4 (含 wine)
- pdf-xchange (使用 wine)
答案1
这很可能是查看器的一个功能,但是您可以通过插入一个小的负跳跃(屏幕上可用的最小点数)来解决此问题,以便彩色框重叠。根据您的要求,这可能足够了,或者您可能希望通过增加框的高度来进行补偿,因此
代替
\colorbox{yellow}{\box\boxhead}%
就像是
\vskip-0.1pt
\colorbox{yellow}{\advance\ht\boxhead0.1pt\box\boxhead}%