我经常发现自己需要改变图形的大小或删除元素(例如段落和图形)之间的垂直空间,以便 \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
- 否 -> 完成
在 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”,看看是否有其他方法可以满足你的要求),或者考虑使用类似墨景。