[Tex/LaTex] Override \centering to left justify an image

algorithmsgraphicshorizontal alignment

Background

Dozens of source code snippets inserted into a document as images inside of Algorithm floats. Other images are screen captures, inserted as Graphics floats, to make a distinction. All Graphic floats should be centred, thus the preamble contains:

% Resize figures that are too wide for the page.
\let\oldincludegraphics\includegraphics
\renewcommand\includegraphics[2][]{%
  \oldincludegraphics[width=\ScaleIfNeeded]{#2}
  \centering
}

This works, as ScaleIfNeeded is defined elsewhere, resulting in all images being centred, including the Algorithm images.

Problem

The Algorithm floats also contain images, and these images are centred, which is undesirable. The code for each Algorithm resembles:

\begin{algorithm}[H]
\includegraphics{source/sql/query-formatted.sql.png}
\caption{\label{alg:Query-with-Formatting}Query with Formatting}
\end{algorithm}

Ideas

Tried:

% Centre algorithms.
\let\oldalgorithm\algorithm
\let\endoldalgorithm\endalgorithm
\renewenvironment{algorithm}[1][ht]{%
  \begin{flushleft}
  \oldalgorithm[#1]
  \end{flushleft}
  }%
  {\endoldalgorithm}

This results in a number of errors ("Missing } inserted", amongst others).

Question

How can images embedded exclusively within Algorithm floats be left-justified?

Bonus Question

How can a thick, left-hand vertical rule (or any stylistic change) be made to the Algorithm floats? For example, the left-hand border on the "batch source text" from this indirectly-related question. (Or any source code snippets on SuperUser.com, for that matter.)

Thank you!

Best Answer

This is untested, but how about something like the following?

\expandafter\def\expandafter\algorithm\expandafter{%
        \expandafter\let\expandafter\centering\expandafter\relax
        \algorithm
}

This makes \centering do nothing in the algorithm environment. (There's actually a better way to do such things with the etoolbox package.) If you want, you could replace \relax with \raggedright (or better \RaggedRight from the ragged2e package) if you really want that behavior. The flushleft environment is not what you want since that's going to add extra space.

Edit:
Actually, I've got a better idea than redefining \centering locally which just feels wrong. How about this:

\let\oldincludegraphics\includegraphics[2][]{%
        \oldincludegraphics[width=\ScaleIfNeeded]{#2}%
        \graphicsalignment
}
\expandafter\def\expandafter\algorithm\expandafter{%
        \expandafter\let\expandafter\graphicsalignment\expandafter\relax
        \algorithm
}
\let\graphicsalignment\centering

Bonus Question:
Here's one idea for getting a rule.

\newdimen\coderulewidth \coderulewidth=1em
\newdimen\coderulesep \coderulesep=1em
\newdimen\coderuleseptemp
\newbox\codebox
\newenvironment{coderule}[1][\coderulesep]{%
        \par
        \coderuleseptemp=#1\relax
        \setbox\codebox=\vbox\bgroup
                \linewidth=\dimexpr\linewidth-\coderulewidth-\coderulesep\relax
                \hsize=\linewidth
}{%
        \egroup
        \noindent
        \strut
        \hbox{%
                \vrule width\coderulewidth
                \kern\coderuleseptemp
                \box\codebox
        }%
}

As an example of usage, here are a few grafs with the thick rule on the left (this example needs the lipsum package).

\begin{coderule}
\lipsum[1-2]
\end{coderule}

For an algorithmic, the algorithm is already indented, so you can use the optional argument (or just redefine \coderulesep).

\begin{algorithm}
\begin{coderule}[0pt]
\begin{algorithmic}
\STATE $x\gets0$
\STATE $y\gets1$
\STATE $z\gets x+y$
\end{algorithmic}
\end{coderule}
\end{algorithm}