我想在类似 ntheorem 的环境中将文本环绕在图形周围。目前,我正在尝试使用 cutwin 包,例如在这个问题中建议使用这个包:如何在类似定理的环境中环绕图形?(如果下面的问题没有简单的答案,我也会感谢使用不同包的替代解决方案。)
在我看来,字体大小 11 的 cutwin 存在一些问题。请考虑以下示例。
\documentclass[10pt]{book}
\usepackage{cutwin}
\usepackage{lipsum}
\usepackage{ntheorem}
\newtheorem{theorem}{Theorem}
\opencutleft
\renewcommand\windowpagestuff{%
\rule{4cm}{6cm}
}
\begin{document}
\lipsum[1]
\begin{theorem}
\begin{cutout}{1}{0pt}{0.65\linewidth}{15}
\lipsum[1]
\end{cutout}
\end{theorem}
\end{document}
请注意,对于 10pt 字体(左图),可以得到预期结果,但对于 11pt 字体(右图),定理与最后一段重叠。(而且切口下方的第一行太靠近之前的行。)此重叠取决于切口的实际高度。这是一个已知问题吗?我在互联网或软件包文档中找不到任何与字体大小错位相关的信息。
有没有简单的方法可以解决这个问题?我猜重新定义 cutwin 包中的某些常量可能就足够了,但我自己不知道该怎么做。
还要注意的是,与 cutwin 错位仅适用于纯文本和不是在 ntheorem 环境中。
答案1
这个答案提供了两种解决方案。
第一种方法的基本要素发布在这里:是否有可能将 wrapfig 与 enumerate 或 itemize 环境一起使用?
此解决方案使用支柱,将第一行文本的基线放置在距离顶部指定距离的位置minipage
。然后adjustbox
用于将顶部放置minipage
在外基线上方正好该距离的位置。必须有更好的方法来定义,strutheight
因为我必须使用它\vspace{-0.5cm}
才能获得正确的对齐方式。
这实际上将图像和文本设置为小页面中的两个独立项目,但结果是文本将环绕图像。一个限制是,据我所知,不可能在图像上方设置文本。也就是说,图像将位于第 1 行,或者如果vspace
放置在图形前面,则图像上方会有空白空间。
第二种方法建立在 OP 的示例之上,将theorem
环境放在 内部adjustbox
。提供了三个示例。
这种方法对于将图形放置在左侧或右侧以及在环境中的不同行级别开始和结束方面非常灵活theorem
。
每个定理环境都会与其他页面元素交互,无论是定理上方或下方的文本,还是像本例中定理之间没有文本的情况下相邻的定理环境。这使得每个定理都对字体大小和周围的页面元素很敏感,并可能导致覆盖之前的页面内容。可以使用键 解决这个问题adjustbox
。vspace
将vspace
指定的空间放在 创建的框之前和之后adjustbox
。通过在 中设置定理adjustbox
,vspace
可以使用 键来纠正定理的任何错位。如 MWE 中所示,vspace
可以取 的值0bp
,\baselineskip
或者任何其他允许的值,以实现对页面上定理的适当设置。如果更改字体大小或在每个定理之间添加内容,则可能需要调整值vspace
。
这是 MWE:
\documentclass[a4paper,11pt]{book}
\usepackage[margin=3.5cm]{geometry}
\usepackage{lipsum}
\usepackage[english]{babel}
\usepackage[pangram]{blindtext}
\usepackage{cutwin}
\usepackage{ntheorem}
\usepackage[calc]{adjustbox}
\usepackage{graphicx}
\usepackage{wrapfig}
\newtheorem{theorem}{Theorem}
\opencutleft
\renewcommand\windowpagestuff{%
% \rule{4cm}{3cm}
\includegraphics[width=0.8\linewidth]{example-image-b.png}
}
\newlength{\strutheight}
\settoheight{\strutheight}{\strut}
\setlength{\parskip}{\baselineskip}
\pagestyle{empty}
\raggedbottom
\begin{document}
% Wrapfigure in adjustbox
\begin{adjustbox}{valign=C,raise=\strutheight,minipage={1.0\linewidth}}
\begin{wrapfigure}{r}{0.15\linewidth} % picture on the right
\centering
\includegraphics[width=1.0\linewidth]{example-image-b.png}
\end{wrapfigure}%
\strut{}
\vspace*{-0.5cm} % This is a fudge to align the top of the theorem environment with the image
\begin{theorem}
\Blindtext[1][10]
\end{theorem}%
\end{adjustbox}
%cutout in adjustbox, cutout on the left
\begin{adjustbox}{valign=C,vspace=0bp,minipage={1.0\linewidth}}
\begin{theorem}
% {3} = Cutout starts in row 3
% {0pt} = Cutout is flush left (0pt from left edge)
% {0.70\linewidth} = text covers 0.65\linewidth relative to right margin
% {8) = cutout extends 8 rows
\begin{cutout}{2}{0pt}{0.70\linewidth}{6}
\Blindtext[1][12]
\end{cutout}
\end{theorem}
\end{adjustbox}
% move the cutout to the right and use example-image-b
\opencutright
\renewcommand\windowpagestuff{% setup the image to be placed in the cutout
\centering
\includegraphics[width=0.80\linewidth]{example-image-b.png}
}
% cutout in adjustbox, cutout on the left
\begin{adjustbox}{valign=C,vspace=0bp,minipage={1.0\linewidth}}
\begin{theorem}
\begin{cutout}{2}{0.70\linewidth}{0pt}{6}
\Blindtext[1][12]
\end{cutout}
\end{theorem}
\end{adjustbox}
\opencutcenter
\renewcommand\windowpagestuff{% setup the image to be placed in the cutout
\centering
\includegraphics[width=0.80\linewidth]{example-image-b.png}
}
%\blindtext[1]
\adjustbox{valign=C,vspace=\baselineskip,minipage=1.0\linewidth}{
\begin{theorem}
\begin{cutout}{2}{0.30\linewidth}{0.30\linewidth}{8}
\Blindtext[1][12]
\end{cutout}
\end{theorem}
}
\end{document}