[Tex/LaTex] Center subfigure using floatrow

floatrowhorizontal alignmentsubfloats

I'm working with caption and subcaption to style my (sub)figure captions and especially with floatrow to center my figures. However, this does not work for subfigures, as the following nMWE (nearly minimal) example illustrates:

\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}

Clearly, the first figure gets centered and everything is fine. Though, comparing the second figures subfigures, I have to use \centering (illustraed in the second subfigure) to center, which does not work, by using \floatsetup[subfigure].

I would like to center subfigures without using \centering, but using a global package command. Any ideas how to obtain such layout using floatrow?
Any other approach is of course nice too, it's just, that i'm already using floatrow to center figures (globally).

PS: I'm using XeLaTeX, but I hope that does not change much in these observations.

Best Answer

First: you have included floatrow twice.

You can use ffigbox inside a figure environment:

enter image description here

\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}

Allergy notice: some parts of the above code might be nuts (or needless)


To answer your questions in comments (from the floatrow package manual):

Another command which creates figures - \ffigbox - puts caption below contents. The default width of caption equals to the width of text. [...] a float box, created by the \ffigbox command looks similar to the plain figure environment. But if you set, for example, the option [\FBwidth] [...] you’ll get a caption width equal to the width of picture [...]

There are similar boxes where the caption is placed elsewhere (eg: \fcapside places it beside the figure). As far as I know \floatsetup[subfigure]{objectset=centering} doesn't effect the subfigure environment of the subcaption package but these boxes.


If you hate this stack you can hope that is only my overcomplicated solution and there are better ones. Or you may want to try xpatch (or etoolbox) to do the "global" subcaption centering stuff (instead of using floatrow for that) as a "hail mary"...

\usepackage{xpatch}
\makeatletter
% \subcaption@minipage is the last macro call in \subfigure (and \begin{subfigure})
\xapptocmd{\subcaption@minipage}{\centering}{}{}
\makeatother