按照控制序列定义控制序列

按照控制序列定义控制序列

我想使用组合控制序列名称设置用于更改控制序列的别名。以下是示例。

\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 }

相关内容