将表格和图像放在同一个浮动框中,强制表格和图形位于同一页面上

将表格和图像放在同一个浮动框中,强制表格和图形位于同一页面上

我知道我可以将两个放置tabular在单个table环境中并使用cref包引用两个表格,如下例所示:

\documentclass[oneside,11pt]{book}

\usepackage[semibold,tt=false]{libertine}
\usepackage{libertinust1math}
\usepackage[font={sf,small},labelsep=quad,labelfont=sc]{caption}
\usepackage[subrefformat=parens]{subcaption}
\usepackage[
  expansion = false ,
  tracking = smallcaps ,
  letterspace = 40 ,
]{microtype}
\usepackage[capitalize]{cleveref}
\usepackage{graphicx}

\begin{document}

\begin{table}
  \centering
  \begin{tabular}{ll}
    A & B\\
    C & D\\
  \end{tabular}
  \caption{Table A}\label{tab:a}
  
  \vspace*{2\floatsep}

  \begin{tabular}{ll}
    W & X\\
    Y & Z\\
  \end{tabular}
  \caption{Table B}\label{tab:b}
\end{table}

Refer to \cref{tab:a} and \cref{tab:b}.

\end{document}

mwe1

这是强制两个tabular人处于同一页面上的一种方法。

但是现在我想强制将 atabular和 an 图像放在同一页上。是否可以将 atabular和 an 图像放在同一个浮动框中?我尝试了以下方法(类似于这个答案):

\documentclass[oneside,11pt]{book}

\usepackage[semibold,tt=false]{libertine}
\usepackage{libertinust1math}
\usepackage[font={sf,small},labelsep=quad,labelfont=sc]{caption}
\usepackage[subrefformat=parens]{subcaption}
\usepackage[
  expansion = false ,
  tracking = smallcaps ,
  letterspace = 40 ,
]{microtype}
\usepackage[capitalize]{cleveref}
\usepackage{graphicx}

\begin{document}

\begin{figure}
  \centering
  \begin{tabular}{ll}
    E & F\\
    G & H\\
  \end{tabular}
  \caption{Table C}\label{tab:c}

  \vspace*{2\floatsep}

  \includegraphics[width=0.2\textwidth]{example-image}
  \caption{Figure A}\label{fig:a}
\end{figure}

Refer to \cref{tab:c} and \cref{fig:a}.

\end{document}

mwe2

但是,标签/标题不正确;“图 1”应为“表 1”。我该怎么办?

答案1

使用caption\captionof{<float type>}

在此处输入图片描述

\documentclass[oneside,11pt]{book}

\usepackage[semibold,tt=false]{libertine}
\usepackage{libertinust1math}
\usepackage[font={sf,small},labelsep=quad,labelfont=sc]{caption}
\usepackage[subrefformat=parens]{subcaption}
\usepackage[
  expansion = false ,
  tracking = smallcaps ,
  letterspace = 40 ,
]{microtype}
\usepackage[capitalize]{cleveref}
\usepackage{graphicx}

\begin{document}

\begin{table}
  \centering
  \begin{tabular}{ll}
    E & F\\
    G & H\\
  \end{tabular}
  \caption{Table C}\label{tab:c}

  \vspace*{2\floatsep}

  \begingroup
  \includegraphics[width=0.2\textwidth]{example-image}
  \captionof{figure}{Figure A}\label{fig:a}
  \endgroup
\end{table}

Refer to \cref{tab:c} and \cref{fig:a}.

\end{document}

这里实际上不需要对进行分组\captionof{figure}{<caption>},但建议将其放入\captionof组中,因为它会在本地更改宏。它已经位于环境提供的组中,并放置在浮动中的最后,因此如果您删除... table,它不会影响任何内容。\begingroup\endgroup

答案2

xcoffins包旨在将内容放置在页面上,并指定彼此之间的相对位置以及页面中的位置。在这种情况下,您需要垂直堆叠表格和图形并将其视为单个元素。

在这个解决方案中,定义了 4 个棺材(带有手柄的盒子),一个用于桌子,一个用于图形,最后两个用于各自的标题。

我选择表格和图形框的宽度为0.4\textwidth。标题框将自动调整其宽度以适应其各自的父框宽度。

组装过程只需三个步骤:将 的顶部中心CaptionTablex与 的底部中心连接起来Tablex,Y 偏移为 -\floatsep,然后对图形及其标题重复该操作。(标题不应该在表格上方吗?)

