![使用 floatrow 居中子图](https://linux22.com/image/263662/%E4%BD%BF%E7%94%A8%20floatrow%20%E5%B1%85%E4%B8%AD%E5%AD%90%E5%9B%BE.png)
我正在处理caption
并subcaption
设置我的(子)图标题的样式,尤其是使用 floatrow 使我的图居中。但是,这对子图不起作用,如以下 nMWE(几乎最小)示例所示:
\documentclass[a4paper,12pt]{scrartcl}
\usepackage{floatrow}
\usepackage{tikz,floatrow,hyperref}
\usepackage[hypcap=true]{caption}
\usepackage[hypcap=true]{subcaption}
\usepackage[all]{hypcap} %link to top of figure
% caption format
\captionsetup{format=hang,labelsep=space,indention=-2cm,labelfont=bf,width=.9\textwidth,skip=.5\baselineskip}
\captionsetup[sub]{labelfont=bf,labelsep=period,subrefformat=simple,labelformat=simple}
%center both ?
\floatsetup[figure]{objectset=centering}
\floatsetup[subfigure]{objectset=centering} %does not center subfigures
\begin{document}
\begin{figure}
\begin{tikzpicture}
\draw[fill=blue] (0,0) rectangle (4,4);
\end{tikzpicture}
\caption{First}
\end{figure}
\begin{figure}
\begin{subfigure}{.49\textwidth}%\centering is not centered without centering
\begin{tikzpicture}
\draw[fill=blue] (0,0) rectangle (4,4);
\end{tikzpicture}
\caption{First}
\end{subfigure}
\begin{subfigure}{.49\textwidth}\centering
\begin{tikzpicture}
\draw[fill=blue] (0,0) rectangle (5,5);
\end{tikzpicture}
\caption{Second}
\end{subfigure}
\caption{Describing both subfigures}
\end{figure}
\end{document}
显然,第一个图形居中,一切正常。但是,比较第二个图形的子图,我必须使用\centering
(如第二个子图所示)来居中,但使用 不起作用\floatsetup[subfigure]
。
我想不使用\centering
而是使用全局包命令来居中子图。有什么想法可以使用 来获得这样的布局吗floatrow
?当然,任何其他方法也很好,只是,我已经用它floatrow
来居中图形(全局)。
附言:我正在使用 XeLaTeX,但我希望这些观察结果不会发生太大变化。
答案1
首先:你有包含floatrow
两次。
您可以ffigbox
在figure
环境中使用:
\documentclass[a4paper,12pt]{scrartcl}
\usepackage{tikz,floatrow,hyperref}
\usepackage[hypcap=true]{caption}
\usepackage[hypcap=true]{subcaption}
\usepackage[all]{hypcap} %link to top of figure
% caption format
\captionsetup{format=hang,labelsep=space,indention=-2cm,labelfont=bf,width=.9\textwidth,skip=.5\baselineskip}
\captionsetup[sub]{labelfont=bf,labelsep=period,subrefformat=simple,labelformat=simple}
%center both ?
\floatsetup[figure]{objectset=centering}
\floatsetup[subfigure]{objectset=centering}
\begin{document}
\begin{figure}
\begin{tikzpicture}
\draw[fill=blue] (0,0) rectangle (4,4);
\end{tikzpicture}
\caption{First}
\end{figure}
\ffigbox[\FBwidth]{%
\begin{subfloatrow}
\ffigbox[0.5\textwidth]{%
\begin{tikzpicture}
\draw[fill=blue] (0,0) rectangle (4,4);
\end{tikzpicture}}{\caption{First}}
\ffigbox[0.5\textwidth]{%
\begin{tikzpicture}
\draw[fill=blue] (0,0) rectangle (5,5);
\end{tikzpicture}}{\caption{Second}}%
\end{subfloatrow}%
}{\caption{Describing both subfigures}}
\end{document}
过敏通知:上述代码的某些部分可能有些不合理(或不必要)
为了回答您在评论中提出的问题(来自floatrow
包装手册):
另一个创建图形的命令 -
\ffigbox
- 将标题置于内容下方。标题的默认宽度等于文本的宽度。[...] 由该\ffigbox
命令创建的浮动框看起来类似于普通图形环境。但是,如果您设置,例如,选项[\FBwidth]
[...] 您将获得一个等于图片宽度的标题 [...]
有类似的框,其中标题放在其他地方(例如:\fcapside
放在图形旁边)。据我所知,\floatsetup[subfigure]{objectset=centering}
不会影响包装subfigure
的环境subcaption
,但会影响这些框。
如果你讨厌这个堆栈,你可以希望这只是我过于复杂的解决方案,还有更好的解决方案。或者您可能想尝试xpatch
(或etoolbox
)将“全局”子标题居中操作(而不是将floatrow
其用作)作为“万福玛利亚”……
\usepackage{xpatch}
\makeatletter
% \subcaption@minipage is the last macro call in \subfigure (and \begin{subfigure})
\xapptocmd{\subcaption@minipage}{\centering}{}{}
\makeatother