[Tex/LaTex] Vertical alignment of subfigures with different subcaptions length

subcaptionsubfloatsvertical alignment

I would like to vertically align 3 subfigures (same size), but I don't manage to do so if the subcaptions have different lengths, like here:

enter image description here

This is the code that generated the image:

\documentclass[12pt, a4paper]{report}
\usepackage{graphicx}
\usepackage{mathtools}
\usepackage[hidelinks]{hyperref} 
\usepackage{subcaption}
\begin{document}
\begin{figure}[h!]
\centering
\caption{3D printed wax mould post processing}
\label{fig:Mould}
\begin{subfigure}[t!]{0.3\linewidth}
    \centering
    \includegraphics[width=1\linewidth]{./Experimental/MouldWithSupport}
    \caption{Just after removal from the 3D printer plate}
    \label{fig:MouldWithSupport}
\end{subfigure}
\begin{subfigure}[t!]{0.3\linewidth}
    \centering
    \includegraphics[width=1\linewidth]{./Experimental/MouldAfterWashing}
    \caption{After removal of support wax and ultrasonic cleaning}
    \label{fig:MouldAfterWashing}       
\end{subfigure}
\begin{subfigure}[t!]{0.3\linewidth}
    \centering
    \includegraphics[width=1\linewidth]{./Experimental/MouldAfterSilanization}
    \caption{After silanization}
    \label{fig:MouldAfterSilanization}      
\end{subfigure}
\end{figure}
\end{document}

Best Answer

Don't write t!. The ! is used with float specifiers, but in this case the optional argument has to do with where to 'anchor' the subfigure. Remove all the ! and the subfigures are top-aligned.

Alternatively, as mentioned by Axel Sommerfeldt in the comments, you could use \subcaptionbox, which automatically aligns the first lines of the subcaptions. By default, this will place the subcaptions on the same side of the figures as the main caption (in this case, above). To have the subcaption on the bottom, you can load subcaption with the option position=b, or use \captionsetup[subfigure]{position=b}.

In the code below I added the \captionsetup line within the second figure environment, which makes the setting local to that figure. By adding it to the preamble (or using \usepackage[position=b]{subcaption}) the setting is global.

Finally, I also added \hfill between the subfigures/subcaptionboxes to space them out on the line. With your code, there was a normal interword space between them.

(The demo option to graphicx replaces all images with black rectangles.)

\documentclass[12pt, a4paper]{report}
\usepackage[demo]{graphicx}
\usepackage{mathtools}
\usepackage[hidelinks]{hyperref} 
\usepackage{subcaption}
\begin{document}
\begin{figure}[h!]
\centering
\caption{3D printed wax mould post processing}
\label{fig:Mould}
\begin{subfigure}[t]{0.3\linewidth}
    \centering
    \includegraphics[width=1\linewidth]{./Experimental/MouldWithSupport}
    \caption{Just after removal from the 3D printer plate}
    \label{fig:MouldWithSupport}
\end{subfigure}
\begin{subfigure}[t]{0.3\linewidth}
    \centering
    \includegraphics[width=1\linewidth]{./Experimental/MouldAfterWashing}
    \caption{After removal of support wax and ultrasonic cleaning}
    \label{fig:MouldAfterWashing}       
\end{subfigure}
\begin{subfigure}[t]{0.3\linewidth}
    \centering
    \includegraphics[width=1\linewidth]{./Experimental/MouldAfterSilanization}
    \caption{After silanization}
    \label{fig:MouldAfterSilanization}      
\end{subfigure}
\end{figure}

\begin{figure}[h!]
\captionsetup[subfigure]{position=b}
\centering
\caption{3D printed wax mould post processing}
\label{fig:Mould}
\subcaptionbox{Just after removal from the 3D printer plate\label{fig:MouldWithSupport}}{\includegraphics[width=.3\linewidth]{./Experimental/MouldWithSupport}}
\subcaptionbox{After removal of support wax and ultrasonic cleaning \label{fig:MouldAfterWashing}}{\includegraphics[width=.3\linewidth]{./Experimental/MouldAfterWashing}}
\subcaptionbox{After silanization \label{fig:MouldAfterSilanization}}{\includegraphics[width=.3\linewidth]{./Experimental/MouldAfterSilanization}}
\end{figure}
\end{document}

enter image description here

Related Question