我有一个带有两个子浮点数的浮点数:
我希望圆圈从顶部垂直对齐,如下图所示。但我不希望将子标题放置在子浮动元素上方,但垂直对齐于下方,如上图所示。
我没有被任何特定的软件包所束缚(即使我subfig
在这个例子中使用了它)。我试过了http://gicl.cs.drexel.edu/people/tjkopena/wiki/pmwiki.php?n=SWAT.VerticallyAligningSubfigures,http://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}
答案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
)来设置子浮点数的行。\bsubfloativ
figure
如果有多行,则应\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
文档的最新版本,subfigure
和subfig
包都不应再使用;而应使用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
。它也会移动标题。