插入图片作为页面的三分之一

插入图片作为页面的三分之一

我想制作一个宏来在页面中插入图像。有以下限制:

  1. 插入带有标题的图像。
  2. 保持图像的纵横比。
  3. 最大化图像尺寸。
  4. 垂直或水平居中图像(取决于图像的大小,宏应该是通用的)。
  5. 包含图像和标题的结果对象的尺寸必须等于页面高度的 1/3 并占据全部宽度。
  6. 如果我将此宏与任何图像和标题一起放置 3 次,则这些图像必须位于单个页面上,并占据其全部大小。

现在我得到了以下宏:

\newcommand{\oneimage}[2]{
\begin{figure}
\fbox{%
\parbox[b][0.3\textheight][t]{\textwidth}{%
\fbox{\parbox[b][0.26\textheight][c]{\textwidth}{%
\centering%
\includegraphics[width=\textwidth,height=0.26\textheight,keepaspectratio]{img/#1}%
}}%
\par%
\fbox{\parbox[b][0.04\textheight][t]{\textwidth}{%
\caption{#2}%
\label{fig:#1}%
}}%
}%
}
\end{figure}
}

如您所见,解决方案并不完美,我为标题留下了大约 4 行,因为不清楚如何强制它只使用必要的行数,并将其提供1/3 page height - height of caption给图像。现在“最大化图像大小”规则并没有真正实现。

答案1

为了使你的宏更强大,你需要计算 es 的宽度和高度\parbox。以下解决方案需要该calc包。

盒子宽度

每个 es的每侧\fbox都有 的内部填充。因此,您的内部es 的宽度应为。此外,实际加载的图像的宽度应为\fboxsep+\fboxrule\parbox\textwidth-2\fboxsep-2\fboxrule\includegraphics\textwidth-4\fboxsep-4\fboxrule

盒子高度

这里有点复杂。对于标题框,你需要考虑多行标题。你可以使用测量标题的高度\heightof{\parbox[b][][t]{\textwidth-2\fboxsep-2\fboxrule}{\@makecaption\fnum@figure{#2}}},然后添加填充2\fboxsep+2\fboxrule。请注意,正如在这个答案,我增加和减少图形计数器,以确保在我测量的“虚拟”标题中使用了正确的数字。这导致:

\stepcounter{figure}
\setlength{\capboxheight}{2\fboxsep+2\fboxrule+\heightof{\parbox[b][][t]{\textwidth-2\fboxsep-2\fboxrule}{\@makecaption\fnum@figure{#2}}}}
\addtocounter{figure}{-1}

对于图形框,从总数中减去标题框高度、填充和框之间的间隔0.33\textheight-1.4\baselineskip(这大约是仍然允许在同一页面上放置三个图形的最大高度,我通过反复试验获得了这个高度):

\setlength{\figboxheight}{0.33\textheight-1.4\baselineskip-2\fboxsep-2\fboxrule-\lineskip-\capboxheight}

这会产生以下结果。完整代码和三个测试图像 square.png、flat.png 和 tall.png(根据您的代码,需要将其放在名为 的目录中./img/)位于文章末尾:

三图

\documentclass{article}
\usepackage[margin=1in]{geometry}
\usepackage{graphicx}
\usepackage{calc}

\newlength{\capboxheight}
\newlength{\figboxheight}

\makeatletter
\newcommand{\oneimage}[2]{

\stepcounter{figure}
\setlength{\capboxheight}{2\fboxsep+2\fboxrule+\heightof{\parbox[b][][t]{\textwidth-2\fboxsep-2\fboxrule}{\@makecaption\fnum@figure{#2}}}}
\addtocounter{figure}{-1}

\setlength{\figboxheight}{0.33\textheight-1.4\baselineskip-2\fboxsep-2\fboxrule-\lineskip-\capboxheight}

\begin{figure}
\fbox{%
\parbox[b][][t]{\textwidth}{\centering%
\fbox{\parbox[b][\figboxheight][c]{\textwidth-2\fboxsep-2\fboxrule}{%
\centering%
\includegraphics[width=\textwidth-4\fboxsep-4\fboxrule,height=\figboxheight-2\fboxsep-2\fboxrule,keepaspectratio]{img/#1}%
}}%
\par
\fbox{\parbox[b][\capboxheight][t]{\textwidth-2\fboxsep-2\fboxrule}{%
    \caption{#2}%
    \label{fig:#1}%
}}%
}%
}
\end{figure}
}

\makeatother

\begin{document}

\oneimage{square.png}{A square.}
\oneimage{flat.png}{A flat rectangle.}
\oneimage{tall.png}{A tall rectangle with a very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very long caption that spans 3 lines.}

\end{document}

正方形.png 平面.png 高.png

相关内容