最后,将完整的组件排版在当前插入点,通常是文本区域左侧的基线上方。

这套全套都是文本对象,而不是浮点,因此不受 TeX 浮点机制的影响。这意味着可以将其插入到任何文本之前或之后、边距等处;甚至可以插入到文本区域之外。

[hc,b]指的是位于框底部水平中心的点, [hc,t]指的是位于框顶部水平中心的点。

\documentclass[oneside,11pt]{book}

\usepackage[semibold,tt=false]{libertine}
\usepackage{libertinust1math}
\usepackage[font={sf,small},labelsep=quad,labelfont=sc]{caption}
\usepackage[subrefformat=parens]{subcaption}
\usepackage[%
expansion = false ,
tracking = smallcaps ,
letterspace = 40 ,
]{microtype}
\usepackage[capitalize]{cleveref}
\usepackage{graphicx}

\usepackage{xcoffins} % added

\begin{document}

% allocate  
\NewCoffin\Tablex
\NewCoffin\Figx
\NewCoffin\CaptionTablex
\NewCoffin\CaptionFigx  

%fill
\SetVerticalCoffin\Tablex{0.4\textwidth}{%
    \centering
    \begin{tabular}{ll}
        E & F\\
        G & H\\
    \end{tabular}
}

\SetVerticalCoffin\Figx{0.4\textwidth}{%
    \centering
\includegraphics[width=0.2\textwidth]{example-image}
}

\SetVerticalCoffin\CaptionTablex{\CoffinWidth\Tablex}{\captionof{table}{Table C \label{tab:c}}} 
\SetVerticalCoffin\CaptionFigx{\CoffinWidth\Figx}{\captionof{figure}{Figure A \label{fig:a}}}

 % assembly
%\JoinCoffins\Tablex[hc,t]\CaptionTablex[hc,b](0pt,-0.5\floatsep ) % X Y offsets caption above table
\JoinCoffins\Tablex[hc,b]\CaptionTablex[hc,t](0pt,-0.5\floatsep ) % X Y offsets caption below table
\JoinCoffins\Tablex[hc,b]\Figx[hc,t](0pt,-\floatsep ) % X Y offsets
\JoinCoffins\Tablex[hc,b]\CaptionFigx[hc,t](0pt,-0.5\floatsep ) % X Y offsets

%typeset
\noindent\TypesetCoffin\Tablex(0pt, 0pt) % X Y offsets not needed here
\bigskip

Refer to \cref{tab:c} and \cref{fig:a}.

\end{document}

赏金

我希望读者能够意识到这种工具方法的效力和潜力,它能够以非常简单的方式处理许多不同的元素:表格、文本、图形、情节、规则等;并使用彼此的相对位置来容纳它们,而不是绝对坐标系。

我的工作方式类似于布局设计程序(几乎没有 GUI),通过在框中填充其内容,每个框都有自己的颜色、字体类型和大小以及图形材料,然后根据设计规范排列和对齐它们。 内容和图形设计之间有明显的分离。

浮动机制非常棒,但是它会将您的材料放在另一页,然后您必须翻页(在印刷文档中)才能看到图形或表格。由于它不是浮动,因此它提供了将任何一组元素定位在文档中的准确位置的可能性,这是本论坛中许多问题的主题,无需进一步的软件包。

答案3

我建议使用这个简单的解决方案floatrow,它可以让您并排显示表格和图形,以及它们各自的阳离子:

\documentclass[oneside,11pt]{book}

\usepackage[semibold,tt=false]{libertine}
\usepackage{libertinust1math}
\usepackage[font={sf,small}, labelsep=quad, labelfont=sc]{caption}
\usepackage[subrefformat=parens]{subcaption}
\usepackage[expansion=false, tracking=smallcaps, letterspace=40]{microtype}
\usepackage[capitalize]{cleveref}
\usepackage{graphicx}
\usepackage{floatrow}

\begin{document}

\begin{figure}
  \centering
\begin{floatrow}\TopFloatBoxes
\killfloatstyle \ttabbox[2\FBwidth]{\begin{tabular}{ll}
    E & F\\
    G & H\\
  \end{tabular}}
{\caption{Table C}\label{tab:c}}
%
\ffigbox{\includegraphics[width=0.2\textwidth]{example-image}}
 {\caption{Figure A}\label{fig:a}}
 \end{floatrow}
\end{figure}

Refer to \cref{tab:c} and \cref{fig:a}.

\end{document} 

在此处输入图片描述

相关内容