\S is defined with
\DeclareRobustCommand, so redefining it with
\renewcommand is not the best strategy, see When to use \LetLtxMacro?
If you really want a space after
\S (which is not usual, I should say), it's better to act at a lower level.
The kernel definition of
% latex.ltx, line 1798:
so a better strategy would be
\let\S\relax % to avoid spurious warnings
You surely don't want a line break after §, do you? So
~ is necessary. Using
\xspace doesn't guarantee that a line break is not taken at the space.
\S command that ends up in a caption or other moving argument will result in two spaces. Why?
When LaTeX writes in the
.aux file a command
\S 1 appearing in a figure caption, it will write
\protect \S \ 1
because the expansion of
\OldS is still
\protect\S. The same would be written out in the
.lof file. When the
.lof file is read in,
\protect will be ignored, and
\S will be interpreted normally as
\OldS\; this means two spaces, because the following
\ would still be there.
For having “double §”, you can do
\NS 1 and \NS\NS 2--3
\S for the cases where you don't want a space (I can't see when, though).
However, I believe that the simplest way is to type
\S~1 and \S\S~2--3