[Tex/LaTex] How to define a macro to create a new macro with a name passed as its argument

macros

I want to define a macro \create that accept a single mandatory argument from which another new macro is created and named.

The following code snippet may speak clearer what I want to achieve. But the following code cannot be compiled because it is wrong. 🙂

\documentclass{article}

\newcommand\create[1]{%
\newcommand\#1{My name is #1}}

\begin{document}
\create{test}
\test
\end{document}

How to define a macro to create a new macro with a name passed as its argument?

Best Answer

Use \csname #1\endcsname which must be expanded before \newcommand using \expandafter:

\newcommand\create[1]{%
\expandafter\newcommand\csname #1\endcsname{My name is #1}}
% usage: \create{foobar}

If you want to pass the macro as control sequence instead, i.e. \foobar instead of foobar then you need to turn it into a string and remove the backslash:

\makeatletter
\newcommand\create[1]{%
\expandafter\newcommand\csname\expandafter\@gobble\string#1\endcsname{My name is #1}}
\makeatother
% usage: \create{\foobar}

There is also the \@namedef macro which is defined as \expandafter\def\csname #1\endcsname, so you can use it as:

\newcommand\create[1]{\@namedef{My name is #1}}

The etoolbox package also provides a basically identical, but robust macro called \csdef. For both you can provide a parameter text, e.g. for arguments direct after the name argument: \csdef{name}#1#2{some code with two arguments #1 and #2} (the # have to be doubled inside another macro).

Related Question