命令 \csname 用于什么?

命令 \csname 用于什么?

也许这是一个愚蠢的问题...但我经常在代码中看到它的用法\csname——尤其是在包中。有人能解释一下它的用途吗?

据我所知,它会根据一个参数生成一个新命令。

答案1

引用 TeXbook 第 213 页 [第 20 章“定义 (也称为宏)”的一部分]:

\csname ... \endcsname。TeX 扩展时\csname会读取匹配的\endcsname,并在进行时扩展标记;扩展完成后,只应保留字符标记。然后,整个\csname ... \endcsname文本的“扩展”将是一个控制序列标记,其定义为类似于\relax其含义当前未定义。

从这个定义中我们可以得出以下几点:

  • 而“普通”的 TeX 宏名必须由以下任一内容组成:恰好一个非字母字符——例如,,,\,\!——\/一个或多个字母(更准确地说,类别代码为“字母”(11)的字符,通常是A-Za-z)——例如,\relax\kern——该\csname ... \endcsname方法允许您创建可以包含字符的宏名称——包括空格和(孤立的)反斜杠字符——这些字符不受 TeX 语法规则的允许。

  • 该方法使用的主要限制是,和\csname ... \endcsname之间的内容必须可扩展才能产生“字符标记”。因此,不可扩展的标记(例如 TeX“原始”控制序列标记,例如和)是\csname\endcsname\kern\vcenter不允许

此方法有很多用途。

答案2

第 11.6 条TeX 按主题分类包含以下内容:

使用\csname它可以构造通常无法写入的控制序列,因为组成字符标记可能属于除 11 个字母之外的其他类别。

一个简单的例子(同样来自 TeX by Topic)是

\csname a b\endcsname

还有许多其他应用;经常\csname\endcsname用于宏的自动构建。

答案3

\cs仅仅是一个用于在包手册中记录命令的命令。它用于:

  • 更改拼写错误
  • 索引命令
  • 自动添加反斜杠

如果您想动态创建命令,您应该使用:

  • \csname endcsname一对 : \expandfter\def\csname toto\endcsname{content}。这将创建一个\toto命令。
  • 或者更简单,使用包\csdef的命令etoolbox\csdef{toto}{content}

相关内容