我想使用组合控制序列名称设置用于更改控制序列的别名。以下是示例。
\documentclass{standalone}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new:Npn \name { some~text }
\cs_new:Npn \cmnd { command }
% \cs_new:cpx { \cmnd alias } { \exp_not:c { name } }
% The above works, but having a \cs_new:cpc
% would be even more concise. Let's try:
\cs_generate_variant:Nn \cs_new:Npn { cpc }
\cs_new:cpc { \cmnd alias } { } { name }
\ExplSyntaxOff
\begin{document}
\commandalias
\end{document}
不幸的是,我找不到生成\cs_new:cpc
表示参数的第二个参数的正确语法。
是否有可能定义一个\cs_new:cpc
变体?
答案1
首先,c
变体始终是类型参数的变体,N
因此\cs_new:cpc
隐含地表明存在宏\cs_new:NpN
。所以这实际上没有意义。让我们看看它失败的地方:
如果你
\cs_generate_variant:Nn \cs_new:Npn {cpc}
并使用
\cs_new:cpc {foo} {bar}
那么宏将永远看不到它需要看到的左括号,因为该调用相当于
\cs_new:Npn \foo \bar
您可以验证这一点:
\cs_new:cpc {foo} #1 {bar} {baz} % \cs_new:Npn \foo #1 \bar {baz}
\show \foo
节目
> \foo=\long macro:
#1\bar ->baz.
我建议一个不同的解决方案:
\cs_new_protected:Npn \xzs_define_alias:NN #1#2
{ \cs_new:Npn #1 { #2 } }
\cs_generate_variant:Nn \xzs_define_alias:NN {cc}
然后使用
\xzs_define_alias:cc { \cmnd alias } { name }
答案2
这不符合该\cs_new:...
计划。
你可以自由定义自己的函数:
\cs_new_protected:Nn \xzs_make_alias:NN
{
\cs_new:Npn #1 { #2 }
}
\cs_generate_variant:Nn \xzs_make_alias:NN { cN, Nc, cc }
之后
\cs_new:Npn \name { Name }
\xzs_make_alias:cc { alias } { name }
定义\alias
为扩展为\name
;实际上,\cs_show:N \alias
给出
> \alias=\long macro:->\name .
但为了你自己,不叫这个\cs_new:NN
。绝不在您的函数中使用团队保留的前缀(生成变体时除外,但情况并非如此)。
答案3
正如 clemens 所指出的,c
必须是N
类型参数的变体。因此,问题在于不存在类似的东西\cs_new:NN
。但可以很容易地做到这一点。从那里,可以生成请求的变体。
\cs_new:Nn \@@_cs_new:NN {\cs_new:Npn #1 { #2 } }
\cs_generate_variant:Nn \@@_cs_new:NN { cc }