# Whitespace macro

I would like to have a macro which produces N white spaces if called like this

\mulspc{3} % Produces exactly 3 spaces

\newcommand{\mulspc}[1]{
\newcounter{ctra}
\setcounter{ctra}{0}
\whiledo {\value{ctra} < #1}%
{
\hspace*{2mm}
\stepcounter{ctra}
}
}


But I have problems that this macro does not produce 0mm spacing in a table cell (just at the beginning of the cell!) if I call zero times \multspc{0}. There is always some indent, but where does this come from?

I need this macro to indent some algorithm in the table cell, its nasty but manualy formating gives me the best result in a longtable, because its multiple pages long...

-

No need for using a loop:

\newlength\Unit
\setlength\Unit{2mm}
\newcommand\mulspc[1]{\hspace*{#1\Unit}}

foo\mulspc{4}bar

-
...now that's clean! Nice! –  Werner Aug 10 '11 at 19:26

The problem with the current macro is that it unwanted whitespace is added from due to indentation. Add some % add the line ends to get rid of these. However, the current definition also produces a warning after you use \mulspc more than once. That is because the counter definition \newcounter{ctra} is contained within the \newcommand{\mulspc}. Rather define the counter outside the macro definition. Another drawback is that the space offered by \mulspc{0} should be non-existent, which it is not, even if you add % to remove the unwanted spaces. For example, the code:

\documentclass{article}
\usepackage{xifthen}
\newcounter{ctra}%
\newcommand{\mulspc}[1]{
\setcounter{ctra}{0}%
\whiledo {\value{ctra} < #1}%
{\hspace*{2mm}\stepcounter{ctra}}%
}
\begin{document}

\fbox{\mulspc{0}}% Zero spaces

\fbox{}% Empty \fbox

\fbox{\mulspc{1}} % One space

\fbox{\mulspc{3}} % Produces exactly 3 spaces

\end{document}


produces:

To get rid of this spacing, you could use a condition on the parameter passed to \mulspc:

\newcommand{\mulspc}[1]{
\ifthenelse{#1>0}{%
\setcounter{ctra}{0}%
\whiledo {\value{ctra} < #1}%
{\hspace*{2mm}\stepcounter{ctra}}%
}{\unskip}%
}


providing \unskip if there is a parameter passed with value less than 1. This produces:

Another alternative would be to use the easy interface of the multido package, and define (say)

\usepackage{multido}% A loop facility for Generic TeX
...
\newcommand{\Mulspc}[1]{%
\multido{\iA=0+1}{#1}{\hspace*{2mm}}%
}


that you can use in a similar way, and is a little cleaner code-wise.

-
That is not because of indentation. Even if you start every line from the first column, a space is still added because of the newline. –  Tsuyoshi Ito Aug 10 '11 at 20:43
\newcommand\mulspc[1]{\hspace*{#1\dimexpr2mm}}