93

I've seen sometimes that people use a double pound sign (##) when defining/using arguments.

What is the difference between the normal argument, #1, and the double sign one, ##1? Are there any restrictions for its use? Can you list the good practices, if any, for this type of arguments.

percusse
  • 157,807
adn
  • 11,233

1 Answers1

97

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}}
Stefan Kottwitz
  • 231,401
  • 6
    Why does one need to double each time, i.e. #, ##, #### etc., rather than adding a hash sign for each level, i.e. #, ##, ### etc.? – MickG Aug 11 '14 at 13:56
  • 5
    @MickG two possible answers, 1 that's just the way it is or 2 because ## is replaced by # just as #1 is replaced by the first argument, and multiple doubling is just a consequence of that. – David Carlisle Aug 11 '14 at 15:17
  • I just compiled \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
  • @pluton you didn't call \a{…} so the built-in \b was 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
  • 1
    In other words, nesting 64 deep will create an absolute desaster. I wonder if Saint Knuth has thought about that. – Reinhard Neuwirth Jun 21 '21 at 10:16