将图片固定到双列文档的页面和列上

将图片固定到双列文档的页面和列上

我有一份两列文档,我尝试放置一个与文本无关的图形,而是与页面和列有关(例如,第二页,右列,即使我稍后添加文本)。
目前,无论我将图形放在哪里,或使用哪些标志(例如!ht),图形都不会放置在右列中。

\begin{figure}[!ht]
\begin{center}
\fbox{\rule{0pt}{2in} \rule{0.9\linewidth}{0pt}}
   %\includegraphics[width=0.8\linewidth]{egfigure.eps}
\end{center}
   \caption{Some comment}
\end{figure}

我正在使用 Overleaf 和CVPR 2018 模板

编辑:
根据 John Kormylo 的出色回答,我也尝试对单列文档做类似的事情,但可能错过了一些关于如何更改代码的内容。
这是我目前针对单列页面的版本:

\newcommand{\delayfloat}[3]{% #1=figure or table, #2=page, #3=savebox
  \ifnum\value{page}<#2\relax
    \afterpage{\delayfloat{#1}{#2}{#3}}%
  \else
    \delaymatchtrue

    \ifdelaymatch
      \begin{#1}[t]
        \box#3
      \end{#1}
    \else
      \afterpage{\delayfloat{#1}{#2}{#3}}%
    \fi
  \fi}

\newenvironment{delayed}[3]{% #1=figure or table, #2=page, #3=savebox

  \def\delayed@box{#3}% copy args to macros
  \def\delayed@args{{#1}{#2}{#3}}%
  \begin{lrbox}{#3}\begin{minipage}{\columnwidth}%
    \def\@captype{#1}%
}{% \enddelayed (no args)
  \end{minipage}\end{lrbox}%
  \global\setbox\delayed@box=\copy\delayed@box
  \expandafter\delayfloat\delayed@args
}

\newif\ifdelaymatchtop

\newcommand{\delaytop}[2]{% #1=page, #2=savebox
    \afterpage{\delaytop{#1}{#2}}%
  }

\newenvironment{delayedtop*}[3]{% #1=figure or table, #2=page, #3==savebox
  \def\delayedtop@box{#3}% copy args to macros
  \def\delayedtop@args{{#2}{#3}}%
  \begin{lrbox}{#3}\begin{minipage}{\textwidth}%
    \def\@captype{#1}%
}{% \enddelayed* (no args)
  \end{minipage}\end{lrbox}%
  \global\setbox\delayedtop@box=\copy\delayedtop@box
  \expandafter\delaytop\delayedtop@args
}

但文档中完全没有图片和表格。新文档中的示例图片:

\begin{delayedtop*}{figure}{11}{\tempboxPartial}
  \centering% the center environment wastes space
  \includegraphics[width=\linewidth]{photos/partial_corr.png}
  \caption{Caption.} 

  \label{fig:partial_corr}
\end{delayedtop*}

答案1

此解决方案用于将\afterpage浮动创建延迟到所需的页面和列(在本例中为第 2 页,右列)。请注意,您需要\delayfloat为每个要延迟的图形或表格创建一个新的宏。

此外,标题编号可能不正确。

\documentclass[twocolumn]{article}
\usepackage{afterpage}
\usepackage{lipsum}% MWE only

\begin{document}

\makeatletter
\newcommand{\delayfloatA}{\ifnum\value{page}=2
  \if@firstcolumn \afterpage{\delayfloatA}%
  \else
    \begin{figure}[t]
      \centering% the center environment wastes space
      \fbox{\rule{0pt}{2in} \rule{0.9\linewidth}{0pt}}
      %\includegraphics[width=0.8\linewidth]{egfigure.eps}
      \caption{Some comment}
    \end{figure}
    \global\let\delayfloatA=\relax
  \fi
\else \afterpage{\delayfloatA}%
\fi}
\makeatother

\delayfloatA
\lipsum[1-16]

\end{document}

该版本要求每个延迟浮点都有一个保存框。您需要做的就是将浮点类型、页面、列号、保存框 ID(参数)和浮点内容(主体)传递给环境delayed

标题将按照放入保存箱的顺序进行编号。

\documentclass[twocolumn]{article}
\usepackage{afterpage}
\usepackage{lipsum}% MWE only

\makeatletter
\newif\ifdelaymatch

\newcommand{\delayfloat}[4]{% #1=figure or table, #2=page, #3=1/2 (column), #4=savebox
  \ifnum\value{page}<#2\relax
    \afterpage{\delayfloat{#1}{#2}{#3}{#4}}%
  \else
    \delaymatchfalse
    \ifcase#3\relax\or% #3=1
      \if@firstcolumn \delaymatchtrue \fi
    \or% #3=2
      \if@firstcolumn\else \delaymatchtrue \fi
    \fi
    \ifdelaymatch
      \begin{#1}[t]
        \box#4
      \end{#1}
    \else
      \afterpage{\delayfloat{#1}{#2}{#3}{#4}}%
    \fi
  \fi}

\newenvironment{delayed}[4]{% #1=figure or table, #2=page, #3=1/2 (column), #4=savebox
  \ifcase#3\relax
    \errmessage{Bad delayed column argument: #3 (must be 1 or 2)}%
  \or\or\else
    \errmessage{Bad delayed column argument: #3 (must be 1 or 2)}%
  \fi
  \def\delayed@box{#4}% copy args to macros
  \def\delayed@args{{#1}{#2}{#3}{#4}}%
  \begin{lrbox}{#4}\begin{minipage}{\columnwidth}%
    \def\@captype{#1}%
}{% \enddelayed (no args)
  \end{minipage}\end{lrbox}%
  \global\setbox\delayed@box=\copy\delayed@box
  \expandafter\delayfloat\delayed@args
}
\makeatother

\newsavebox{\tempboxA}

\begin{document}

\begin{delayed}{figure}{2}{2}{\tempboxA}
  \centering% the center environment wastes space
  \fbox{\rule{0pt}{2in} \rule{0.9\linewidth}{0pt}}
  %\includegraphics[width=0.8\linewidth]{egfigure.eps}
  \caption{Some comment}
\end{delayed}

\lipsum[1-16]

\end{document}

此版本在第 2 页安装了一个图*。更准确地说,它使用 的标题\twocolumn来伪造图*。每页只有一个,如果您尝试使用当前页面,它会立即破坏页面。

\documentclass[twocolumn]{article}
\usepackage{afterpage}
\usepackage{lipsum}% MWE only
%\usepackage{showframe}

\makeatletter
\newif\ifdelaymatch

\newcommand{\delaytop}[2]{% #1=page, #2=savebox
  \ifnum\value{page}<#1\relax
    \afterpage{\delaytop{#1}{#2}}%
  \else
    \twocolumn[\box#2\par\vskip\dbltextfloatsep]%
  \fi}

\newenvironment{delayed*}[3]{% #1=figure or table, #2=page, #3==savebox
  \def\delayed@box{#3}% copy args to macros
  \def\delayed@args{{#2}{#3}}%
  \begin{lrbox}{#3}\begin{minipage}{\textwidth}%
    \def\@captype{#1}%
}{% \enddelayed* (no args)
  \end{minipage}\end{lrbox}%
  \global\setbox\delayed@box=\copy\delayed@box
  \expandafter\delaytop\delayed@args
}
\makeatother

\newsavebox{\tempboxB}

\begin{document}

\begin{delayed*}{figure}{2}{\tempboxB}
  \centering% the center environment wastes space
  \fbox{\rule{0pt}{2in} \rule{0.9\linewidth}{0pt}}
  %\includegraphics[width=0.8\linewidth]{egfigure.eps}
  \caption{Some comment}\label{test}
\end{delayed*}

\lipsum[1-16]

\end{document}

答案2

将图形放置在所需位置的另一种方法是使用包装float

将图形的代码写在您想要图形的位置,并将其放在图形开头的旁边H

例子:

\begin{figure}[H]
    your code here
\end{figure}

答案3

如果你不想让浮动对象浮动(afigure是浮动对象),你可以手动放置它们。删除环境figure并将图形精确地包含在你想要的位置。你可以使用标题包来手动放置字幕。

\documentclass[twocolumn]{article}

\usepackage{caption}

\begin{document}

\begin{center}
   \includegraphics[width=0.8\linewidth]{egfigure.eps}
\end{center}
\captionof{figure}{Some comment}

\end{document}

请注意,这种方法依赖于您手动定位图形。它不允许定义独立于周围文本的“第二页,右栏”之类的位置。您可能能够使用 TikZ 解决问题(请参阅TikZ 手册,第 257 页,“引用当前页面节点 - 绝对定位”一节)。

相关内容