The way to think of this is that `##`

gets replaced by `#`

in just the
same way that `#1`

gets replaced by ‘whatever is the first argument’.

So if you define a macro:

\newcommand\a[1]{+#1+#1+#1+}

or (using the TeX primitive `\`

`def`

):

\def\a#1{+#1+#1+#1+}

and use it as `\`

`a{b}`

,
the macro expansion produces ‘+b+b+b+’,
as most people would expect.

However, if we now replace part of the macro:

\newcommand\a[1]{+#1+\newcommand\x[1]{xxx#1}}

then `\`

`a{b}`

will give us the rather odd

+b+`\`

`newcommand{x}[1]`

{xxxb}

so that the new `\`

`x`

ignores its argument.

If we use the TeX primitive:

\def\a#1{+#1+\def\x #1{xxx#1}}

`\`

`a{b}`

will expand to ‘+b+`\def\x b{xxxb}`

’. This
defines `\`

`x`

to be a macro *delimited* by `b`

, and taking no
arguments, which is surely not what was intended!

Actually, to define `\`

`x`

to take an argument, we need

\newcommand\a[1]{+#1+\newcommand\x[1]{xxx##1}}

or, using the TeX primitive definition:

\def\a#1{+#1+\def\x ##1{xxx##1}}

and `\`

`a{b}`

will expand to

```
+b+
````\def\x #1{xxx#1}`

because `#1`

gets replaced by ‘b’
and `##`

gets replaced by `#`

.

To nest a definition inside a definition inside a definition then you
need `####1`

, doubling the number of `#`

signs; and at the next level
you need 8 `#`

s each time, and so on.

This question on the Web: http://www.tex.ac.uk/cgi-bin/texfaq2html?label=hash