我有一个文档,其中包含一些较窄(不到一半\textwidth
)的图像。有时页面上只有一张这样的图像,然后环境figure
就足够了。但有时一页上有两个这样的浮动图像,我想将它们并排放置。有人知道有 LaTeX 包可以做这样的事情吗?(ConTeXt 解决方案同样受欢迎。)
编辑:更准确地说,这是我的用例:文档是一组问题。有些问题有与之相关的图形,通常比较窄。如果两个带有图形的问题恰好在同一页上,我希望将两个图形合并在一起(可能在页面顶部,可能在第一个问题附近,这对我来说并不重要)。如果我改变问题的顺序(我经常这样做),甚至在中间的任何地方添加更多问题,图像的配置可能会变得完全不同,这就是为什么我希望解决方案至少是半自动化的)。
答案1
在此期间,直到有人能找到合适的替代方案,我认为可以采用以下半自动化解决方案:
您可以在与图形一起出现的命令中指定问题特定的内容figure
。这样,在文档的逻辑布局中,所有内容应该放在一起。然后,您可以figure
根据需要按页设置环境,并仅列出环境中的命令(问题图形)figure
。这里有一个小的 MWE 来说明这一点:
\documentclass{article}
\usepackage{caption}% http://ctan.org/pkg/caption
\usepackage[demo]{graphicx}% http://ctan.org/pkg/graphicx
\begin{document}
\begin{enumerate}
\item Here is a problem that is very easy to solve.
\item Here is a problem that is very difficult to solve.
It requires an additional figure in order for you to solve it.
It deals with \texttt{rocks}.
\newcommand{\rockfig}{%
\begin{minipage}{0.5\textwidth}
\centering\includegraphics{figure1}
\captionof{figure}{\texttt{Rocks} figure caption.}
\end{minipage}%
}
\item Here is a problem that is somewhat straight forward to solve.
\item Here is another difficult problem with a graphic description.
It requires an additional figure in order for you to solve it.
It deals with \texttt{sand}.
\newcommand{\sandfig}{%
\begin{minipage}{0.5\textwidth}
\centering\includegraphics{figure2}
\captionof{figure}{\texttt{Sand} figure caption.}
\end{minipage}%
}
\begin{figure}[tb]
\centering \rockfig \sandfig
\end{figure}
\item Here is an easy problem.
\end{enumerate}
\end{document}
这是半自动化,因为与另一种自动化的图形机制相比,在图形环境中列出命令的少量干预似乎微不足道。此外,如果每页图形中只有一个图形,则此方法有效。
要对此进行改进,必须通过反复试验来确定以下内容:
- 一页上是否有两幅以上的图像,以便将其分成单独的“节省空间”的图形;
- 考虑页面上包含的图像(无论是单独还是组合)的高度是否会将实际问题推到下一页,从而需要随后再次分解图像(避免可能的“振荡”场景,正如@Andy 所评论的那样);
- 如果问题重新排列,则按适当的顺序排列图形;
- 足够灵活,可以容纳页面上的单个图像或没有图像。
虽然 [3] 和 [4] 可能被认为是可能的/可能的,但 [1] 和 [2] 可能会让你付出超过你(或任何人)声誉的代价。一般来说,人们应该考虑权衡自动化带来的好处是否超过它的存在。
答案2
我无法提供完整的解决方案,但可以提供一些带有伪代码的想法。也许知道如何读取辅助文件的人可以添加缺失的代码。MWE 可以编译,但在注释中缺少内容。
\documentclass{article}
\RequirePackage[paperwidth=170mm, paperheight=240mm, left=40pt, top=40pt, textwidth=280pt, marginparsep=20pt, marginparwidth=100pt, textheight=560pt, footskip=40pt]{geometry}%
\usepackage{lipsum}
\usepackage{caption}
\makeatletter
%
\newsavebox{\@boxone}
\newsavebox{\@boxtwo}
\newenvironment{smallfigure}%
{%
% if figure is first or single on page
\begin{lrbox}{\@boxone}%
% if figure is second on page
% \begin{lrbox}{\@boxtwo}%
\begin{minipage}{135pt}%
\captionsetup{type=figure}}%
{\end{minipage}%
\end{lrbox}%
% if figure is single on page
\usebox{\@boxone}%
% if figure is first on page
% do nothing
% if figure is second on page
% use the two boxes adjacent to each eacher
}
%
\makeatother
\begin{document}
%
\lipsum[1]
\begin{smallfigure}
\rule{115pt}{1em}
\caption{a}
\end{smallfigure}
\lipsum[1]
\begin{smallfigure}
\rule{115pt}{1em}
\caption{b}
\end{smallfigure}
\lipsum[1]
%
\end{document}
稍后,必须添加同一页上的第三个图形的选项。
附注 ;),我们将小图放在页边距中。然后,它们(几乎)总是位于提及的文本旁边。这可能会节省空间,也可能不会,具体取决于小图的数量。这对软件包特别有效marginfix
。如果您想尝试一下,您可以将行替换\usebox
为\marginpar{\usebox{\@boxone}}%
因此,奇怪的页面布局有足够的边距。