我有一份两列文档,我尝试放置一个与文本无关的图形,而是与页面和列有关(例如,第二页,右列,即使我稍后添加文本)。
目前,无论我将图形放在哪里,或使用哪些标志(例如!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 页,“引用当前页面节点 - 绝对定位”一节)。