\cs_new:nn 或 \@namelet

\cs_new:nn 或 \@namelet

在我付出努力之前,有没有人定义过\cs_new:nn\@namelet基本思想是我想写

\@namelet{foo}{bar}

或者

\cs_new:nn {foo} {bar}

并使其相当于

\let\foo = \bar

我知道该怎么做,但如果可以避免的话我宁愿不输入它。

答案1

在 中expl3, 相当于\let(定义新内容时)。此外,在将参数用作类型参数之前应用于\cs_set_eq:NN该参数是用 指定的,因此当对两个参数执行此操作时,最终会得到(或)\cs_new_eq:NN\csname ...\endcsnameNc\cs_set_eq:cc {foo} {bar}\cs_new_eq:cc {foo} {bar}

答案2

抱歉我迟到了。:-)

我可以提供一个#{基于语法的宏来创建,例如来自字符标记序列的\CsNameToCsToken控制字标记或来自字符标记序列的控制字标记。\FooFoo\BarBar

句法:

\CsNameToCsToken⟨stuff not in braces⟩{⟨NameOfCs⟩}

⟨stuff not in braces⟩\NameOfCs

⟨stuff not in braces⟩可能为空。)

(由于\romannumeral-扩展,结果是通过触发两个扩展步骤获得的,例如,通过用 进行两次“命中” \expandafter。)

使用这样的宏,您就不会受到特定定义命令的约束:

\CsNameToCsToken{Foo}\Foo  。

\CsNameToCsToken\newcommand{Foo}\newcommand\Foo  。

\CsNameToCsToken\DeclareRobustCommand{Foo}\DeclareRobustCommand\Foo  。

\CsNameToCsToken\global\long\outer\def{Foo}\global\long\outer\def\Foo  。

\CsNameToCsToken\expandafter{Foo}\Bar\expandafter\Foo\Bar  。

\CsNameToCsToken\let{Foo}=\Bar\let\Foo=\Bar  。

\CsNameToCsToken\CsNameToCsToken\let{Foo}={Bar}\CsNameToCsToken\let\Foo={Bar}\let\Foo=\Bar  。

\CsNameToCsToken\string{Foo}\string\Foo  。

\CsNameToCsToken\meaning{Foo}\meaning\Foo  。

\CsNameToCsToken\NewDocumentCommand{Foo}...\NewDocumentCommand\Foo...  。

 

您可以定义,如果愿意的话,\@namelet可以在参数之间使用,就而言。=\CsNameToCsToken

 

\documentclass{article}

\makeatletter
\@ifdefinable\UD@stopromannumeral{\chardef\UD@stopromannumeral=`\^^00}%
%%===============================================================================
%% Obtain control sequence token from name of control sequence token:
%%===============================================================================
%% \CsNameToCsToken<stuff not in braces>{NameOfCs}
%% ->  <stuff not in braces>\NameOfCs
%% (<stuff not in braces> may be empty.)
\@ifdefinable\CsNameToCsToken{%
  \long\def\CsNameToCsToken#1#{\romannumeral\InnerCsNameToCsToken{#1}}%
}%
\newcommand\InnerCsNameToCsToken[2]{%
  \expandafter\UD@exchange\expandafter{\csname#2\endcsname}{\UD@stopromannumeral#1}%
}%
\newcommand\UD@exchange[2]{#2#1}%
%%===============================================================================
%% \@namelet
%%===============================================================================
\newcommand\@namelet{\CsNameToCsToken\CsNameToCsToken\let}
%\makeatother

\begin{document}

\newcommand\Bar{This is Bar.}

\@namelet{Foo}{Bar}%
\message{^^J\string\Foo\space yields: \Foo^^J}

\@namelet{Foob}={Bar}%
\message{^^J\string\Foob\space yields: \Foob^^J}

\begingroup
\renewcommand\Bar{This is redefined Bar.}

\global\@namelet{Fooc}{Bar}%

\global\@namelet{Food}={Bar}%
\endgroup

\message{^^J\string\Fooc\space yields: \Fooc^^J}

\message{^^J\string\Food\space yields: \Food^^J}

\end{document}

终端上的消息:

\Foo yields: This is Bar.

\Foob yields: This is Bar.

\Fooc yields: This is redefined Bar.

\Food yields: This is redefined Bar.

陷阱/警告:

然而,即使所讨论的控制序列的名称仅由单个标记组成,也必须用花括号括起来。

例如,

\@namelet ab并且\@namelet a=b不锻炼,同时
\@namelet {a}{b}并且\@namelet {a}={b}锻炼。

相关内容