如何定义一个定义具有默认值的宏的命令

如何定义一个定义具有默认值的宏的命令

我必须定义许多具有一些默认值的文本变量。

我按照下面的方法做:

\def\name#1{\gdef\@name{#1}}%
\name{Alex}

我尝试过自动化这个过程,但没有成功

\newcommand{\DefineAndSet}[2]{%
    \def\csname #1\endcsname ##1{\gdef\@\csname #1\endcsname{##1}}%
    \csname #1\endcsname{#2}
}

我的 MNWE:

\documentclass{article}


\newcommand{\DefineAndSet}[2]{%
    \def\csname #1\endcsname ##1{\gdef\@\csname #1\endcsname{##1}}%
    \csname #1\endcsname{#2}
}

\begin{document}
    
    \DefineAndSet{name}{Alex}
    
    \name
    
\end{document}

答案1

您的代码中存在几个错误:您需要使用\csnamebefore构建符号标记\def\gdef查看它。并且@应该放在里面\csname

\newcommand{\DefineAndSet}[2]{%
    \expandafter\def\csname #1\endcsname ##1{\expandafter\gdef\csname @#1\endcsname{##1}}%
    \csname #1\endcsname{#2}%
}

另一方面,我认为没有必要执行该\@name命令。

\newcommand{\DefineAndSet}[2]{%
  \expandafter\gdef\csname #1\endcsname{#2}%
  #2%
}

会满足您的需要。但是有一个问题:您没有检查\name(或从 的第一个参数生成的任何内容\DefineAndSet)是否已经定义。这可以通过以下方法克服

\makeatletter
\newcommand{\DefineAndSet}[2]{%
  \@ifdefinable{#1}{\gdef#1{#2}}#2%
}
\makeatother

简单地称为

\DefineAndSet{\name}{Alex}

相关内容