将子浮动垂直对齐在顶部,同时将子标题垂直对齐在子浮动下方

将子浮动垂直对齐在顶部,同时将子标题垂直对齐在子浮动下方

我有一个带有两个子浮点数的浮点数:

A float with two subfloats

我希望圆圈从顶部垂直对齐,如下图所示。希望将子标题放置在子浮动元素上方,但垂直对齐于下方,如上图所示。

A float with two subfloats with subcaptions above them

我没有被任何特定的软件包所束缚(即使我subfig在这个例子中使用了它)。我试过了http://gicl.cs.drexel.edu/people/tjkopena/wiki/pmwiki.php?n=SWAT.VerticallyAligningSubfigureshttp://www.howtotex.com/tips-tricks/vertical-alignment-of-subfigures/https://stackoverflow.com/questions/2328403/vertical-alignment-of-subfigures-latex没有成功。

\documentclass{article}

\usepackage{tikz}
\usepackage{subfig}

%\captionsetup[subfloat]{position=top}% Uncomment this to generate the second figure

\begin{document}

\begin{figure}
\centering
\subfloat[Small circle]{%
  \begin{tikzpicture}
    \draw circle (1.25cm) {};
  \end{tikzpicture}%
}
\qquad
\subfloat[Big circle]{%
  \begin{tikzpicture}
    \draw circle (2cm) {};
  \end{tikzpicture}%
}
\caption{Circles}
\end{figure}

\end{document}

答案1

根据建议Mico 在他的回答中可以使用floatrow包来完成。要制作子标题,它取决于 ,subcaption这取决于caption

\documentclass{article}

\usepackage{tikz}
\usepackage{caption}
\usepackage{subcaption}
\usepackage{floatrow}
\usepackage{calc}% To calculate width for \FBwidth

\floatsetup{ 
  heightadjust=object,
  valign=t
}

\begin{document}

\begin{figure}
\ffigbox
{%
  \begin{subfloatrow}
    \ffigbox[\FBwidth+0.5cm]% Width of subfloat
    {%
      \begin{tikzpicture}
        \draw circle (1.25cm) {};
      \end{tikzpicture}%
    }
    {%
      \subcaption{Small circle}%
    }
    \ffigbox[\FBwidth+0.5cm]% Width of subfloat
    {%
      \begin{tikzpicture}
        \draw circle (2cm) {};
      \end{tikzpicture}%
    }
    {%
      \subcaption{Big circle}%
    }
  \end{subfloatrow}
}
{%
  \caption{Circles}%
}
\end{figure}

\end{document}

Vertically top-aligned circles with vertically aligned subcaptions below

答案2

虽然不是自动过程,但使用起来也不难:

\documentclass{article}

\usepackage{tikz}
\usepackage{subfig}

\newcount\bsubfloatcount
\newtoks\bsubfloattoks
\newdimen\bsubfloatht

