Welcome to the UK List of
TeX Frequently Asked Questions
on the Web

Searching

The index of Frequently Asked Questions about TeX is searchable.

Please enter your keyword here:   then press here: ,    or:
Google

Defining macros within macros

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.


Go to previous question, or next question

Go to FAQ home.

URL for this question: http://www.tex.ac.uk/cgi-bin/texfaq2html?label=hash

Comments, suggestions, or error reports? - see “how to improve the FAQ”.

This is FAQ version 3.28, released on 2014-06-10.