使用一些组合[htpb!]
(或者我不知道的其他方法),是否可以允许放置浮动图形就在之前文中第一次引用,而不是下一页?
考虑一个例子:
\documentclass{article}
\usepackage{graphicx}
\usepackage{lipsum}% MWE only
\usepackage{cleveref}
\begin{document}
\section{Lorem ipsum}
\lipsum[1-2]
\section{Results}
\lipsum[3]
Results are shown in \cref{fig:results}.
\begin{figure}[hbt]
\includegraphics{Figures/results}
\caption{Some results}
\label{fig:results}
\end{figure}
\lipsum[1-4]
\end{document}
对于我的“结果”图表(pdf,大约 5 厘米见方),此代码会将其放置在下一页的顶部。在这种情况下,我希望图表位于同一页上,必要时位于文本中第一个参考文献的正上方。
是否有组合[htpb!]
可以按照这种优先顺序来放置浮点数?
- 这里
- 在本页底部
- 就在“这里”之前
- 在下一页顶部
第三个选项似乎是缺失的。根据我对浮动行为的理解,LaTeX 总是将浮动放在文本段落之间,这意味着段落之间应该有空格\lipsum[3]
我引用图形的段落之间应该有空格。那空格是我希望 LaTeX自动地放置图形时,下一个选项将是下一页。
不引用文中引用前的图表,有没有办法让图形出现在调用它的文本之前?
我想要的效果如下:
我通过将图形移到参考上方来实现这一点。我希望 LaTeX 能帮我做到这一点,但不是每次都这样——只有当下一个最佳选项是下一页的顶部时才这样做。
答案1
根据我的理解,预期的解决方案应该尝试阻止该图形漂浮的。下面提出的解决方案正是这样做的。
第一个解决方案根本不会让图形浮动。它只是\captionof
利用caption
包裹。
第二种解决方案是H
利用float
包裹。
\documentclass{article}
\usepackage{lipsum}
\usepackage{caption}
\usepackage{float}
\usepackage{cleveref}
\begin{document}
\section{First Method --- Use the \texttt{caption} Package}
\lipsum[1]
\begin{center}
Actual Figure\\
Actual Figure\\
Actual Figure
\captionof{figure}{Figure caption 1.}
\label{fig:results1}
\end{center}
Results are shown in \cref{fig:results1}.
\section{Second Method --- Use the \texttt{float} Package}
\lipsum[2]
\begin{figure}[H]
\begin{center}
Actual Figure\\
Actual Figure\\
Actual Figure
\caption{Figure caption 2.}
\label{fig:results2}
\end{center}
\end{figure}
Results are shown in \cref{fig:results2}.
\end{document}
答案2
默认的图形定位会将图形放置在当前页面的顶部。在此示例中,即使参考(和图形源)位于页面的最后一行,它也会放置在顶部。
\documentclass{article}
\usepackage{cleveref}
\usepackage{graphicx}
\begin{document}
aaa\\aaaaaa\\aaaaaa\\aaaaaa\\aaaaaa\\aaaaaa\\aaaaaa\\aaaaaa\\aaa
aaa\\aaaaaa\\aaaaaa\\aaaaaa\\aaaaaa\\aaaaaa\\aaaaaa\\aaaaaa\\aaa
\section{Results}
Results are shown in \cref{fig:results}%
\begin{figure}
\includegraphics[width=\textwidth]{example-image}
\label{fig:results}
\end{figure}.
aaa\\aaaaaa\\aaaaaa\\aaaaaa\\aaaaaa\\aaaaaa\\aaaaaa\\aaaaaa\\aaa
aaa\\aaaaaa\\aaaaaa\\aaaaaa\\aaaaaa\\aaaaaa\\aaaaaa\\aaaaaa\\aaa
\end{document}
引用的是第 1 节而不是图,因为没有标题,这是问题中代码的一个特点:-)
答案3
此解决方案使用 tikzpagenodes 来确定页面上剩余多少空间。它还使用辅助文件在两个位置之间进行通信。因此,需要运行 3 次才能获得稳定的解决方案。
这个想法是,bifigure
如果环境不适合放在所需的位置,则将其放置在您想要的位置\bilocation
。如果环境不适合任何一个位置,它将被移动到下一页的顶部。
在这种情况下,26\baslineskip
或更少将适合所需位置,27\baselineskip
将适合第一个位置,33\baselineskip
并将出现在下一页。
\documentclass{article}
\usepackage{graphicx}
\usepackage{tikzpagenodes}
\usepackage{environ}
\usepackage{afterpage}
\usepackage{lipsum}% MWE only
\usepackage{cleveref}
\newcounter{binumber}
\newsavebox{\bipolar}
\newlength{\bidistance}
\newif\ifbipolar% okay to expand image at \bilocation
\newcommand{\newbilocation}[3]% #1 = bifigure counter, #2 = \thepage, #3 = \bidistance)
{\expandafter\xdef\csname bipage#1\endcsname{#2}
\expandafter\xdef\csname bidistance#1\endcsname{#3}}
\makeatletter
\NewEnviron{bifigure}{% place at secondary (first) location
\stepcounter{binumber}%
\parindent=0pt
\parskip=0pt
\def\@captype{figure}%
\global\setbox\bipolar=\vbox{\BODY}%
\@ifundefined{bipage\thebinumber}% first time
{\afterpage{\clearpage\usebox\bipolar\vskip\textfloatsep}}%
{\expandafter\let\expandafter\bipage\csname bipage\thebinumber\endcsname\relax
\ifnum\bipage=\value{page}%
\expandafter\bidistance\csname bidistance\thebinumber\endcsname\relax
\else
\bidistance=0pt
\fi
\ifdim\bidistance<\dimexpr \ht\bipolar+\dp\bipolar+\textfloatsep\relax
\tikz[remember picture]{\pgfextracty{\bidistance}{\pgfpointdiff{\pgfpointorigin}%
{\pgfpointanchor{current page text area}{south}}}%
\global\bidistance=-\bidistance}%
\ifdim\bidistance<\dimexpr \ht\bipolar+\dp\bipolar+\textfloatsep\relax
\global\bipolartrue% let \bilocation handle it
\else
\vskip\textfloatsep
\usebox\bipolar
\vskip\textfloatsep
\global\bipolarfalse
\fi
\else
\global\bipolartrue
\fi}%
}
\newcommand{\bilocation}% place at preferred (second) location
{\tikz[remember picture]{\pgfextracty{\bidistance}{\pgfpointdiff{\pgfpointorigin}%
{\pgfpointanchor{current page text area}{south}}}%
\global\bidistance=-\bidistance}%
\ifbipolar
\ifdim\bidistance<\dimexpr \ht\bipolar+\dp\bipolar+\textfloatsep\relax
\afterpage{\clearpage\usebox\bipolar\vskip\textfloatsep}% next apge
\else
\vskip\textfloatsep
\usebox\bipolar
\vskip\textfloatsep
\fi
\else% account for existing image
\advance\bidistance by \dimexpr \ht\bipolar+\dp\bipolar+2\textfloatsep\relax
\fi
\protected@write\@auxout{\let\arabic=\relax}%
{\string\newbilocation{\thebinumber}{\arabic{page}}{\the\bidistance}}%
}
\makeatother
\begin{document}
\rule{1pt}{33\baselineskip}
\begin{bifigure}
\centering
\includegraphics[height=.2\textheight]{example-image}
\caption{Needed for label}\label{fig:results}
\end{bifigure}
\section{Results}
Results are shown in \cref{fig:results}.
\bilocation
\lipsum[1-4]\clearpage
\end{document}