在我付出努力之前,有没有人定义过\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 ...\endcsname
N
c
\cs_set_eq:cc {foo} {bar}
\cs_new_eq:cc {foo} {bar}
答案2
抱歉我迟到了。:-)
我可以提供一个#{
基于语法的宏来创建,例如来自字符标记序列的\CsNameToCsToken
控制字标记或来自字符标记序列的控制字标记。\Foo
Foo
\Bar
Bar
句法:
\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}
锻炼。