自动调整浮动大小和元素之间的垂直空间以使内容适合一页

自动调整浮动大小和元素之间的垂直空间以使内容适合一页

我经常发现自己需要改变图形的大小或删除元素(例如段落和图形)之间的垂直空间,以便 \vspace{}将某些内容放入一页。这相当耗时且重复。是否可以在 LaTeX 中自动执行此过程?假设图形大小调整应优先于引入\vspace{}(假设在段落和图形之间),但图形应具有最小尺寸。

以下是我请求的一些应用程序:

  • 使用 multicol 包创建海报,我经常需要进行上述调整以将内容放入特定的列中(最终将所有内容放入一页)

  • 每章限制为一页的报告。

考虑下面的简单示例,通过将图形尺寸缩小到 11 厘米,内容可以放入一页。但是,最好设置最小图形尺寸并展开以填充页面。

\documentclass{article}
\usepackage{float}
\usepackage{graphicx}
\usepackage{lipsum}

\begin{document}
\lipsum[2-4]
\begin{figure}[H]
\includegraphics[width=13cm]{example-image-a}
\end{figure}
\end{document}

让我以更正式的方式陈述我手动执行的算法,我的问题的核心是这是否可以在 Latex 中实现:

  1. 图形是否适合目标页面?
    • 否 -> 如果尺寸大于最小值,则减小尺寸 -> 返回 1
    • 是 -> 页面是否包含空白?
      • 是 -> 通过增加图形大小填充 -> 返回 1
      • 否 -> 完成

在 LaTex 中是否有办法提出问题:图形是否在所需的页面中?然后迭代调整大小直到满足条件?

答案1

此解决方案使用页面上所有剩余的空间。它不遵循宽高比。允许使用字幕,但也会缩放。

不要忘记运行两次。

\documentclass{article}
\usepackage{tikzpagenodes}
\usepackage{graphicx}
\usepackage{lipsum}

\newlength{\cramht}

\makeatletter% for \@captyoe
\newcommand{\crammit}[1]% #1 = image or minipage
{\bgroup
  \par\vskip\textfloatsep% normal float separation
  \def\@captype{figure}% allow captions
  \noindent\begin{tikzpicture}[overlay, remember picture]
    \pgfextracty{\cramht}{\pgfpointdiff{\pgfpointanchor{current page text area}{south}}{\pgfpointorigin}}%
    \advance\cramht by \ht\strutbox
    \node[above, inner sep=0pt] at (current page text area.south) {\resizebox{\textwidth}{\cramht}{#1}};
  \end{tikzpicture}\newpage
\egroup}
\makeatletter

\begin{document}
\lipsum[2-4]
\crammit{\includegraphics{example-image-a}}
\end{document}

此版本具有可选标题,不会缩放。

\documentclass{article}
\usepackage{tikzpagenodes}
\usepackage{graphicx}
\usepackage{lipsum}

\newlength{\cramht}
\newsavebox{\crambox}

\makeatletter
\newcommand{\crammit}[2][\empty]% #1 = caption (optional), #2 = image\
{\bgroup
  \par\vskip\textfloatsep% normal float separation
  \def\@captype{figure}% allow captions
  \ifx\empty#1\relax
    \setbox\crambox=\copy\voidb@x
  \else
    \setbox\crambox=\vbox{\caption{#1}}%
  \fi
  \noindent\strut\begin{tikzpicture}[overlay, remember picture]
    \pgfextracty{\cramht}{\pgfpointdiff{\pgfpointanchor{current page text area}{south}}{\pgfpointorigin}}%
    \advance\cramht by \ht\strutbox
    \advance\cramht by -\ht\crambox
    \node[above, inner sep=0pt, yshift=\ht\crambox] at (current page text area.south) {\resizebox{\textwidth}{\cramht}{#2}};
  \end{tikzpicture}\par
  \ifvoid\crambox\else\vfill\noindent\usebox\crambox\fi
  \newpage
\egroup}
\makeatletter

\begin{document}
\lipsum[2-4]
\crammit[test caption]{\includegraphics{example-image-a}}
\end{document}

答案2

将浮标放置在固定位置(而不是让它们浮动)需要手动干预,没有办法解决。

(La)TeX 通常可以出色地处理浮点数,只要让它自己完成工作而不进行干预通常就足够了。

如果你想创建一张海报或者一些类似的固定布局文档,它用 LaTeX 完成(搜索“latex poster”,看看是否有其他方法可以满足你的要求),或者考虑使用类似墨景

相关内容