[Tex/LaTex] the difference between \hspace*{\fill} and \hfill

lengthsspacing

In the memoir manual on page 183 ,this example is given:

\begin{figure}
\centering
\hspace*{\fill}
{ILLUSTRATION 1} \hfill {ILLUSTRATION 2}
\hspace*{\fill}
\caption{Example float with two illustrations}
\label{fig:mult1}
\end{figure}

I have tried to figure out, what the difference between \hspace*{\fill} and \hfill is!?

The \hfill definition and \hspace definition did not help me much.

Best Answer

Using your code snippet as an example, \centering only has an impact on the \caption. However,

\hspace*{\fill}
{ILLUSTRATION 1} \hfill {ILLUSTRATION 2}
\hspace*{\fill}

is meant to set ILLUSTRATION 1 and ILLUSTRATION 2 even distributed across \textwidth:

enter image description here

\documentclass{article}
\usepackage{showframe}% http://ctan.org/pkg/showframe
\begin{document}
\begin{figure}
\centering
\hspace*{\fill}
{ILLUSTRATION 1} \hfill {ILLUSTRATION 2}
\hspace*{\fill}
\caption{Example float with two illustrations}
\label{fig:mult1}
\end{figure}
\end{document}

However, replacing \hspace*{\fill} with \hfill, the space from the right margin is "gobbled":

enter image description here

\documentclass{article}
\usepackage{showframe}% http://ctan.org/pkg/showframe
\begin{document}
\begin{figure}
\centering
\hfill%\hspace*{\fill}
{ILLUSTRATION 1} \hfill {ILLUSTRATION 2}%
\hfill%\hspace*{\fill}
\caption{Example float with two illustrations}
\label{fig:mult1}
\end{figure}
\end{document}

giving value to the command definition for \hspace*:

LaTeX removes horizontal space that comes at the end of a line. If you don't want LaTeX to remove this space, include the optional * argument. Then the space is never removed.

An alternative to use if \hfill is more intuitive than \hspace*{\fill}, is to insert dummy text (like \null or \mbox{}) at the (start and) end of the line. That way the \hfill will always have "something to infinitely stretch against":

\null\hfill%
{ILLUSTRATION 1} \hfill {ILLUSTRATION 2}%
\hfill\null%

In the above examples, showframe merely highlighted the text block.