\makeatletter
\newcommand{\bsubfloat}[2][]{%
  \sbox\z@{#2}%
  \ifdim\bsubfloatht<\ht\z@
    \bsubfloatht=\ht\z@
  \fi
  \advance\bsubfloatcount\@ne
  \@namedef{bsubfloat\romannumeral\bsubfloatcount}{%
    \subfloat[#1]{\vbox to\bsubfloatht{\hbox{#2}\vfill}}}%
}
\newcommand{\resetbsubfloat}{\bsubfloatcount\z@\bsubfloatht=\z@}
\makeatother

\begin{document}

\begin{figure}
\centering
\bsubfloat[Small circle]{%
  \begin{tikzpicture}
    \draw circle (1.25cm) {};
  \end{tikzpicture}%
}
\bsubfloat[Big circle]{%
  \begin{tikzpicture}
    \draw circle (2cm) {};
  \end{tikzpicture}%
}
\bsubfloati\qquad\bsubfloatii
\caption{Circles}
\end{figure}

\end{document}

这些\bsubfloat命令仅用于进行计算,然后您可以使用\bsubfloati、、\bsubfloatii等(它们在每个环境中都会重置\bsubfloatiii)来设置子浮点数的行。\bsubfloativfigure

如果有多行,则应\resetbsubfloat在它们之间使用并再次使用,\bsubfloati依此类推进行放置。

更加自动化的程序

这是一个,它有一些弱点,但它应该可以工作。

\documentclass{article}

\usepackage{tikz}
\usepackage{subfig}

\newtoks\bsubfloattoks
\newdimen\bsubfloatht

\makeatletter
\newenvironment{bsubfloatrows}[1][\quad]
  {\def\bsubfloatspace{#1}\resetbsubfloatrows
   \def\\{\printbsubfloatrow\resetbsubfloatrows\par
     \@ifnextchar[{\bsubfloatvspace}{}}%
   \def\bsubfloatvspace[##1]{\vspace{##1}}%
  }
  {\printbsubfloatrow}
\newcommand{\bsubfloat}[2][]{%
  \sbox\z@{#2}%
  \ifdim\bsubfloatht<\ht\z@
    \bsubfloatht=\ht\z@
  \fi
  \bsubfloattoks=\expandafter{\the\bsubfloattoks
    \bsubfloatspace\subfloat[#1]{\vbox to\bsubfloatht{\hbox{#2}\vfill}}}%
}
\newcommand\resetbsubfloatrows{\bsubfloatht\z@\bsubfloattoks={\@gobble}}
\newcommand{\printbsubfloatrow}{\the\bsubfloattoks}
\makeatother



\begin{document}

\begin{figure}
\centering
\begin{bsubfloatrows}[\hfill]
\bsubfloat[Small circle]{%
  \begin{tikzpicture}
    \draw circle (1.25cm) {};
  \end{tikzpicture}%
}
\bsubfloat[Big circle]{%
  \begin{tikzpicture}
    \draw circle (2cm) {};
  \end{tikzpicture}%
}
\\[36pt]
\bsubfloat[Small circle]{%
  \begin{tikzpicture}
    \draw circle (1cm) {};
  \end{tikzpicture}%
}
\bsubfloat[Big circle]{%
  \begin{tikzpicture}
    \draw circle (1.2cm) {};
  \end{tikzpicture}%
}
\end{bsubfloatrows}
\caption{Circles}
\end{figure}

\end{document}

如您所见,子浮点数被封装在一个环境中,其中每行的高度都是单独处理的。两个子浮点数之间的水平间距是作为环境的可选参数给出的(这是一个缺点)。

答案3

简短的介绍性说明:根据该l2tabu文档的最新版本,subfiguresubfig包都不应再使用;而应使用subcaption包(来自包的同一作者caption)。

您描述的问题最好使用该floatrow软件包来解决,因为它提供了各种方法来对齐并排(子)图的内容及其各自的标题。不幸的是,我发现软件包手册的写作风格很难理解,所以我无法想出一个可行的 MWE。希望你会有更好的运气。:-)

答案4

subfig通过替换另一个包解决了该问题。

对于那些需要或想要使用的人来说subfig,这是我经过多次挫折后得出的简单/破解解决方案:

\documentclass{article}
\usepackage{subfig,tikz,adjustbox}

\begin{document}
\begin{figure}
\subfloat[Some caption]{\raisebox{5ex}[0pt][0pt]{\tikz \node [fill=green, minimum width=0.4\linewidth, minimum height=5ex] {};}}
\hfill
\subfloat[Some caption]{\tikz \node [fill=blue, minimum width=0.4\linewidth, minimum height=10ex] {};}
\end{figure}
\end{document}

\subfloat不允许换行或类似的东西,这样可以添加一些垂直空间。任何增加 tikz 图片高度的尝试也会移动标题。\raisebox我发现使用是解决这些问题的唯一方法。

此外,\raisebox[0pt][0pt]避免任何内边界。

当然,这是一种 hack,因为你需要目测垂直偏移。但如果你想继续使用,这是我能想到的唯一解决方案subfig

如果你使用\includegraphics而不是 tikzpicture,参见此答案如何让它更优雅地工作。不幸的是,即使使用,这对 tikzpicture 也不起作用\adjustbox。它也会移动标题。

相关内容