图形是否可以出现在文中第一个引用之前?

图形是否可以出现在文中第一个引用之前?

使用一些组合[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!]可以按照这种优先顺序来放置浮点数?

  1. 这里
  2. 在本页底部
  3. 就在“这里”之前
  4. 在下一页顶部

第三个选项似乎是缺失的。根据我对浮动行为的理解,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}

相关内容