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:

snippet.latex
\newcommand\a[1]{+#1+#1+#1+}

or (using the TeX primitive \def):

snippet.latex
\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:

snippet.latex
\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:

snippet.latex
\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

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

or, using the TeX primitive definition:

snippet.latex
\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 website uses cookies for visitor traffic analysis. By using the website, you agree with storing the cookies on your computer.More information

Creative Commons Lizenzvertrag Edit this page Old revisions Sitemap Backlinks RSS feed Impressum Flattr this