Variable-name \newcommand with parameters within another \newcommand
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}%
\expandafter\newcommand\csname #1\endcsname[1]{\expandafter\renewcommand\csname iitthesis@#1\endcsname{##1}}%
}
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.
\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".