It allows using arguments in nested macro definitions.
In
\def\a#1{\def\b#1{...}}
the macro \b would not have an argument, since #1 belongs to \a and would be replaced by its argument.
However,
\def\a#1{\def\b##1{...}}
defines \b with an argument. During expansion
#1 will be replaced by a parameter
## becomes #
Then \b can use #1 instead of the original ##1.
It follows, that for each level of nesting you need to double the number of # characters:
\def\a#1{\def\b##1{\def\c####1{...}}}
Example:
\documentclass{article}
\def\a#1{\def\b##1{#1 ##1}}
\begin{document}
\a{x} % consequence: \def\b#1{x #1}
\b{y} % prints: x y
\end{document}
In LaTeX syntax this would be:
\newcommand{\a}[1]{%
\newcommand{\b}[1]{#1 ##1}}
or, as \a and \b are already defined, which you would see if you would try it in the small example,
\renewcommand{\a}[1]{%
\renewcommand{\b}[1]{#1 ##1}}
#,##,####etc., rather than adding a hash sign for each level, i.e.#,##,###etc.? – MickG Aug 11 '14 at 13:56##is replaced by#just as#1is replaced by the first argument, and multiple doubling is just a consequence of that. – David Carlisle Aug 11 '14 at 15:17\documentclass{article}\def\a#1{\def\b##1{#1 ##1}}\begin{document}\b{y}\end{document}and I got something like and \underbar{y}: any reason why? – pluton Mar 16 '15 at 01:20\a{…}so the built-in\bwas used. Try\documentclass{article}\begin{document}\b{y}\end{document}to see that\b{y}has this\underbar{y}behaviour by default. – Suzanne Soy Jul 20 '17 at 08:23