

\newcommand{\defsilly}[1]{%
% define a command named silly#1 , taking a single parameter
}
\defsilly{willy}
\sillywilly{theparameter}


Motivation: I'm writing a thesis document class, which has a bunch of the following kind of command pairs:

\newcommand{\iitthesis@authorEnglish}{Name of Author}


I want to replace each of these pairs with something like:

\iitthesis@thesisdatafield{authorEnglish}{Name of Author}


This defines both the above commands.


\newcommand{\iitthesis@thesisdatafield}[2]{%
\@namedef{iitthesis@#1}{#2}}


With

\iitthesis@thesisdatafield{authorEnglish}{Name of Author}


you'd define \iitthesis@authorEnglish to expand to "Name of Author", that is, you'd have issued the equivalent of

\def\iitthesis@authorEnglish{Name of Author}


This wouldn't check for the defined command to be previously undefined. If you want also this check, do

\newcommand{\iitthesis@thesisdatafield}[2]{%
\expandafter\@ifdefinable\csname iitthesis@#1\endcsname
{\@namedef{iitthesis@#1}{#2}}}


but for internal commands this isn't usually done.

In your motivation I don't see any need of defining the new command with an argument. If you need also to define a user level command, you can do with the same technique:

\newcommand{\iitthesis@thesisdatafield}[1]{%
\long\@namedef{#1}##1{\@namedef{iitthesis@#1}{##1}}}


In this case saying

\iitthesis@thesisdatafield{authorEnglish}


would define the command \authorEnglish so that if the user types

\authorEnglish{A. U. Thor}


the effect would be as if doing

\def\iitthesis@authorEnglish{A. U. Thor}


The \long prefix to \@namedef causes \long\def to be executed, so the argument can span one or more paragraphs.

This technique is employed by the LaTeX kernel, where \author{A. U. Thor} actually defines \@author expanding eventually to "A. U. Thor".

• You might want to mention the makeatletter...\makeatother issue and add it around the code. – Peter Grill Nov 13 '11 at 17:29
• @PeterGrill The OP is quite clear about doing this in a class file, where @ is a letter. – egreg Nov 13 '11 at 17:30

As in the other question, you need to use \csname .. \endcsname to build the macro name and \expandafter to expand it to that name before you are using \newcommand (or similar) to define that macro. Simply append the optional parameter argument after \endcsname.

\newcommand{\iitthesis@thesisdatafield}[2]{%
\expandafter\newcommand\csname iitthesis@#1\endcsname{#2}%
}


Note that you need to double the # for the argument in the inner macro, so that it is clear it isn't the first argument of the outer one.

There is the \@namedef{<name>}<parameter text>{<macro code>} macro which does basically the same, but using the TeX primitive \def, not LaTeX's \newcommand. The basic difference is that it doesn't check if the macro exists yet and defines it in any case and that you have to list the parameters in plain form: #1 instead of [1], #1#2 instead of [2] etc.

• You might want to mention the makeatletter...\makeatother issue and add it around the code. – Peter Grill Nov 13 '11 at 17:28
• @PeterGrill: The OP stated the code is for a class, so this is not required. – Martin Scharrer Nov 13 '11 at 17:32