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}}